mybatis入門系列三之類型轉換器
阿新 • • 發佈:2019-04-27
容易 for 框架 xtend sets clas 包含 ria weight mybatis內置可以自動轉換的數據類型有
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入門系列三之類型轉換器