类型转换器
在 MyBatis 框架中,类型转换器(Type Handler)是处理 Java 类型和 JDBC 类型之间转换的关键组件。它主要用于以下两个场景:
-
将Java对象设置到PreparedStatement参数:当执行SQL插入、更新或删除操作时,MyBatis需要将Java对象的属性值转换为JDBC能够识别的数据类型,并设置到PreparedStatement的相应参数位置。
-
例如,一个
String
类型的Java日期字符串需要通过DateTypeHandler
转换成数据库可以接受的java.sql.Date
格式。
-
-
从ResultSet获取数据并转换为Java对象:查询结果返回时,MyBatis从ResultSet读取数据,并根据映射配置将JDBC数据类型转换为相应的Java类型。
内置类型转换器和自定义类型转换器
自定义类型转换器实现方式:
- 实现 TypeHandler
- 继承 BaseTypeHandler
配置方式:
- 全局配置
- 局部配置
自定义类型转换器
- 实现 TypeHandler
- 继承 BaseTypeHandler
package com.wdzl.typehandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 性别类型转换
* String 男 ---- JDBC : int
* String -- int
* 男 ---- 1
* 女 ---- 2
* 实现 实现接口
*
* insert into book(name,author,price,com)values(?,?,?,?)
* pst.setXXX(1,value)
*/
public class SexTypeHanlder implements TypeHandler<String> {
/**
*
* @param preparedStatement
* @param i 占位符位置
* @param s 给占位符赋值的参数 “男”或女
* @param jdbcType
* @throws SQLException
*/
@Override
public void setParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
System.out.println(i+"=========setParameter======="+s);
if("男".equals(s)){
preparedStatement.setInt(i,1);
}else if("女".equals(s)){
preparedStatement.setInt(i,2);
}
}
/**
* select name,price form book
*
* rst.getString("price")
*
* @param resultSet
* @param s 列名
* @return
* @throws SQLException
*/
@Override
public String getResult(ResultSet resultSet, String s) throws SQLException {
int sex = resultSet.getInt(s);
if(sex == 1){
return "男";
}
return "女";
}
/**
* rst.getString(2)
* @param resultSet
* @param i 位置
* @return
* @throws SQLException
*/
@Override
public String getResult(ResultSet resultSet, int i) throws SQLException {
return null;
}
@Override
public String getResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}
局部配置
在映射文件中,配置映射
插入转换:
<insert id="save" parameterType="author"> insert into author(name,gender,birtday)values(#{name}, #{gender,typeHandler=com.wdzl.typehandler.GenderTypeHander}, #{birthday}) </insert>
查询转换:
<resultMap id="authorMap" type="author"> <result column="gender" property="gender" typeHandler="com.wdzl.typehandler.SexTypeHanlder"/> <result column="birtday" property="birthday"/> </resultMap> <select id="queryAll" resultMap="authorMap"> select name,gender,birtday from author </select>
全局配置
配置文件中添加自定义配置
<!--全局类型转换器 通过 javaType和jdbcType两者来匹配的。 --> <typeHandlers> <typeHandler handler="com.wdzl.typehandler.SexTypeHanlder" jdbcType="INTEGER" javaType="String"></typeHandler> </typeHandlers>
映射文件中
<!--1. 查询:javaType="String" jdbcType="INTEGER"-->
<result column="gender" property="gender" javaType="String" jdbcType="INTEGER" />
```
<!--2. 更新:update、insert-->
<insert id="save" parameterType="author">
insert into author(name,gender,birtday)values(#{name},
#{gender,javaType=String,jdbcType=INTEGER},#{birthday})
</insert>
分页插件
回顾自定义分页组件:
- 当前页号-----前端传过来(已知条件)
- 总记录数-----查出来,统计出来(通过SQL查询统计出来)
- 每页显示记录数------(自定义设置)
- 总页数-------(计算出来的,通过【总记录数/每页显示记录数】)
- 当前页显示记录------截取提取出来记录
-
添加依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency>
-
配置文件中,添加插件
<!--分页插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
-
使用
在查询之前,设置起始页和每页记录数即可
public void test(){
int pageno = 2;
int countPerPage = 3; //每页显示记录数
Page page = PageHelper.startPage(2,3);
// select count(bookname) from
page.setCountColumn("bookname");
SqlSession sqlSession = MyBatisUtil.getSession();
IBookDao mapper = sqlSession.getMapper(IBookDao.class);
List<Book> list = mapper.queryAll();
for (Book book : list) {
System.out.println(book);
}
System.out.println(page.getPageNum()); //当前页号
System.out.println(page.getPages()); // 总页数
System.out.println(page.getPageSize()); //
System.out.println(page.getTotal()); // 总记录数
System.out.println(page.getResult()); //当前页记录列表
MyBatisUtil.closeSession(sqlSession);
}