一、Mybatis的全局配置文件
1、SqlMapConfig.xml(名稱可變)是mybatis的全局配置文件,配置內容如下:
properties(屬性)
settings(全局配置參數)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境集合屬性對象)
environment(環境子屬性對象)
transactionManager(事務管理)
dataSource(數據源)
mappers(映射器)
2、properties
將數據庫連接參數單獨配置在db.properties(名稱可變)中,放在類路徑下。這樣只需要在SqlMapConfig.xml中加載db.properties的屬性值。這樣在SqlMapConfig.xml中就不需要對數據庫連接參數硬編碼。將數據庫連接參數只配置在db.properties中,原因:方便對參數進行統一管理,其它xml可以引用該db.properties
例如:db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
相應的SqlMapConfig.xml
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
注意: MyBatis 將按照下面的順序來加載屬性:
首先、在properties標簽中指定的屬性文件首先被讀取。
其次、會讀取properties元素中resource或 url 加載的屬性,它會覆蓋已讀取的同名屬性。
最后、讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
常用做法:
不要在properties元素體內添加任何屬性值,只將屬性值定義在外部properties文件中。
在properties文件中定義屬性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX的形式,就像jdbc.driver。這樣可以防止和parameterType傳遞的屬性名沖突,從而被覆蓋掉。
3、settings
mybatis全局配置參數,全局參數將會影響mybatis的運行行為。比如:開啟二級緩存、開啟延遲加載。具體可配置情況如下:

