【Spring集成MyBatis】核心配置文件

文章目錄

  • 1. typeHandlers標簽
  • 2. plugins標簽
    • 通過PageHelper的API獲取分頁的信息

1. typeHandlers標簽

可以重寫類型處理器,或創建類型處理器來處理不支持/非標準的類型。選擇性地將它映射到一個JDBC類型:如Java中的Date類型,將其存放到數據庫時存成一個1970年至今的毫秒數,取出來的時候轉換成java的Date,即java的Date與數據庫的varchar毫秒值之間的轉換.具體做法是:

  1. 實現org.apache.ibatis.type.TypeHandler接口,或繼承很便利的類org.apache.ibatis.type.BaseTypeHandler
  2. 覆蓋4個未實現的方法。setNonNullParameter為java程序設置數據到數據庫的回調方法,getNullableResult為查詢時mysql的字符串類型轉換成java的Type類型的方法
  3. 在MyBatis核心配置文件中注冊
  4. 測試轉換是否正確

在數據庫的user表中新建一個字段birthday,類型選擇bigint
在這里插入圖片描述
寫一個插入語句,在XML文件和Java文件中:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserMapper"><insert id="save" parameterType="user">insert into user values(#{id}, #{username}, #{password}, #{birthday})</insert></mapper>
package com.example.demo.dao;import com.example.demo.domain.User;public interface UserMapper {void save(User user);}

User類中定義一個birthday屬性,更新其Set、Get方法,更新toString方法:

package com.example.demo.domain;import java.util.Date;public class User {int id;String username;String password;Date birthday;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", birthday=" + birthday +'}';}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

寫測試代碼:

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//        新建userUser user = new User();user.setUsername("yang");user.setPassword("12345");user.setBirthday(new Date());//        執行保存操作userMapper.save(user);sqlSession.commit();}
}

但是這時候會報錯Data truncated for column 'birthday',則我們就需要
第一步:定義類型處理器,覆蓋方法

package com.example.demo.handler;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;public class DateHandler extends BaseTypeHandler<Date> {
//    將java類型 轉換成 數據庫需要的類型@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {long time = date.getTime();preparedStatement.setLong(i, time);;}//    將數據庫中類型 轉換成 java類型
//    String參數:要轉換的字段名稱
//    ResultSet,查詢結果集@Overridepublic Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
//        獲取結果集中需要的數據(long)并轉換成Date類型返回long slong = resultSet.getLong(s);Date date = new java.sql.Date(slong);return date;}//    將數據庫中類型 轉換成 java類型@Overridepublic Date getNullableResult(ResultSet resultSet, int i) throws SQLException {long slong = resultSet.getLong(i);Date date = new java.sql.Date(slong);return date;}//    將數據庫中類型 轉換成 java類型@Overridepublic Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {Long along = callableStatement.getLong(i);Date date = new java.sql.Date(along);return date;}
}

第二步:在SqlMapConfig中使用<typeHandlers>注冊類型處理器
其中handler中寫的是類名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 通過properties標簽加載外部properties文件 --><properties resource="jdbc.properties"></properties><!-- 自定義別名 --><typeAliases><typeAlias type="com.example.demo.domain.User" alias="user"></typeAlias></typeAliases><!-- 注冊類型處理器 --><typeHandlers><typeHandler handler="com.example.demo.handler.DateHandler"></typeHandler></typeHandlers><!-- 數據源環境 --><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加載映射文件 --><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers></configuration>

第三步:插入和查詢測試
插入測試代碼:

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//        新建userUser user = new User();user.setUsername("yang");user.setPassword("12345");user.setBirthday(new Date());//        執行保存操作userMapper.save(user);sqlSession.commit();sqlSession.close();}
}

可以看到已經成功保存了:
在這里插入圖片描述
執行查詢測試:

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//        查詢User user = userMapper.findById(2);System.out.println(user.getBirthday());sqlSession.commit();sqlSession.close();}
}

