看書上提到的,記下來,加深一下印象。
一、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>