MyBatis映射文件UserMapper.xml(mysql環境)


引言

Mybatis的真正強大,在於她對SQL的映射,這也是她吸引人的地方。實現相同的功能,她要比直接使用JDBC省去95%的代碼量。而且將SQL語句獨立在Java代碼之外,為程序的修改和糾錯提供了更大的靈活性,可以直接修改SQL語句,而無需重新編譯Java程序。

SQL映射文件也是XML格式,其頂級元素有以下幾個:

 

  • select - 映射sql查詢語句
  • insert - 映射sql插入語句
  • update - 映射sql更新語句
  • delete - 映射sql刪除語句
  • sql - 就像程序中可以復用的函數一樣,這個元素下放置可以被其他語句重復引用的sql語句
  • resultMap - 用來描述如何從數據庫查詢結果集中來加載對象
  • cache - 給定命名空間的緩存配置
  • cache-ref - 其他命名空間緩存配置引用

1.mapper配置xml文件和接口關聯。

1 <!--namespace務必和接口的全類名一致 -->
2 <mapper namespace="cn.bdqn.li.UserMapper">

 

2.resultMap映射。存在條件:當數據庫字段名和實體類中的屬性名不同的情況下。

1 <!--字段名和屬性名不同時,使用resultMap映射-->
2     <resultMap id="userMap" type="User">
3         <id property="id" column="xsdm"/>
4         <result property="name" column="xsmc"/>
5     </resultMap>

3.insert into 添加語句(帶主鍵回寫)

<!--id務必和接口中的方法名稱對應
    如果參數類型是一個對象,那么sql語句中#{對象的屬性名}
         KeyProperty屬性表示:   數據表主鍵對應的實體對象屬性名稱
         parameterType:要執行的dao中的方法的參數,如果是類的話,必須使用全路徑類
        (全路徑名可以使用在mybatis.xml文件中配置的別名代替)