也可以成功查詢:
在這里插入圖片描述

2. plugins標簽

MyBatis可以使用第三方的插件來對功能進行拓展,分頁助手PageHelper是將分頁的復雜操作進行封裝,使用簡單的方式即可獲得分頁相關數據。操作步驟如下:

  1. 導入通用PageHelper坐標
  2. 在MyBatis核心配置文件中配置PageHelper插件
  3. 測試分頁數據獲取

第一步:導入坐標

<!--        分頁助手--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</version></dependency>
<!--        解析--><dependency><groupId>com.github.jsqlparser </groupId><artifactId>jsqlparser </artifactId><version>4.6</version></dependency></dependencies>

第二步:配置插件
需要注意的是,<plugins>應該在typeHandlers的后面、<environmnets>的前面,根據給的提示來放置

<!-- 配置分頁助手插件 -->
<plugins><plugin interceptor="com.github.pagehelper.PageHelper"><property name="dialect" value="mysql"/></plugin>
</plugins>

注:PageHelper的5.0以上的版本應該寫:

<!-- 配置分頁助手插件 -->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

第三步:測試分頁數據獲取
寫一個查詢所有用戶的方法:
配置文件:

<select id="findAll" resultType="user">select * from user
</select>

接口:

List<User> findAll();

測試:

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.findAll();for (User user: userList){System.out.println(user);}sqlSession.commit();sqlSession.close();}
}

在配置了分頁相關的插件后,只需要簡單地設置一下分頁的相關參數,其中第一個參數pageNum為當前頁,第二個參數pageSize為每頁顯示的條數:

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//        設置分頁相關參數,當前頁,及每頁顯示的條數PageHelper.startPage(1, 2);List<User> userList = userMapper.findAll();for (User user: userList){System.out.println(user);}sqlSession.commit();sqlSession.close();}
}

數據庫中一共三條數據:
在這里插入圖片描述

當參數為(1,2)時,結果為:
在這里插入圖片描述

當參數為(2,2)時,結果為:
在這里插入圖片描述

通過PageHelper的API獲取分頁的信息

雖然能夠分頁了,但是我們還可以通過API獲取一些分頁的信息,這樣子在寫網頁的時候就可以通過這些信息來判斷是否顯示“上一頁”、“下一頁”、“首頁”、“尾頁”按鈕
當前頁數:pageInfo.getPageNum()
每頁顯示條數:pageInfo.getPageSize()
總條數:pageInfo.getTotal()
總頁數:pageInfo.getPages()
上一頁:pageInfo.getPrePage()
下一頁:pageinfo.getNextPgae()
是否是第一個(bool):pageInfo.isIsFirstPage()
是否是最后一個(bool):pageInfo.isIsLastPage()

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//        設置分頁相關參數,當前頁,及每頁顯示的條數PageHelper.startPage(1, 2);List<User> userList = userMapper.findAll();for (User user: userList){System.out.println(user);}//        獲得與分頁相關的參數PageInfo<User> pageInfo = new PageInfo<User>(userList);System.out.println("當前頁:" + pageInfo.getPageNum());System.out.println("每頁顯示條數:" + pageInfo.getPageSize());System.out.println("總條數:" + pageInfo.getTotal());System.out.println("總頁數:" + pageInfo.getPages());System.out.println("上一頁:" + pageInfo.getPrePage());System.out.println("下一頁:" + pageInfo.getNextPage());System.out.println("是否是第一個:" + pageInfo.isIsFirstPage());System.out.println("是否是最后一個:" + pageInfo.isIsLastPage());sqlSession.commit();sqlSession.close();}
}

結果如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166565.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166565.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166565.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker安裝以及idea訪問docker

其他目錄&#xff1a; docker 安裝環境&#xff08;有空更新&#xff09; url “” docker 打包java包&#xff0c;并運行&#xff08;有空更新&#xff09; url “” docker 打包vue &#xff08;有空更新&#xff09; url “” docker 多服務 &#xff08;有空更新&#xff…

