前面學(xué)習(xí)的都是一些配置,mybatis的精華也就集中在SQL的映射文件上,相比實(shí)現(xiàn)相同功能的jdbc代碼,節(jié)約了95%的代碼量。


<!-- 配置給定命名空間的緩存 -->
<cache></cache>

<!-- 從其他命名空間引用緩存配置 -->
<cache-ref namespace="" />

<!-- 描述如何將db中查詢的結(jié)果集加載成對(duì)象 -->
<resultMap type="" id="">
<constructor>
<idArg />
<arg />
<arg />
<arg />
</constructor>
</resultMap>

<!-- 定義可重用的sql語句 -->
<sql id=""></sql>

<!-- 映射dml語句 -->
<insert id=""></insert>
<select id=""></select>
<update id=""></update>
<delete id=""></delete>



一、select可以可以說是使用最多的元素,使用也很簡單

 

  1. <select id="getUserById" parameterType="int" resultType="User"> 
  2.     select * from tbl_user where id = #{id} 
  3. </select> 

< select>元素中的一些屬性(紅色為用的較多的屬性)

 

id 在命名空間中唯一的標(biāo)識(shí)符,可以被用來引用這條語句
parameterType將會(huì)傳入這條語句的參數(shù)類的完全限定名或別名。
resultType 從這條語句中返回的期望類型的類的完全限定名或別名。
意集合情形,那應(yīng)該是集合可以包含的類型,
而不能是集合本身。使用 resultType或 resultMap,
但不能同時(shí)使用
。(可以是基本類型int等,
復(fù)合類型User,集合類型map,list等)
resultMap 命名引用外部的resultMap。返回map是MyBat is
最具力量的特性,對(duì)其有一個(gè)很好的理解的話,
多復(fù)雜映射的情形就能被解決了。
使用 resultMap 或resultType,但不能同時(shí)使用
flushCache 將其設(shè)置為 true,不論語句什么時(shí)候被帶哦用,
都會(huì)導(dǎo)致緩存被清空。默認(rèn)值:false
useCache 將其設(shè)置為 true,將會(huì)導(dǎo)致本條語句的結(jié)果被緩存。
默認(rèn)值:true
timeout  這個(gè)設(shè)置驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果,并拋出
異常時(shí)間的最大等待值。默認(rèn)不設(shè)置(驅(qū)動(dòng)自行處理)
fetchSize 這是暗示驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)。
默認(rèn)不設(shè)置(驅(qū)動(dòng)自行處理)
statementType STATEMENT,PREPARED 或 CALLABLE 的一種。
這會(huì)讓 MyBat is使用選擇使用
Statement,PreparedStatement或 CallableStatement。
默認(rèn)值:PREPARED。
resultSetTypeFORWARD_ONLY,
SCROLL_SENSITIVE,
SCROLL_INSENSITIVE中的一種。
默認(rèn)是不設(shè)置(驅(qū)動(dòng)自行處理)

 

二、insert插入數(shù)據(jù)庫,進(jìn)行插入操作時(shí)主要是要拿到插入數(shù)據(jù)自增的主鍵

id 在命名空間中唯一的標(biāo)識(shí)符,可以被用來引用這條語句。
parameterType
將會(huì)傳入這條語句的參數(shù)類的完全限定名或別名
flushCache 將其設(shè)置為 true,不論語句什么時(shí)候被帶哦用,都會(huì)導(dǎo)致緩存被清空。默認(rèn)值:false。
timeout這個(gè)設(shè)置驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果,并拋出異常時(shí)間的最大等待值。
默認(rèn)不設(shè)置(驅(qū)動(dòng)自行處理)。
statementTypeSTATEMENT,PREPARED 或 CALLABLE 的一種。這會(huì)讓 MyBat is使用選擇使用
Statement,PreparedStatement 或 CallableStatement。默認(rèn)值:PREPARED。
useGeneratedKeys僅對(duì) insert 有 用 ) 這 會(huì) 告 訴 MyBat is 使用 JDBC 的getGeneratedKeys 方法來取出由數(shù)據(jù)(比如:像 MySQL 和 SQL Server 這樣的數(shù)據(jù)庫管理系統(tǒng)的自動(dòng)遞增字段)內(nèi)部生成的主鍵。默認(rèn)值:false。
keyProperty僅對(duì)insert有用) 標(biāo)記一個(gè)屬性, MyBat is會(huì)通過getGeneratedKeys或者通過 insert 語句的selectKey 子元素設(shè)置它的值。默認(rèn):不設(shè)置。

 

