引言
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>