typeHandlers类型处理器
实现java类型与数据库类型之间的转换,可以使用系统提供的类型处理器,也可以自定义类型处理器,这里介绍的是实现自定义类型处理器处理数据库类型与java类型的转换
比如:List —>VARCHAR
1、定义自定义类型处理器
package org.zhouym.typehandlers;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class MyTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType)
throws SQLException {
//对占位符进行处理
StringBuilder sb = new StringBuilder();
for (String hobby : list) {
sb.append(hobby);
sb.append(";");
}
String hobbys = sb.toString();
//为占位符设值
ps.setString(i, hobbys.substring(0, hobbys.length()-1));
}
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String hobby = rs.getString(columnName);
if (hobby == null) {
return null;
}
String[] split = hobby.split(";");
return Arrays.asList(split);
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String hobby = rs.getString(columnIndex);
if (hobby == null) {
return null;
}
String[] split = hobby.split(";");
return Arrays.asList(split);
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return null;
}
}
2、配置文件中配置类型处理器信息
<?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"></properties>
<!-- 引入类型处理器 -->
<typeHandlers>
<typeHandler handler="org.zhouym.typehandlers.MyTypeHandler"></typeHandler>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据源信息 -->
<dataSource type="POOLED">
<!-- 引入配置文件中的内容 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 与映射文件建立联系 -->
<mappers>
<!-- 这里注意的是,资源路径是映射文件的地址,不能以点分隔 -->
<mapper resource="org/zhouym/dao/IUserDao.xml" />
</mappers>
</configuration>
添加集合属性
映射文件
<?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">
<!-- 利用接口实现,namespace必须为接口的全路径 -->
<mapper namespace="org.zhouym.dao.IUserDao">
<!-- 将数据库查询的结果保存到对象中 -->
<select id="query" resultType="com.zhouym.javabean.User">
<!-- 书写sql语句,没有分号 -->
select * from tb_user
</select>
<select id="queryById" resultType="com.zhouym.javabean.User">
<!-- 书写sql语句,没有分号 -->
select * from tb_user where id=#{id}
</select>
<!-- 增加数据 -->
<insert id="addUser" parameterType="com.zhouym.javabean.User">
insert into tb_user(name,age,address,hobby) values(#{name},#{age},#{address},#{hobby})
</insert>
<!-- 修改数据 -->
<update id="updateUser" parameterType="com.zhouym.javabean.User">
update tb_user set name=#{name},age=#{age},address=#{address} where id=#{id}
</update>
<!-- 删除数据 -->
<delete id="deleteById" parameterType="int">
delete from tb_user where id=#{id}
</delete>
</mapper>
测试类
package com.zhouym.junit;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.zhouym.dao.IUserDao;
import org.zhouym.dbutils.DButils;
import com.zhouym.javabean.User;
public class JunitTestInterface {
private static Logger logger = Logger.getLogger(JunitTestInterface.class);
@Test
public void test1() {
SqlSessionFactory factory = DButils.getSqlSessionFactory();
SqlSession sqlSession = factory.openSession();
//获取的IUserDao的实现 其实就是一个代理类
IUserDao iUserDao = sqlSession.getMapper(IUserDao.class);
User user = new User();
user.setName("老胡");
user.setAge(28);
user.setAddress("河南");
List<String> list = new ArrayList<>();
list.add("篮球");
list.add("跑步");
list.add("游泳");
user.setHobby(list);
int result = iUserDao.addUser(user);
if (result > 0) {
logger.info("增加成功!!!");
}
sqlSession.commit();
}
}
测试结果
查询数据
package com.zhouym.junit;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.zhouym.dao.IUserDao;
import org.zhouym.dbutils.DButils;
import com.zhouym.javabean.User;
public class JunitTestInterface {
private static Logger logger = Logger.getLogger(JunitTestInterface.class);
@Test
public void test() {
SqlSessionFactory factory = DButils.getSqlSessionFactory();
SqlSession sqlSession = factory.openSession();
//获取的IUserDao的实现 其实就是一个代理类
IUserDao iUserDao = sqlSession.getMapper(IUserDao.class);
//调用接口中的方法
List<User> list = iUserDao.query();
for (User user : list) {
logger.info(user);
}
}
}
测试结果