在進(jìn)行insert,update,delete之后session要進(jìn)行commit操作,不然數(shù)據(jù)庫不會(huì)更新到數(shù)據(jù)庫

insert的Demo

另一種獲取主鍵的方法

  1. <insert id="addUserLastId" parameterType="User"> 
  2.     <selectKey resultType="int" order="AFTER" keyProperty="id"> 
  3.         SELECT LAST_INSERT_ID() AS id 
  4.     </selectKey> 
  5.     insert into tbl_user(name,age) values(#{name},#{age}) 
  6. </insert> 


 


  1. <insert id="addUser" parameterType="User" keyProperty="id" useGeneratedKeys="true" > 
  2.     insert into tbl_user(name,age) values(#{name},#{age}) 
  3. </insert> 
  1. @Test 
  2. public void testInsert() throws IOException { 
  3.     UserMapper mapper = session.getMapper(UserMapper.class) ;  
  4.     User user = new User() ; 
  5.     user.setName("zhangss") ; 
  6.     user.setAge(22) ; 
  7.     int i = mapper.addUser(user) ; 
  8.     session.commit() ; 
  9.     session.close() ; 
  10.     System.out.println("id:"+i+"--"+user.getId()); 


update的Demo

 

  1. <update id="updateUser" parameterType="User"> 
  2.     update tbl_user set name = #{name} ,age = #{age} where id = #{id} 
  3. </update> 

  1. @Test 
  2. public void testUpdate(){ 
  3.     UserMapper mapper = session.getMapper(UserMapper.class) ;  
  4.     User user = new User() ; 
  5.     user.setId(27) ; 
  6.     user.setName("zhang27") ; 
  7.     user.setAge(227) ; 
  8.     int i = mapper.updateUser(user) ; 
  9.     session.commit() ; 
  10.     session.close() ; 
  11.     System.out.println("id:"+i+"--"+user.getId()); 


三、sql定義可重用的sql語句

  1. <sql id="selectItem">id,name,age</sql> 

 


  1. <select id="getUserById" parameterType="int" resultType="User"> 
  2.      
  3.     <!--
  4.     select * from tbl_user where id = #{id}
  5.      --> 
  6.      select <include refid="selectItem"/> from tbl_user where id = #{id} 
  7. </select> 


四、Parameter


#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet,resultMap=departmentResultMap}


 

五、resultMap所做的工作就是將從數(shù)據(jù)庫中獲取的ResultSet結(jié)果集放入指定的對(duì)象中,避免大量的setter getter代碼,實(shí)現(xiàn)自動(dòng)裝配的功能,實(shí)現(xiàn)結(jié)果的映射


1、簡單映射

  1. <select id=”selectUsers” parameterType=”int” resultType=”hashmap”>  
  2.     select id, username, hashedPassword from some_table where id = #{id}  
  3. </select>  

所有列被自動(dòng)映射到 HashMap 的鍵上,key為列名,value為數(shù)據(jù)庫中的數(shù)據(jù)

 


  1. <select id=”selectUsers” parameterType=”int” resultType=”com.someapp.model.User”>  
  2.     select id, username, hashedPassword from some_table where id = #{id}  
  3. </select>  

將所有從數(shù)據(jù)庫中取得數(shù)據(jù)自動(dòng)裝配到JavaBean中,如果列名與屬性名相同,則無需作任務(wù)的干預(yù)即可完成裝配。

 

如果數(shù)據(jù)庫中的列名與javabean的屬性名稱不同可以在查詢的時(shí)候取別名,如

  1. <select id=”selectUsers” parameterType=”int” resultType=”User”>  
  2.     select user_id as “id”, user_name as “userName”, hashed_password as “hashedPassword”  from some_table where id = #{id}  
  3. </select>  

也可以使用resultMap進(jìn)行映射的指定

 

  1. <resultMap id="userResultMap" type="User">  
  2.     <id property="id" column="user_id" />  
  3.     <result property="username" column="username"/>  
  4.     <result property="password" column="password"/>  
  5. </resultMap>  
  6.  
  7. <select id=”selectUsers” parameterType=”int”  resultMap=”userResultMap”>  
  8.     select user_id, user_name, hashed_password from some_table where id = #{id}  
  9. </select>  


 

2、resultMap高級(jí)映射