1. 程式人生 > >mybatis入門系列三之類型轉換器

mybatis入門系列三之類型轉換器

容易 for 框架 xtend sets clas 包含 ria weight

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>


技術分享圖片

mybatis入門系列三之類型轉換器