日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

四、MyBatis-映射文件

發布時間:2024/4/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四、MyBatis-映射文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

映射文件指導著MyBatis如何進行數據庫增刪改查,有著非常重要的意義。

<?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可配置的子標簽:

  • cache –命名空間的二級緩存配置
  • cache-ref – 其他命名空間緩存配置的引用。
  • resultMap – 自定義結果集映射
  • parameterMap – 已廢棄!老式風格的參數映射
  • sql –抽取可重用語句塊。
  • insert – 映射插入語句
  • update – 映射更新語句
  • delete – 映射刪除語句
  • select – 映射查詢語句
  • ?

    cache : 配置mybatis的二級緩存 (作用域為當前的命名空間)

    前提需要啟用二級緩存,開啟方式,只需要在全局配置文件的setting中添加cacheEnabled屬性為true:

    <settings><!--顯式的指定每個我們需要更改的配置的值,即使他是默認的。防止版本更新帶來的問題 --><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內置緩存,默認使用的是org.apache.ibatis.cache.impl.PerpetualCache (相當于一個Map)自定義緩存,需要實現org.apache.ibatis.cache.Cache接口,交由第三方處理--><cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> <!-- eviction:緩存的回收策略:? LRU – 最近最少使用的:移除最長時間不被使用的對象。? FIFO – 先進先出:按對象進入緩存的順序來移除它們。? SOFT – 軟引用:移除基于垃圾回收器狀態和軟引用規則的對象。? WEAK – 弱引用:更積極地移除基于垃圾收集器狀態和弱引用規則的對象。? 默認的是 LRU。flushInterval:緩存刷新間隔緩存多長時間清空一次,默認不清空,設置一個毫秒值readOnly:是否只讀:true:只讀;mybatis認為所有從緩存中獲取數據的操作都是只讀操作,不會修改數據。mybatis為了加快獲取速度,直接就會將數據在緩存中的引用交給用戶。不安全,速度快false:非只讀:mybatis覺得獲取的數據可能會被修改。mybatis會利用序列化&反序列的技術克隆一份新的數據給你。安全,速度慢size:緩存存放多少元素;type="":指定自定義緩存的全類名;實現Cache接口即可;--><!-- 使用第三方Ehcache緩存, mybatis與Ehcache整合 --><!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache> --><!-- 即使開啟了全局緩存,也可以通過 flushCache、useCache屬性來控制當前SQL的存機制,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調用時傳入的參數?

    1)當java方法參數沒有@Param指定時,可以按照參數的順序索引和內部名稱獲取參數值,如:

    • #{0},#{1},#{2}....#{n索引}
    • #{param1},#{param2},#{param3}....#{param(n+1)}

    2)當java方法參數有@Param指定時,參數就用@Param中value值進行引用,當然也可以同時使用上面的形式,因為java的方法參數大于1的時候最終會被轉化為Map對象的形式交給mybatis。

    ?

    3)單個參數:mybatis不會做特殊處理,#{參數名/任意名}:取出參數值。多個參數:mybatis會做特殊處理。多個參數會被封裝成 一個map,key:param1...paramN,或者參數的索引也可以,value:傳入的參數值,#{}就是從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)類型或者是數組,也會特殊處理。也是把傳入的list或者數組封裝在map中。key:Collection(collection),如果是List還可以使用這個key:list,數組用array public Employee getEmpById(List<Integer> ids);取值:取出第一個id的值: #{list[0]}

    ?

    5)源碼分析

    ?

    insert自增主鍵的配置方式

    1) 帶自增的數據庫如:mysql

    <!-- parameterType:參數類型,可以省略, 獲取自增主鍵的值:mysql支持自增主鍵,自增主鍵值的獲取,mybatis也是利用statement.getGenreatedKeys();useGeneratedKeys="true";使用自增主鍵獲取主鍵值策略keyProperty;指定對應的主鍵屬性,也就是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)不帶自增的數據庫如:oracle

    <!-- 獲取非自增主鍵的值:Oracle不支持自增;Oracle使用序列來模擬自增;每次插入的數據的主鍵是從序列中拿到的值;如何獲取到這個值;--> <insert id="addEmp" databaseId="oracle"><!-- 使用selectKey功能:keyProperty:查出的主鍵值封裝給javaBean的哪個屬性order="BEFORE":當前sql在插入sql之前運行 AFTER:當前sql在插入sql之后運行resultType:查出的數據的返回值類型BEFORE運行順序:先運行selectKey查詢id的sql;查出id值封裝給javaBean的id屬性在運行插入的sql;就可以取出id屬性對應的值AFTER運行順序:先運行插入的sql(從序列中取出新值作為id);再運行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>

    ?

    轉載于:https://www.cnblogs.com/kancy/p/10205599.html

    總結

    以上是生活随笔為你收集整理的四、MyBatis-映射文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。