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,interestsvalues (#{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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM