MyBatis之自定义数据类型转换器
前言
到这里我们已掌握了,使用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> {
@Override
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getInt(columnName) == 1 ? true : false;
}
@Override
public Boolean getNullableResult(ResultSet rs, int columnName) throws SQLException {
return rs.getInt(columnName) == 1 ? true : false;
}
@Override
public Boolean getNullableResult(CallableStatement cs, int columnName) throws SQLException {
return cs.getInt(columnName) == 1 ? true : false;
}
@Override
public 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 configuration
PUBLIC "-//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 mapper
PUBLIC "-//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.实例化SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 3.实例化SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
// 4.获取PersonMapper接口
PersonMapper personMapper = session.getMapper(PersonMapper.class);
// 5.执行SQL
Person 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.实例化SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 3.实例化SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
// 4.获取PersonMapper接口
PersonMapper personMapper = session.getMapper(PersonMapper.class);
// 5.执行SQL
int 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类型的自定义数据类型转换器的学习,大家可以动手试试其他的类型转换,欢迎留言交流,下篇见。