我们知道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); } } }
输出结果: