文章目錄
- 1. typeHandlers標簽
- 2. plugins標簽
- 通過PageHelper的API獲取分頁的信息
1. typeHandlers標簽
可以重寫類型處理器,或創建類型處理器來處理不支持/非標準的類型。選擇性地將它映射到一個JDBC類型:如Java中的Date
類型,將其存放到數據庫時存成一個1970年至今的毫秒數,取出來的時候轉換成java的Date
,即java的Date
與數據庫的varchar
毫秒值之間的轉換.具體做法是:
- 實現
org.apache.ibatis.type.TypeHandler
接口,或繼承很便利的類org.apache.ibatis.type.BaseTypeHandler
- 覆蓋4個未實現的方法。
setNonNullParameter
為java程序設置數據到數據庫的回調方法,getNullableResult
為查詢時mysql的字符串類型轉換成java的Type類型的方法 - 在MyBatis核心配置文件中注冊
- 測試轉換是否正確
在數據庫的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
是將分頁的復雜操作進行封裝,使用簡單的方式即可獲得分頁相關數據。操作步驟如下:
- 導入通用PageHelper坐標
- 在MyBatis核心配置文件中配置PageHelper插件
- 測試分頁數據獲取
第一步:導入坐標
<!-- 分頁助手--><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();}
}
結果如下: