四、MyBatis-映射文件
映射文件指導(dǎo)著MyBatis如何進(jìn)行數(shù)據(jù)庫增刪改查,有著非常重要的意義。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"></mapper>?
以下是maper可配置的子標(biāo)簽:
?
cache : 配置mybatis的二級緩存 (作用域?yàn)楫?dāng)前的命名空間)
前提需要啟用二級緩存,開啟方式,只需要在全局配置文件的setting中添加cacheEnabled屬性為true:
<settings><!--顯式的指定每個我們需要更改的配置的值,即使他是默認(rèn)的。防止版本更新帶來的問題 --><setting name="cacheEnabled" value="true"/> </settings>示例:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"><!-- mybatis內(nèi)置緩存,默認(rèn)使用的是org.apache.ibatis.cache.impl.PerpetualCache (相當(dāng)于一個Map)自定義緩存,需要實(shí)現(xiàn)org.apache.ibatis.cache.Cache接口,交由第三方處理--><cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> <!-- eviction:緩存的回收策略:? LRU – 最近最少使用的:移除最長時間不被使用的對象。? FIFO – 先進(jìn)先出:按對象進(jìn)入緩存的順序來移除它們。? SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。? WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。? 默認(rèn)的是 LRU。flushInterval:緩存刷新間隔緩存多長時間清空一次,默認(rèn)不清空,設(shè)置一個毫秒值readOnly:是否只讀:true:只讀;mybatis認(rèn)為所有從緩存中獲取數(shù)據(jù)的操作都是只讀操作,不會修改數(shù)據(jù)。mybatis為了加快獲取速度,直接就會將數(shù)據(jù)在緩存中的引用交給用戶。不安全,速度快false:非只讀:mybatis覺得獲取的數(shù)據(jù)可能會被修改。mybatis會利用序列化&反序列的技術(shù)克隆一份新的數(shù)據(jù)給你。安全,速度慢size:緩存存放多少元素;type="":指定自定義緩存的全類名;實(shí)現(xiàn)Cache接口即可;--><!-- 使用第三方Ehcache緩存, mybatis與Ehcache整合 --><!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache> --><!-- 即使開啟了全局緩存,也可以通過 flushCache、useCache屬性來控制當(dāng)前SQL的存機(jī)制,flushCache: true (一級緩存就清空了;二級也會被清除,緩存失效)useCache:false (一級緩存任然有用,二級緩存失效)--><select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee" flushCache="false"useCache="true">select * from tbl_employee where id = #{id}</select> </mapper>?
cache-ref : 其他命名空間緩存配置的引用
<!-- 引用緩存:namespace:指定和哪個名稱空間下的緩存一樣 --> <cache-ref namespace="com.atguigu.mybatis.dao.EmployeeMapper"/>引用其他命名空間的緩存。
?
mybatis 如何引入java調(diào)用時傳入的參數(shù)?
1)當(dāng)java方法參數(shù)沒有@Param指定時,可以按照參數(shù)的順序索引和內(nèi)部名稱獲取參數(shù)值,如:
- #{0},#{1},#{2}....#{n索引}
- #{param1},#{param2},#{param3}....#{param(n+1)}
2)當(dāng)java方法參數(shù)有@Param指定時,參數(shù)就用@Param中value值進(jìn)行引用,當(dāng)然也可以同時使用上面的形式,因?yàn)閖ava的方法參數(shù)大于1的時候最終會被轉(zhuǎn)化為Map對象的形式交給mybatis。
?
3)單個參數(shù):mybatis不會做特殊處理,#{參數(shù)名/任意名}:取出參數(shù)值。多個參數(shù):mybatis會做特殊處理。多個參數(shù)會被封裝成 一個map,key:param1...paramN,或者參數(shù)的索引也可以,value:傳入的參數(shù)值,#{}就是從map中獲取指定的key的值;
?
4)案例
public Employee getEmp(@Param("id")Integer id,String lastName);取值:id==>#{id/param1/0} lastName==>#{param2/1}public Employee getEmp(Integer id,@Param("e")Employee emp);取值:id==>#{param1/0} lastName===>#{param2.lastName/e.lastName/1.lastName}##特別注意:如果是Collection(List、Set)類型或者是數(shù)組,也會特殊處理。也是把傳入的list或者數(shù)組封裝在map中。key:Collection(collection),如果是List還可以使用這個key:list,數(shù)組用array public Employee getEmpById(List<Integer> ids);取值:取出第一個id的值: #{list[0]}?
5)源碼分析
?
insert自增主鍵的配置方式
1) 帶自增的數(shù)據(jù)庫如:mysql
<!-- parameterType:參數(shù)類型,可以省略, 獲取自增主鍵的值:mysql支持自增主鍵,自增主鍵值的獲取,mybatis也是利用statement.getGenreatedKeys();useGeneratedKeys="true";使用自增主鍵獲取主鍵值策略keyProperty;指定對應(yīng)的主鍵屬性,也就是mybatis獲取到主鍵值以后,將這個值封裝給javaBean的哪個屬性 --> <insert id="addEmp" parameterType="com.atguigu.mybatis.bean.Employee"useGeneratedKeys="true" keyProperty="id" databaseId="mysql">insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert>?
2)不帶自增的數(shù)據(jù)庫如:oracle
<!-- 獲取非自增主鍵的值:Oracle不支持自增;Oracle使用序列來模擬自增;每次插入的數(shù)據(jù)的主鍵是從序列中拿到的值;如何獲取到這個值;--> <insert id="addEmp" databaseId="oracle"><!-- 使用selectKey功能:keyProperty:查出的主鍵值封裝給javaBean的哪個屬性order="BEFORE":當(dāng)前sql在插入sql之前運(yùn)行 AFTER:當(dāng)前sql在插入sql之后運(yùn)行resultType:查出的數(shù)據(jù)的返回值類型BEFORE運(yùn)行順序:先運(yùn)行selectKey查詢id的sql;查出id值封裝給javaBean的id屬性在運(yùn)行插入的sql;就可以取出id屬性對應(yīng)的值A(chǔ)FTER運(yùn)行順序:先運(yùn)行插入的sql(從序列中取出新值作為id);再運(yùn)行selectKey查詢id的sql;--><selectKey keyProperty="id" order="BEFORE" resultType="Integer"><!-- 編寫查詢主鍵的sql語句 --><!-- BEFORE-->select EMPLOYEES_SEQ.nextval from dual </selectKey><!-- 插入時的主鍵是從序列中拿到的 --><!-- BEFORE:-->insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) values(#{id},#{lastName},#{email}) </insert>?
轉(zhuǎn)載于:https://www.cnblogs.com/kancy/p/10205599.html
總結(jié)
以上是生活随笔為你收集整理的四、MyBatis-映射文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ywy_c_asm题
- 下一篇: Numpy函数分类