mybatis的一些細節問題

看書上提到的,記下來,加深一下印象。

一、mybatis處理CLOB/BLOB列的類型處理,例如:

CREATE TABLE USER_PICS (
    ID INT(11) NOT NULL AUTO_INCREMENT,
    NAME VARCHAR(50) DEFAULT NULL,
    PIC BLOB,
    BIO LONGTEXT,
    PRIMARY KEY (ID)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;

默認情況下,mybatis會將CLOB類型的列映射到java.lang.String類型上,而把BLOB類型的列映射到byte[]類型上。

public class UserPic{
    private int id;
    private String name;
    private byte[] pic;
    private String bio;
    //setters & getters
}

創建mapper文件代碼如下

<insert id="insertUserPic" parameterType="UserPic">
    INSERT INTO USER_PICS(NAME, PIC,BIO)
    VALUES(#{name},#{pic},#{bio})
</insert>
<select id="getUserPic" parameterType="int" resultType="UserPic">
    SELECT * FROM USER_PICS WHERE ID=#{id}
</select>

下列的insertUserPic()展示瞭如何將數據插入到 CLOB/BLOB 類型的列上:

public void insertUserPic(){
    byte[] pic = null;
    try{
            File file = new File("C:\\Images\\UserImg.jpg");
            InputStream is = new FileInputStream(file);
            pic = new byte[is.available()];
            is.read(pic);
            is.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        String name = "UserName";
        String bio = "put some lenghty bio here";
        UserPic userPic = new UserPic(0, name, pic , bio);
        SqlSession sqlSession = MyBatisUtil.openSession();
        try{
            UserPicMapper mapper =
            sqlSession.getMapper(UserPicMapper.class);
            mapper.insertUserPic(userPic);
            sqlSession.commit();
        }
        finally{
            sqlSession.close();
        }
}

下面的 getUserPic()方法展示了怎樣將 CLOB 類型數據讀取到 String 類型,BLOB 類型數據讀取成 byte[]屬性:

public void getUserPic(){
    UserPic userPic = null;
    SqlSession sqlSession = MyBatisUtil.openSession();
    try{
        UserPicMapper mapper =
        sqlSession.getMapper(UserPicMapper.class);
        userPic = mapper.getUserPic(1);
    }finally{
        sqlSession.close();
    }
    byte[] pic = userPic.getPic();
    try{
        OutputStream os = new FileOutputStream(new
        File("C:\\Images\\UserImage_FromDB.jpg"));
        os.write(pic);
        os.close();
    }catch (FileNotFoundException e){ 
        e.printStackTrace();
    }catch (IOException e){
        e.printStackTrace();
    }
}

二、使用RowBound來進行分頁處理

mybatis可以使用RowBound來進行分頁處理,RowBound有兩個參數,offset和limit。offset標識開始的位置,limit標識要取的記錄的數目,例如:

<select id="findAllStudents" resultMap="StudentResult">
    select * from Students
</select>

然後,你可以加載如下加載第一頁數據(前 25 條) :

int offset =0 , limit =25;
RowBounds rowBounds = new RowBounds(offset, limit);
List<Student> = studentMapper.getStudents(rowBounds);

個人感覺這個對象可能比較適用於使用反向工程生成的代碼,進行單表查詢的時候使用,與mybatis的分頁插件pageHelper比較像,不知道是不是,大牛有知道的幫忙解釋一下。

三、mybatis-3.2.2 並不支持使用 resultMap 配置將查詢的結果集映射成一個屬性爲key,而另外屬性爲 value 的 HashMap。sqlSession.selectMap()則可以返回 以給定列爲 key,記錄對象爲 value 的 map。我們不能將其配置成使用其中一個屬性作爲 key,而另外的屬性作爲 value。

四、緩存

mybatis對通過映射的select語句加載查詢結果提供了內建的緩存支持。

默認情況下,開啓一級緩存,即:如果你使用同一個sqlSession接口對象條用了同一個select語句,則直接從緩存中返回結構,不會再次查詢數據庫。

二級緩存,默認是關閉的,你可以通過在mapper映射文件中加入下面這一行來實現。

一個緩存的配置和緩存實例被綁定到映射器配置文件所在的名空間 (namespace)上,所以在相同名空間內的所有語

句被綁定到一個 cache 中。

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
<!--
    一、eviction:定義緩存的移除機制,主要包括
    1、LUR(Least Recently used最近最少使用)
    2、FIFO(first in first out,先進先出)
    3、SOFT(software reference,軟引用(不清楚什麼玩意))
    4、WEAK(weak reference,弱引用,不知道什麼鬼)
    二、flushInterval:緩存刷新間隔,以毫秒計。默認情況下不設置。所以不使用刷新間隔,緩存 cache 只
有調用語句的時候刷新。
    三、size:此表示緩存 cache 中能容納的最大元素數。默認值是 1024,你可以設置成任意的正整數。
    四、readOnly:一個只讀的緩存 cache 會對所有的調用者返回被緩存對象的同一個實例(實際返回的是被返回對
象的一份引用)。一個讀/寫緩存 cache 將會返回被返回對象的一分拷貝(通過序列化) 。默認情況下設
置爲 false。可能的值有 false 和 true。
-->

mybatis-config.xml中配置的

<settings>
    <!-- 該配置影響的所有映射器中配置的緩存的全局開關。-->
    <setting name="cacheEnable" value="true"/>
</settings>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章