-->
<!--新增用戶的同時 拿到數據庫中的id
 01.完成新增操作之后並沒有把連接還給連接池
 02.而是接着使用連接去查詢id
 SELECT @@IDENTITY
 SELECT LAST_INSERT_ID()   都可以獲取剛剛插入數據的主鍵

  mysql中使用 order="AFTER", 主鍵自增,必須是插入數據成功之后才能獲取id
  oracle中使用 order="BEFORE" ,必須先從序列中獲取id,才能新增!

  useGeneratedKeys:  mybatis會根據數據庫的不同獲取主鍵===》 主鍵回填
 -->


    <insert id="addUser" parameterType="User"  keyProperty="id" useGeneratedKeys="true">
        insert into xs(xsmc)
        values(#{name})
         <!-- 回顯,添加數據后,返回對象的id值 -->
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            select @@IDENTITY
        </selectKey>
    </insert>

4.查詢語句

  

  1  <!--查詢指定的user對象
  2             當數據庫中的字段和實體類中的屬性名相同時,使用resultType=“實體類名”。
  3         -->
  4     <select id="selectUserById" parameterType="int" resultType="User">
  5         SELECT  xsmc  from xs  where xsdm=#{id}
  6     </select>
  7     <!--查詢指定的user對象
  8         當數據庫中的字段和實體類中的屬性名不相同時,使用resultMap=“上文寫的resultMap的id名稱”。
  9     -->
 10     <select id="selectUserById1" parameterType="int" resultMap="userMap">
 11         SELECT  xsmc  from xs  where xsdm=#{id}
 12     </select>
 13 
 14     <!--查詢所有的用戶信息-->
 15     <select id="selectAllUsers" resultMap="userMap">
 16         SELECT  xsdm,xsmc  from xs
 17     </select>
 18 
 19     <!--根據名稱進行模糊查詢-->
 20     <select id="selectByNamelike"  resultMap="userMap">
 21         SELECT  xsdm,xsmc  from xs
 22         WHERE   xsmc like concat('%',#{zzz},'%')
 23     </select>
 24     <!--多條件鏈接查詢1(使用list集合)-->
 25     <select id="findUserByParams" resultMap="userMap">
 26         SELECT xsdm,xsmc from xs
 27         where xsmc LIKE concat('%',#{name},'%') AND xsdm >#{id}
 28     </select>
 29     <!--多條件鏈接查詢2(使用Map集合)-->
 30     <select id="findUserByParams2" resultType="map">
 31         SELECT xsdm,xsmc from xs
 32         where xsmc LIKE concat('%',#{resultName},'%') AND xsdm >#{resultId}
 33     </select>
 34     <!--多條件鏈接查詢3(使用索引)-->
 35     <select id="findUserByParams3" resultMap="userMap">
 36         SELECT xsdm,xsmc from xs
 37         where xsmc LIKE concat('%',#{0},'%') AND xsdm >#{1}
 38     </select>
 39     <!--if判斷和where標簽拼接-->
 40     <select id="selectAllUsersByIf" resultMap="userMap">
 41         select xsdm,xsmc from xs
 42         <where>
 43         <if test="name!=null and name!=''">
 44             and xsmc like concat('%',#{name},'%')
 45         </if>
 46             <if test="id!=null and id!=''">
 47               and xsdm>#{id}
 48             </if>
 49         </where>
 50     </select>
 51     <!--choose選擇標簽(和Java中的switch語句一樣的效果)-->
 52     <select id="selectAllUserByChoose" resultMap="userMap">
 53         select xsdm,xsmc from xs
 54         <where>
 55         <choose>
 56             <when test="id>10">
 57                 xsmc like concat('%',#{name},'%');
 58             </when>
 59             <when test="id>60">
 60                 xsdm>30;
 61             </when>
 62             <otherwise>
 63                 xsdm=1
 64             </otherwise>
 65 
 66         </choose>
 67         </where>
 68     </select>
 69     <!--foreach循環遍歷數組-->
 70     <select id="selectAllUserByFor" resultMap="userMap">
 71         select * from xs
 72         <if test="array.length>0">
 73             where xsdm in
 74             <foreach collection="array" item="myid" open="(" separator="," close=")">
 75                 #{myid}
 76             </foreach>
 77         </if>
 78     </select>
 79     <!--foreach循環遍歷List-->
 80     <select id="selectAllUserByForList" resultMap="userMap">
 81         select * from xs
 82         <if test="list.size>0">
 83             where xsdm in
 84             <foreach collection="list" item="myid" open="(" separator="," close=")">
 85                 #{myid}
 86             </foreach>
 87         </if>
 88     </select>
 89     <!--foreach循環遍歷ArraryList集合-->
 90     <insert id="selectAllUserByForListUser" parameterType="java.util.ArrayList" >
 91         insert INTO xs(xsdm,xsmc) VALUES
 92         <if test="list.size>0">
 93             <foreach collection="list" item="user" separator="," index="index">
 94                (#{user.id},#{user.name})
 95             </foreach>
 96         </if>
 97     </insert>
 98     <!--foreach循環遍歷Map集合-->
 99     <select id="selectAllUserByForMap" resultType="map">
100         select * from xs
101         <if test="map.keys.size>0">
102             where xsdm in
103             <foreach collection="map.values" item="user" open="(" separator="," close=")">
104                 #{user.id}
105             </foreach>
106         </if>
107     </select> 

 

屬性 描述
id 在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType 將會傳入這條語句的參數類的完全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過 TypeHandler 推斷出具體傳入語句的參數,默認值為 unset。
resultType 從這條語句中返回的期望類型的類的完全限定名或別名。注意如果是集合情形,那應該是集合可以包含的類型,而不能是集合本身。使用 resultType 或 resultMap,但不能同時使用。
resultMap 外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,對其有一個很好的理解的話,許多復雜映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同時使用。
flushCache 將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:false。
useCache 將其設置為 true,將會導致本條語句的結果被二級緩存,默認值:對 select 元素為 true。
timeout 這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)。
fetchSize 這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值為 unset(依賴驅動)。
statementType STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值為 unset (依賴驅動)。
databaseId 如果配置了 databaseIdProvider,MyBatis 會加載所有的不帶 databaseId 或匹配當前 databaseId 的語句;如果帶或者不帶的語句都有,則不帶的會被忽略。
resultOrdered 這個設置僅針對嵌套結果 select 語句適用:如果為 true,就是假設包含了嵌套結果集或是分組了,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的情況。這就使得在獲取嵌套的結果集的時候不至於導致內存不夠用。默認值:false
resultSets 這個設置僅對多結果集的情況適用,它將列出語句執行后返回的結果集並每個結果集給一個名稱,名稱是逗號分隔的。

  5.刪除語句

    

1    <!--刪除功能  用戶傳遞的是 一個變量! 這時候sql語句中的#{xxx}
2       xxx只是一個占位符
3       只有一個參數的時候,可以省略parameterType-->
4     <delete id="deleteUser" parameterType="int">
5         delete from xs where xsdm=#{xxx}
6     </delete>

  

  

6.修改語句

  

1 <!--修改 用戶傳遞的是 一個對象!這時候sql語句中的#{屬性值}
2       屬性值必須和實體類中的屬性一致 -->
3     <update id="updateUser" parameterType="User">
4         update   xs  set  xsmc=#{name}
5         where xsdm=#{name}
6     </update>

 


免責聲明!

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



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