2023年亞太杯數學建模A題水果采摘機器人的圖像識別功能(matlab 部分代碼)

對于1-4問針對的是附錄1 中的數據 clc; close all; clear; % 圖像文件夾路徑 folder_path E:/新建文件夾/yatai/Attachment/Attachment 1/; % 圖像文件列表 image_files dir(fullfile(folder_path, *.jpg)); % 假設所有圖片都是jpg格式% 解析文件名中的數字&#xff0c;并轉…

機器學習探索計劃——數據集劃分

文章目錄 導包手寫數據劃分函數使用sklearn內置的劃分數據函數stratifyy理解舉例 導包 import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_blobs手寫數據劃分函數 x, y make_blobs(n_samples 300,n_features 2,centers 3,clus…

Java設計模式系列:單例設計模式

Java設計模式系列&#xff1a;單例設計模式 介紹 所謂類的單例設計模式&#xff0c;就是采取一定的方法保證在整個的軟件系統中&#xff0c;對某個類只能存在一個對象實例&#xff0c;并且該類只提供一個取得其對象實例的方法&#xff08;靜態方法&#xff09; 比如 Hiberna…

循環隊列的幾種實現方式

基于數組來實現循環隊列的幾種方式 使用 usedSize使用 標志位空出一個位置 方式一 usedSize 0 是則表示當前數組為空 usedSize 數組的長度 則表示當前數組滿了方式二 使用一個標記 flag 來判斷當前隊列是空還是滿 如果 flag false 則說明隊列為空 如果 flag true 則說…

leetcode:495. 提莫攻擊

一、題目 鏈接&#xff1a;495. 提莫攻擊 - 力扣&#xff08;LeetCode&#xff09; 函數原型&#xff1a;int findPoisonedDuration(int* timeSeries, int timeSeriesSize, int duration) 二、思路 遍歷數組timeSeries&#xff0c;如果 元素值duration < 下一元素值 &#x…

GO語言實現txt文本多行合并為一行

windows系統txt文件 input.txt多行合并為一行 package mainimport ("fmt""io/ioutil""strings" )func main() {content, err : ioutil.ReadFile("E:\\gin_demo\\demo30DNF\\youhua\\input.txt")if err ! nil {fmt.Println("Err…

OpenCV快速入門:圖像分析——傅里葉變換、積分圖像

文章目錄 前言一、傅里葉變換1.1 離散傅里葉變換1.1.1 離散傅里葉變換原理1.1.2 離散傅里葉變換公式1.1.3 代碼實現1.1.4 cv2.dft 函數解析 1.2 傅里葉變換進行卷積1.2.1 傅里葉變換卷積原理1.2.2 傅里葉變換卷積公式1.2.3 代碼實現1.2.4 cv2.mulSpectrums 函數解析 1.3 離散余…

基于深度學習的文本分類

通過構建更復雜的深度學習模型可以提高分類的準確性&#xff0c;即分別基于TextCNN、TextRNN和TextRCNN三種算法實現中文文本分類。 項目地址&#xff1a;zz-zik/NLP-Application-and-Practice: 本項目將《自然語言處理與應用實戰》原書中代碼進行了實現&#xff0c;并在此基礎…

Unity使用DOTween實現分段進度條

文章目錄 需求下載安裝 DOTween實現實現效果 需求 用組件進度條&#xff08;Slider&#xff09;&#xff0c;利用分段加載進行以假亂真的進度效果&#xff0c;比如說2秒鐘到達20%的進度&#xff0c;10秒鐘加載20%到50%進度&#xff0c;1分鐘加載50%到90%的進度&#xff0c;30秒…

2023年金融信創行業研究報告

第一章 行業概況 1.1 定義 金融信創是指在金融行業中應用的信息技術&#xff0c;特別是那些涉及到金融IT基礎設施、基礎軟件、應用軟件和信息安全等方面的技術和產品。這一概念源于更廣泛的“信創 (信息技術應用創新)”&#xff0c;即通過中國國產信息技術替換海外信息技術&a…

77 組合問題

給定兩個整數 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 個數的組合。 class Solution { private: vector<vector<int>> result; // 存放符合條件結果的集合 vector<int> path; // 用來存放符合條件結果 void backtracking(int n, int k , int st…

測試在 Oracle 下直接 rm dbf 數據文件并重啟數據庫

創建一個新的表空間并創建新的用戶&#xff0c;指定新表空間為新用戶的默認表空間 create tablespace zzw datafile /oradata/cesdb/zzw01.dbf size 10m;zzw用戶已經創建過&#xff0c;這里修改其默認表空間 alter user zzw quota unlimited on zzw; alter user zzw default …

ELK企業級日志分析平臺——logstash

部署 新建一臺虛擬機elk4部署logstash [rootelk4 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm[rootelk4 ~]# yum install -y logstash-7.6.1.rpm 命令方式 [rootelk4 bin]# /usr/share/logstash/bin/logstash -e input { stdin { } } output { stdout {} } elasticsearc…

使用骨傳導耳機會傷耳朵嗎?一文讀懂骨傳導耳機有哪些優點

首先說明&#xff0c;如果是正確的使用骨傳導耳機是不會傷耳朵。 一、骨傳導耳機的傳聲原理是什么&#xff1f; 聲音的傳播需要介質&#xff0c;傳統的耳機是通過空氣來進行傳播&#xff0c;也被稱為“空氣傳導耳機”&#xff0c;而骨傳導耳機最大的特別之處就在于&#xff0…

AcWing 3384:二叉樹遍歷(依先序序列建樹,輸出中序序列) ← DFS

【題目來源】https://www.acwing.com/problem/content/3387/【題目描述】 編寫一個程序&#xff0c;讀入用戶輸入的一串先序遍歷字符串&#xff0c;根據此字符串建立一個二叉樹&#xff08;以指針方式存儲&#xff09;。 例如如下的先序遍歷字符串&#xff1a;abc##de#g##f###&…

錄像機IP地址設置教程:輕松掌握網絡連接方法

隨著科技的發展&#xff0c;現在的錄像機都具備了網絡連接的功能&#xff0c;可以通過設置IP地址實現遠程和監控。但是很多人對于錄像機IP地址的設置方法感到困惑。虎觀代理小二二將在本文詳細介紹錄像機IP地址的設置步驟&#xff0c;幫助您輕松掌握網絡連接方法。 首先&#x…

DFS序和歐拉序的降維打擊

1. DFS 序和時間戳 1.1 DFS 序 定義&#xff1a;樹的每一個節點在深度優先遍歷中進、出棧的時間序列。 如下樹的 dfs 序就是[1,2,8,8,5,5,2,4,3,9,9,3,6,6,4,7,7,1]。 下圖為生成DFS的過程。對于一棵樹進行DFS序&#xff0c;除了進入當前節點時對此節點進行記錄&#xff0c;…

多線程Thread(初階二:Thread類及常??法)

目錄 一、Thread 的常?構造?法 繼承Thread代碼&#xff1a; 實現Runnable接口代碼: 二、Thread 的?個常?屬性 1、id&#xff1a; 2、獲取線程的名字。 3、進程的狀態&#xff1a; 4、在java中設置的優先級&#xff0c; 5、是否后臺線程&#xff0c; 6、是否存活&a…

ubuntu22.04 arrch64版在線安裝node

腳本 #安裝node#下載node、npm國內鏡像&#xff08;推薦&#xff09;# 判斷是否安裝了nodeif type -p node; thenecho "node has been installed."elsemkdir -p /home/zenglg cd /home/zenglgwget https://registry.npmmirror.com/-/binary/node/v10.14.1/node-v10.…