MyBatis之自定义数据类型转换器
- 前言
- 实现步骤
- 1. 编写自定义类型转换器(Boolean到Int)
- 2. 将自定义转换器注册到MyBatis-config.xml配置文件
- 3. Mapper.xml文件中进行数据类型转换
- 4. 定义PeronMapper接口
- 编写测试类
- 1. 测试代码
- 2. 运行log
- 总结
前言
到这里我们已掌握了,使用MyBatis完成数据库的增删改查,在实际项目中,还会遇到其他的需求,例如,向数据库的表字段插入数据时,根据flg的值,true的时候,插入1,false时,插入0,当然使用Java也能轻松实现,我们看看使用MyBatis是怎么实现的呢,就要聊聊我们今天的主题,自定义数据类型转换器,环境的搭建可以参看我之前的文章,我们今天主要聊聊实现步骤。
实现步骤
1. 编写自定义类型转换器(Boolean到Int)
继承MyBatis为我们提供的BaseTypeHandler类,它是一个泛型的类,定义元数据的类型:Boolean,重写该类的4个方法,getNullableResult和setNonNullParameter,根据方法名,我们就能看出,get数据和set数据时的处理,在setNonNullParameter方法中完成我们的需求,根据flg的值,插入0或1,具体实现参看下边的代码。
package xxx.xxx.mapper.coverter;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;public class Boolean2IntConverter extends BaseTypeHandler<Boolean> {@Overridepublic Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getInt(columnName) == 1 ? true : false;}@Overridepublic Boolean getNullableResult(ResultSet rs, int columnName) throws SQLException {return rs.getInt(columnName) == 1 ? true : false;}@Overridepublic Boolean getNullableResult(CallableStatement cs, int columnName) throws SQLException {return cs.getInt(columnName) == 1 ? true : false;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType arg3) throws SQLException {if (parameter) {ps.setInt(i, 1);} else {ps.setInt(i, 0);}}}
2. 将自定义转换器注册到MyBatis-config.xml配置文件
编写完数据类型转化器,使用< typeHandlers>< typeHandler>标签,交给MyBatis管理,底层逻辑还是使用Java反射机制。
MyBatis-config.xml代码如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 读取外部数据库信息文件 --><properties resource="db.properties" /><!-- 设置JavaBean类型的参数别名 --><typeAliases><package name="xxx.xxx.pojo"/></typeAliases><!-- 自定义类型转换器 --><typeHandlers><typeHandler handler="xxx.xxx.mapper.coverter.Boolean2IntConverter" javaType="Boolean" jdbcType="INTEGER"/></typeHandlers><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${my.driver}"/><property name="url" value="${my.url}"/><property name="username" value="${my.username}"/><property name="password" value="${my.password}"/></dataSource></environment></environments><mappers><mapper resource="xxx/xxx/mapper/PersonMapper.xml"/></mappers>
</configuration>
3. Mapper.xml文件中进行数据类型转换
在需要转换的字段上,使用javaType和jdbcType,完成boolean类型转INTEGER类型,具体实现,参照下边的代码。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxx.xxx.entry.personMapper"><insert id="addPerson" parameterType="person">insert into person values(#{id}, #{name}, #{age}, #{sex, javaType=boolean, jdbcType=INTEGER})</insert></mapper>
4. 定义PeronMapper接口
这里就是单纯的定义Insert方法。
package xxx.xxx.mapper;import java.util.List;import xxx.xxx.pojo.Person;public interface PersonMapper {public int addPerson(Person person);}
编写测试类
1. 测试代码
具体实现参看下边的代码。
package xxx.xxx.test;import java.io.IOException;
import java.io.Reader;
import java.util.List;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 xxx.xxx.mapper.PersonMapper;
import xxx.xxx.pojo.Person;public class TestMyBatis {public static void main(String[] args) throws IOException {Person person = new Person(1, "zs", 23, true);System.err.println("登录前");queryPersonById(1);addPerson(person);System.err.println("登录后");queryPersonById(1);}public static void queryPersonById(int id) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLPerson person = personMapper.queryPersonById(1);System.err.println(person);}}public static void addPerson(Person person) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLint count = personMapper.addPerson(person);System.err.println("登陆件数:" + count);// 6.增删改的场合,完成数据提交session.commit();}}}
2. 运行log
通过下边的运行log可以看出,完成对Person表的增删改查
登录前
null
登陆件数:1
登录后
Person [id=1, name=zs, age=23,sex=true]
总结
到这里,我们就完成了MyBatis的Boolean类型转Int类型的自定义数据类型转换器的学习,大家可以动手试试其他的类型转换,欢迎留言交流,下篇见。