mybatis入门系列三之类型转换器
2024-08-24 18:39:58
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>
最新文章
- String.Format用法
- mathlab之floor,ceil,round,int以及fix函数
- 【P1825】表达式整除
- 0022 Java学习笔记-面向对象-继承、多态、组合
- 将gridFS中的图片文件写入硬盘
- android中图片的三级缓存cache策略(内存/文件/网络)
- 【WPF】Winform调用WPF窗体注意事项
- 【leetcode】Intersection of Two Linked Lists(easy)
- 【HDOJ】1158 Employment Planning
- [poj 1039]Pipes[线段相交求交点]
- aliyun 主机Nginx 上配置Drupal 伪静态
- IIS7部署MVC站点后,打开无法正常跳转到首页
- Javascript—②函数
- Android SDK教程
- spring学习之spring 插件 for eclipse
- 微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用
- HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
- MyEclipse10+Jdk1.7+OSGI+MySql实现数据库的增删改查
- postgresql定位分析消耗CPU高的SQL语句
- Typechecking With PropTypes