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
