MyBatis之类型处理器typeHandlers

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);
		}
	}

}

测试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值