MyBatis的TypeHandler实例

  我们知道java有java的数据类型,数据库有数据库的数据类型,那么我们在往数据库中插入数据的时候是如何把java类型当做数据库类型插入数据库,在从数据库读取数据的时候又是如何把数据库类型当做java类型来处理呢?这中间必然要经过一个类型转换。 每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用TypeHandler 来处理数据库类型与java 类型之间转换。

  本例把一个数组形式的数据存放在数据库以逗号分割。

  需要的jar包和文件结构:

  

  数据库表结构:

  

  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>
    <!-- 数据类型转换类的配置 -->
    <typeHandlers>
        <typeHandler handler="test.typehandler.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR" />
    </typeHandlers>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver" />
                <property name="url" value="jdbc:oracle:thin:@172.3.15.29:1521/ORCL" />
                <property name="username" value="scott" />
                <property name="password" value="ORCL" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="test/mapping/O_FLOWER_TYPEMapper.xml" />
    </mappers>
</configuration>

  StringArrayTypeHandler类的代码:

package test.typehandler;

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;
/**
 * Filename:    StringArrayTypeHandler.java  
 * Description:  字符串数组 与 VARCHAR类型转换器
 */
public class StringArrayTypeHandler extends BaseTypeHandler<String[]> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
            String[] parameter, JdbcType jdbcType) throws SQLException {
        String value = "";

        // 循环数组 拼出 以逗号分割的字符串
        for (String temp : parameter) {
            value = value + temp + ",";
        }
        ps.setString(i, value);
    }

    @Override
    public String[] getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        
        // 获取columnName列的数据
        String value = rs.getString(columnName);
        String[] result = value.split(",");
        
        return result;
    }

    @Override
    public String[] getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        // 获取columnName列的数据
        String value = rs.getString(columnIndex);
        String[] result = value.split(",");
        
        return result;
    }

    @Override
    public String[] getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        // 获取columnName列的数据
        String value = cs.getString(columnIndex);
        String[] result = value.split(",");
        return result;
    }

}

  POJO需要做如下修改:

  private String [] likes; //以及对应的get/set方法

  测试类:

import java.io.IOException;
import java.io.InputStream;

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 org.junit.Test;

import test.dao.O_FLOWER_TYPEMapper;
import test.model.O_FLOWER_TYPE;

public class TestMybatis {
    
    @Test
    public void testMybatis() throws IOException {
      InputStream inp = Resources.getResourceAsStream("mybatis-config.xml");
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inp);
      SqlSession session = factory.openSession();
      
      O_FLOWER_TYPEMapper fm = session.getMapper(O_FLOWER_TYPEMapper.class);
      O_FLOWER_TYPE ft = fm.selectByPrimaryKey((short)9999);
      System.out.println(ft.getName());
      for (String x : ft.getLikes()) {
        System.out.println(x);
    }
        
    }
}

  输出结果:

  

 

转载于:https://www.cnblogs.com/edwardli/p/8393827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值