mybatis的知識點總結


1.接口綁定:兩種方法,基於注解或者基於xml文檔mapper,但要注意mapper的namespace要與接口路徑完全一致。

2.orm格式轉換:通過設置resultMap和ResultType,將數據庫中的記錄轉換為代碼的bean對象。得到list或者對象。

3.通過parameterType接收參數,進行動態sql生成。運用ognl表達式

4.走緩存,設置二級緩存。設置二級緩存源。

5.為什么要通過orm框架來走緩存呢?因為自己配置緩存策略相對復雜,比如當insert/update/delete時,要清除相應的緩存。當某些情況select又要添加進緩存。

6.orm框架,orm框架,它是怎么進行對象和數據庫中表的轉換的呢?答:數據庫中的表要與代碼中的類一一對應,包括屬性。這樣不就能進行匹配轉換了嘛。

5.返回list,必須要配置resultMAp

6.insert操作時,要注意主鍵 主鍵生成策略,要設置useGeneraterKey = true,和 keyProperty="id",指定哪個是主鍵

<insert id="addUser" parameterType="User" 
        useGeneratedKeys="true" keyProperty="id"> 
        insert into user(userName,userAge,userAddress)  
             values(#{userName},#{userAge},#{userAddress})  
    </insert>

7.spring在於mybatis集成時,spring負責什么呢?誰來維護datasource,誰來建立sqlSessionFactory?

答:spring作為多個框架的粘合劑,spring負責建立datasource,sqlsessionFactpry。充分利用spring的ioc和aop功能。

 spring 配置文件:applicationContext.xml 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">//spring管理配置datasource <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> //spring管理配置sqlsessionFactory <!--dataSource屬性指定要用到的連接池--> <property name="dataSource" ref="dataSource"/> <!--configLocation屬性指定mybatis的核心配置文件--> <property name="configLocation" value="config/Configuration.xml"/> </bean>

8.Mybatis的dao實現接口(接口綁定),是由mybatis來實現的,那又怎么來使用這個實現類呢?

答:當然是注冊到spring里了,作為一個bean使用。

即:mybatis的dao實現類,也都要注冊到spring的ioc容器中,以便利用spring的ioc和aop功能。

注意此時dao實現類,的具體類是mybatis固定的org.mybatis.spring.mapper.MapperFactoryBean類,這個類專門用來生成具體的dao實現類。

但要記住,一切的增刪改查都是通過session來進行的,所以dao實現類要di依賴注入sqlSessionFactory這個屬性。

再利用mapperInterface指定具體的mapper接口類。

spring 配置文件:applicationContext.xml 

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!--sqlSessionFactory屬性指定要用到的SqlSessionFactory實例--> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> <!--mapperInterface屬性指定映射器接口,用於實現此接口並生成映射器對象--> <property name="mapperInterface" value="com.yihaomen.mybatis.inter.IUserOperation" /> </bean>

9.即:mybatis的dao實現類,也都要注冊到spring的ioc容器中,以便利用spring的ioc和aop功能。

10.spring的配置文件applicationContext.XML負責配置與數據庫相關,與mybatis sqlSessionFaction 整合,掃描所有mybatis mapper 文件等相關內容。

事務管理器也在spring的配置文件中配置,同時要依賴注入datasource屬性

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
    </bean>

11.mybatis的分頁功能,可以自己利用mysql代碼實現,也可以利用mybatis分頁插件,如pageHelper

12.mybatis的傳入參數只能是一個,只能有1個。可以是各種Java的基本數據類型:包含int,String,Date等。基本數據類型作為傳參,只能傳入一個。通過#{參數名} 即可獲取傳入的值 ,復雜數據類型:包含JAVA實體類、Map。通過#{屬性名}或#{map的KeyName}即可獲取傳入的值,但是如果想傳入一個collection怎么辦呢?

經查找后發現可以使用mapper配置文件中的foreach語句,借用別人寫的文章:

13. foreach

對於動態SQL 非常必須的,主是要迭代一個集合,通常是用於IN 條件。List 實例將使用“list”做為鍵,數組實例以“array” 做為鍵。

foreach元素是非常強大的,它允許你指定一個集合,聲明集合項和索引變量,它們可以用在元素體內。它也允許你指定開放和關閉的字符串,在迭代之間放置分隔符。這個元素是很智能的,它不會偶然地附加多余的分隔符。

14. 在Java實體對象對中,一對多可以根據List和Set來實現,兩者在mybitis中都是通過collection標簽來配合使用

 

15.

一對一關聯

根據班級id查詢班級信息(帶老師的信息)
10         ##1. 聯表查詢
11         SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;
<select id="getClass" parameterType="int" resultMap="ClassResultMap">
24         select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
25     </select>
26     <!-- 使用resultMap映射實體類和字段之間的一一對應關系 -->
27     <resultMap type="me.gacl.domain.Classes" id="ClassResultMap">
28         <id property="id" column="c_id"/>
29         <result property="name" column="c_name"/>
30         <association property="teacher" javaType="me.gacl.domain.Teacher">
31             <id property="id" column="t_id"/>
32             <result property="name" column="t_name"/>
33         </association>
34     </resultMap>
<!-- 
37     方式二:嵌套查詢:通過執行另外一個SQL映射語句來返回預期的復雜類型
38         SELECT * FROM class WHERE c_id=1;
39         SELECT * FROM teacher WHERE t_id=1   //1 是上一個查詢得到的teacher_id的值
40     -->
41      <select id="getClass2" parameterType="int" resultMap="ClassResultMap2">
42         select * from class where c_id=#{id}
43      </select>
44      <!-- 使用resultMap映射實體類和字段之間的一一對應關系 -->
45      <resultMap type="me.gacl.domain.Classes" id="ClassResultMap2">
46         <id property="id" column="c_id"/>
47         <result property="name" column="c_name"/>
48         <association property="teacher" column="teacher_id" select="getTeacher"/>
49      </resultMap>
50      
51      <select id="getTeacher" parameterType="int" resultType="me.gacl.domain.Teacher">
52         SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
53      </select>

 MyBatis中使用association標簽來解決一對一的關聯查詢,association標簽可用的屬性如下:

  • property:對象屬性的名稱
  • javaType:對象屬性的類型
  • column:所對應的外鍵字段名稱
  • select:使用另一個查詢封裝的結果

15.

2.6、MyBatis一對多關聯查詢總結

  MyBatis中使用collection標簽來解決一對多的關聯查詢,ofType屬性指定集合中元素的對象類型。

本文部分轉自http://www.cnblogs.com/xdp-gacl/p/4264440.html

16.mybatis調用存儲過程

三、編輯userMapper.xml

  編輯userMapper.xml文件,添加如下的配置項

復制代碼
 1 <!-- 
 2         查詢得到男性或女性的數量, 如果傳入的是0就女性否則是男性
 3      -->
 4     <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
 5         CALL mybatis.ges_user_count(?,?)
 6     </select>
 7     
 8     <!--
 9         parameterMap.put("sexid", 0);
10         parameterMap.put("usercount", -1);
11      -->
12     <parameterMap type="java.util.Map" id="getUserCountMap">
13         <parameter property="sexid" mode="IN" jdbcType="INTEGER"/>
14         <parameter property="usercount" mode="OUT" jdbcType="INTEGER"/>
15     </parameterMap>
復制代碼
四、編寫單元測試代碼

復制代碼
 1 package me.gacl.test;
 2 
 3 import java.util.HashMap;
 4 import java.util.List;
 5 import java.util.Map;
 6 
 7 import me.gacl.custom.model.ConditionUser;
 8 import me.gacl.domain.User;
 9 import me.gacl.util.MyBatisUtil;
10 import org.apache.ibatis.session.SqlSession;
11 import org.junit.Test;
12 
13 /**
14  * @author gacl
15  * 測試調用存儲過程
16  */
17 public class Test6 {
18     
19     @Test
20     public void testGetUserCount(){
21         SqlSession sqlSession = MyBatisUtil.getSqlSession();
22         /**
23          * 映射sql的標識字符串,
24          * me.gacl.mapping.userMapper是userMapper.xml文件中mapper標簽的namespace屬性的值,
25          * getUserCount是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
26          */
27         String statement = "me.gacl.mapping.userMapper.getUserCount";//映射sql的標識字符串
28         Map<String, Integer> parameterMap = new HashMap<String, Integer>();
29         parameterMap.put("sexid", 1);
30         parameterMap.put("usercount", -1);
31         sqlSession.selectOne(statement, parameterMap);
32         Integer result = parameterMap.get("usercount");
33         System.out.println(result);
34         sqlSession.close();
35     }
36 }
復制代碼

代碼轉自http://www.cnblogs.com/xdp-gacl/p/4270352.html

 


免責聲明!

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



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