mybatis入门系列三之类型转换器
类型转换器介绍
mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应
因此java类名-数据库表名,java类属性名-数据库表字段名,java类属性类型-数据库字段类型
前面两个都容易设置,但是第三点要求经常会出现java类型和数据库的存储类型不一样, 例如java类型是String,数据库中存储的是char、varchar、text
对于一般常见的类型对应,mybatis已经内部包含了类型转换器,使String类型的java属性可以直接插入到数据库中,也可以直接从数据库中取出直接赋值给对象的属性
mybatis内置可以自动转换的数据类型有
自定义类型转换器
但是也会经常出现数据库字段类型与java类属性类型不能自动转换的情况,这时候就需要我们自己定义一个类型转换器
例如下面的需求:
student类中有一个属性是interests,字段类型是String[],
但是保存在数据库中的字段属性是varchar,传过来的每一个String用,分隔
解决方法
步骤一:自定义一个类型转换器
1//继承BaseTypeHandler<T>类(也可以实现TypeHandler 接口,其实我们要继承的这个类也就是实现了TypeHandler接口)
2//<T>是一个泛型,我们将其修改为我们相对应的java属性类型,这里就是String[]
3
4public class StringArrayTypeHandler extends BaseTypeHandler<String[]> {
5
6 @Override
7 public void setNonNullParameter(PreparedStatement preparedStatement, int i, String[] strings, JdbcType jdbcType) throws SQLException
8 {
9 StringBuffer result = new StringBuffer();
10 for (String value:strings
11 ) {
12 result.append(value).append(",");
13 }
14 result.deleteCharAt(result.length()-1);
15 preparedStatement.setString(i,result.toString());
16 }
17
18 @Override
19 public String[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
20 return getStringArray(resultSet.getString(s));
21 }
22
23 @Override
24 public String[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
25 return getStringArray(resultSet.getString(i));
26 }
27
28 @Override
29 public String[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
30 return getStringArray(callableStatement.getString(i));
31 }
32
33 private String[] getStringArray(String columnValue) {
34 if(columnValue == null){
35 return null;
36 }
37 return columnValue.split(",");
38 }
39}
步骤二:注册上面编写的类型转换器
在conf.xml文件里增加以下配置
1<typeHandlers>
2 <typeHandler handler="huanglf.mybatis.util.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"/>
3</typeHandlers>
步骤三:编写SQL语句,注意这里需要用resultMap
1<resultMap id="studentMapping" type="Student">
2 <id property="stuId" column="stuno"></id>
3 <result property="interests" column="interests" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"></result>
4</resultMap>
然后我们就可以进行相应的插入、查询等操作
插入
1//mapper.xml文件
2<insert id="addStudentWithInterests" parameterType="Student">
3 insert into student (stuno,interests) values (#{stuId}, #{interests});
4</insert>
5
6//test文件
7public static void addStudentWithInterests(StudentMapper studentMapper){
8 Student student = new Student();
9 student.setStuId(5);
10 String[] interests = {"swim","read"};
11 student.setInterests(interests);
12 studentMapper.addStudentWithInterests(student);
13 System.out.println("插入成功");
14 }
查询
1<select id="queryStudentInterests" resultMap="studentMapping">
2 select stuno, interests from student where stuno = 1
3</select>