配置示例:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
</settings>
4、typeAliases
typeAliases可以用來自定義別名。在mapper.xml中,定義很多的statement,而statement需要parameterType指定輸入參數的類型、需要resultType指定輸出結果的映射類型。如果在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterType或resultType指定的類型定義一些別名,在mapper.xml中通過別名定義,方便開發。
例如:
<typeAliases>
<!-- 單個別名定義 -->
<typeAlias alias="user" type="com.kang.pojo.User"/>
<!-- 批量別名定義,掃描整個包下的類,別名為類名(首字母大小寫都可以) -->
<package name="com.kang.pojo"/>
<package name="其它包"/>
</typeAliases>
mapper.xml的引用形式
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id=#{value}
</select>
5、typeHandlers
mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。通常情況下,mybatis提供的類型處理器滿足日常需要,不需要自定義。具體可參考Mybatis的官方文檔。
6、environments
MyBatis 可以配置多種環境。這會幫助你將 SQL 映射應用於多種數據庫之中。但是要記得一個很重要的問題:你可以配置多種環境,但每個數據庫對應一個 SqlSessionFactory。所以,如果你想連接兩個數據庫,你需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。而如果是三個數據庫,你就需要三個實例,以此類推。
為了明確創建哪種環境,你可以將它作為可選的參數傳遞給 SqlSessionFactoryBuilder。
可以接受環境配置的兩個方法簽名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);
如果環境被忽略,那么默認環境將會被加載,按照如下方式進行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
配置示例:
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理,事務控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 數據庫連接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
注意:
---默認的環境 ID(比如: default=”development”)。
---每個 environment 元素定義的環境 ID(比如: id=”development”)。
---事務管理器的配置(比如: type=”JDBC”)。
默認的環境和環境 ID 是自我解釋的。你可以使用你喜歡的名稱來命名,只要確定默認的要匹配其中之一。
7、mappers
Mapper配置的幾種方法:
第一種(常用)
<mapper resource=" " /> resource指向的是相對於類路徑下的目錄
如:<mapper resource="sqlmap/User.xml" />
第二種
<mapper url=" " /> 使用完全限定路徑
如:<mapper url="file:///D:\workspace\mybatis1\config\sqlmap\User.xml" />
第三種
<mapper class=" " /> 使用mapper接口類路徑
如:<mapper class="cn.kang.mapper.UserMapper"/>
注意:此種方法要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中。
第四種(推薦)
<package name=""/> 注冊指定包下的所有mapper接口
如:<package name="cn.kang.mapper"/>
注意:此種方法要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中。
使用示例:
<mappers>
<mapper resource="sqlmap/User.xml"/>
<package name="cn.kang.mapper"/>
</mappers>
二、Mapper映射文件
Mapper.xml映射文件中定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心
Mapper映射文件是一個xml格式文件,必須遵循相應的dtd文件規范,如ibatis-3-mapper.dtd
Mapper映射文件是以<mapper>作為根節點,在根節點中支持9個元素,分別為insert、update、delete、select(增刪改查);cache、cache-ref、resultMap、parameterMap、sql
(一)select、parameterMap、resultType、resultMap
1、<select
<!-- (1)id (必須配置)
id是命名空間中的唯一標識符,可被用來代表這條語句。
一個命名空間(namespace) 對應一個dao接口,
這個id也應該對應dao里面的某個方法(相當於方法的實現),因此id 應該與方法名一致
-->
id="findUserById" --- 對應接口中的方法名
<!--(2)parameterType (可選配置, 默認為mybatis自動選擇處理)
將要傳入語句的參數的完全限定類名或別名, 如果不配置,mybatis會通過ParameterHandler 根據參數類型默認選擇合適的typeHandler進行處理
parameterType 主要指定參數類型,可以是int, short, long, string等類型,也可以是復雜類型(如對象)
-->
parameterType="int"
<!-- (3)resultType (resultType 與 resultMap 二選一配置)
resultType用以指定返回類型,指定的類型可以是基本類型,可以是java容器,也可以是javabean
-->
resultType="User"
<!--(4)resultMap (resultType 與 resultMap 二選一配置)
resultMap用於引用我們通過 resultMap標簽定義的映射類型,這也是mybatis組件高級復雜映射的關鍵
-->
resultMap="userResultMap"
<!--(5)flushCache (可選配置)
將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:false
-->
flushCache="false"
<!--(6)useCache (可選配置)
將其設置為 true,將會導致本條語句的結果被二級緩存,默認值:對 select 元素為 true
-->
useCache="true"
<!--(7)timeout (可選配置)
這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)
-->
timeout="10000"
<!-- (8)fetchSize (可選配置)
這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值為 unset(依賴驅動)
-->
fetchSize="256"
<!--(9)statementType (可選配置)
STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED
-->
statementType="PREPARED"
<!--(10)resultSetType (可選配置)
FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值為 unset (依賴驅動)
-->
resultSetType="FORWARD_ONLY"
>
2、parameterType(輸入類型)
通過parameterType指定輸入參數的類型,類型可以是簡單類型、hashmap、pojo的包裝類型。
#{}實現的是向prepareStatement中的預處理語句中設置參數值,sql語句中#{}表示一個占位符即?。
例如:
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
使用占位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行java類型和jdbc類型的轉換。#{}可以接收
簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。
${}和#{}不同,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如
果parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:
<select id="selectUserByName" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>
使用#{}則傳入的字符串中必須有%號,而%是人為拼接在參數中,顯然有點麻煩,如果采用${}在sql中拼接為%的方式則在調用mapper接口
傳遞參數就方便很多。如果使用${}原始符號則必須人為在傳參數中加%。
List<User> list = userMapper.selectUserByName("%管理員%");
如果使用%${value}%則不用人為在參數中加%。
List<User>list = userMapper.selectUserByName("管理員");
(1)parameterType也可以傳遞pojo對象。Mybatis使用ognl表達式解析對象字段的值,如下例子:
<!—傳遞pojo對象綜合查詢用戶信息 -->
<select id="findUserByUser" parameterType="user" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
上邊%${username}%中的username就是user對象中對應的屬性名稱。
parameterType還可以傳遞pojo包裝對象(也就是將多個對象包裝為一個對象)。開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢
條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數。
例如下面的包裝對象:
public class QueryVo {
private User user;
private UserCustom userCustom;
}
在映射文件中的使用
<!—傳遞pojo包裝對象綜合查詢用戶信息 -->
<select id="findUserByUser" parameterType="queryVo" resultType="user">
select * from user where id=#{user.id} and username like '%${user.username}%'
</select>
可以看出通過使用類似java中對象訪問屬性的形式來進行參數傳遞。
(2)parameterType也可以傳遞hashmap類型的參數
在xml映射文件中使用形式如下:
<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
在代碼中的調用形式如下:
public void testFindUserByHashmap()throws Exception{
SqlSession session = sqlSessionFactory.openSession();//獲取session
UserMapper userMapper = session.getMapper(UserMapper.class);//獲限mapper接口實例
HashMap<String, Object> map = new HashMap<String, Object>();//構造查詢條件Hashmap對象
map.put("id", 1);
map.put("username", "管理員");
List<User>list = userMapper.findUserByHashmap(map);//傳遞Hashmap對象查詢用戶列表
session.close();//關閉session
}
3、resultType(返回值類型)
使用resultType可以進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,才可以映射成功。如果查詢出來的列名和pojo中的屬性名全部不一致,就不會創建pojo對象。但是只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。
resultType可以輸出簡單類型。例如查詢用戶信息的綜合查詢列表總數,通過查詢總數和上邊用戶綜合查詢列表才可以實現分頁。
<!-- 獲取用戶列表總數 -->
<select id="findUserCount" parameterType="user" resultType="int">
select count(*) from user
</select>
resultType可以輸出pojo對象和pojo列表。當使用動態代理時,輸出pojo對象和輸出pojo列表在xml映射文件中定義的resultType是一樣的,而生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 )。
4、resultMap(輸出結果映射)
mybatis中可以使用resultMap完成高級輸出結果映射。如果查詢出來的列名和定義的pojo屬性名不一致,就可以通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。然后使用resultMap作為statement的輸出映射類型。resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
<resultMap type="" id="">
<!-- id:唯一性,注意啦,這個id用於標示這個javabean對象的唯一性, 不一定會是數據庫的主鍵(不要把它理解為數據庫對應
表的主鍵)
property:對應javabean的屬性名,
column:對應數據庫表的列名
這樣,當javabean的屬性與數據庫對應表的列名不一致的時候,就能通過指定這個保持正常映射了)
-->
<id property="" column=""/>
<!-- result與id相比, 對應普通屬性 -->
<result property="" column=""/>
<!--
constructor對應javabean中的構造方法
-->
<constructor>
<!-- idArg 對應構造方法中的id參數 -->
<idArg column=""/>
<!-- arg 對應構造方法中的普通參數 -->
<arg column=""/>
</constructor>
<!--
collection,對應javabean中容器類型, 是實現一對多的關鍵
property 為javabean中容器對應字段名
column 為體現在數據庫中列名
ofType 就是指定javabean中容器指定的類型
-->
<collection property="" column="" ofType=""></collection>
<!--
association 為關聯關系,是實現N對一的關鍵。
property 為javabean中容器對應字段名
column 為體現在數據庫中列名
javaType 指定關聯的類型
-->
<association property="" column="" javaType=""></association>
</resultMap>
(二) insert、update、delete
1、<insert
<!--(1)id (必須配置)
id是命名空間中的唯一標識符,可被用來代表這條語句。
一個命名空間(namespace) 對應一個dao接口,
這個id也應該對應dao里面的某個方法(相當於方法的實現),因此id 應該與方法名一致
-->
id="addUser"
<!--(2) parameterType (可選配置, 默認為mybatis自動選擇處理)
將要傳入語句的參數的完全限定類名或別名, 如果不配置,mybatis會通過ParameterHandler 根據參數類型默認選擇合適
的typeHandler進行處理
parameterType 主要指定參數類型,可以是int, short, long, string等類型,也可以是復雜類型(如對象)
-->
parameterType="user"
<!--(3)flushCache (可選配置,默認配置為true)
將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:true(對應插入、更新和
刪除語句)
-->
flushCache="true"
<!--(4)statementType (可選配置,默認配置為PREPARED)
STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,
默認值:PREPARED。
-->
statementType="PREPARED"
<!--(5)keyProperty (可選配置, 默認為unset)
(僅對 insert 和 update 有用)唯一標記一個屬性,MyBatis 會通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設置它的鍵值,默認:unset。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
-->
keyProperty=""
<!--(6)keyColumn (可選配置)
(僅對 insert 和 update 有用)通過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(像 PostgreSQL)是必須的,當
主鍵列不是表中的第一列的時候需要設置。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
-->
keyColumn=""
<!-- (7)useGeneratedKeys (可選配置, 默認為false)
(僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵
(比如:像 MySQL 和 SQL Server 這樣的關系數據庫管理系統的自動遞增字段),默認值:false。
-->
useGeneratedKeys="false"
<!--(8)timeout (可選配置, 默認為unset, 依賴驅動)
這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)。
-->
timeout="20"
>
2、 <update
id="updateUser"
parameterType="user"
flushCache="true"
statementType="PREPARED"
timeout="20"
>
3、<delete
id="deleteUser"
parameterType="user"
flushCache="true"
statementType="PREPARED"
timeout="20"
>