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:strings11 ) {12 result.append(value).append(",");13 }14 result.deleteCharAt(result.length()-1);15 preparedStatement.setString(i,result.toString());16 }1718 @Override19 public String[] getNullableResult(ResultSet resultSet, String s) throws SQLException {20 return getStringArray(resultSet.getString(s));21 }2223 @Override24 public String[] getNullableResult(ResultSet resultSet, int i) throws SQLException {25 return getStringArray(resultSet.getString(i));26 }2728 @Override29 public String[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {30 return getStringArray(callableStatement.getString(i));31 }3233 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 = 13</select>
原文地址:https://www.cnblogs.com/huanglf714/p/10778592.html
时间: 2024-10-24 21:48:41