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

  输出结果:

  

 

posted on 2018-01-31 18:28  李洋1991  阅读(226)  评论(0编辑  收藏  举报