Mybatis映射檔案
Mapper映射檔案是Java實體類與資料庫對象之間的橋梁,使用過程中一個Mapper檔案對應一個資料庫操作Dao接口
一、檔案的限制
加載映射檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
二、主配置引入
mybatis架構需要加載Mapper.xml映射檔案,在主配置檔案中添加映射
<mappers>
<mapper resource="com/fyl/mapper/NewsMapping.xml"/>
<mapper resource="com/fyl/mapper/UserMapping.xml"/>
</mappers>
三、元素節點
mapper 為元素的根節點
namespace:命名空間,一個namespace對應一個dao接口
<mapper namespace="com.fyl.mapper.UserMapping">
以<mapper>作為根節點,在根節點中支援9個元素,分别為
cache-給定命名空間的緩存配置。 cache-ref:其他命名空間緩存配置的引用 resultMap:是最複雜最強大的元素,用來描述如何從資料庫結果集中來加載 requestMap: sql:可被其他語句引用的可重用語句塊 insert:映射插入語句 update:映射更新語句 delete:映射删除語句 select:映射查詢語句 |
四、常見屬性
<select id="find" parameterType="int" resultType="com.fyl.entity.User">
select * from user where uid=#{uid}
</select>
1.id (必須配置)
id是命名空間的唯一辨別符,可被用來代替這條語句,一個命名空間對應一個dao層接口,這個id相當與對應dao裡面的某個方法,相當于某個方法的實作,是以id應該與方法名一緻
2.parameterType(可選配置,預設為mybatis自動選擇處理)
将要傳入語句的參數的完全限定類名或别名,如果不配置,mybatis會通過ParameterType根據參數類型預設選擇何時的typeHandler進行處理。ParameterType主要指定參數類型,可以是int,short,long,亦可以是複雜類型如類,集合等
3.resultType(傳回資料類型)
傳回期望類别類型的完全限定名或别名,集合的情況,是集合包含的類型,而不是集合本身。使用resultMap或resultType。
4.resultMap(複雜傳回)
傳回資料類型,命名引用外部的resultMap。傳回map是MyBatis最具力量的特性,對其有一個很好的了解的話,許多複雜映射的情形就能被解決了。使用resultMap或resultType,但不能同時使用
5. flushCache
若将其設定為true,不論語句什麼時候被調用,都會導緻緩存被清空,預設值:false
6.statementType(可選配置,預設為PREPARED)
STATEMENT<PREPARED或CALLABLE的一個,這會讓MyBatis分别使用Statement,PreparedStatement或CallableStatement
7.KeyProperty(僅對insert有用, 預設:unset,)
唯一辨別一個屬性,MyBatis會通過getGenerateKeys的傳回值後者通過insert語句selectKey子元素設定它的鍵值,如果希望得到多個生成的列,也可以是逗号分隔的屬性名稱清單
8.KeyColumn(僅對insert和update有用)
通過生成的鍵值設定表中的列名,這個設定盡在某些資料庫是必須多的,當主鍵列不是表中的第一列的時候需要設定,如果希望得到過個生成的列,也可以是逗号分割的屬性名稱清單。
9.userGeneratekeys(預設為false)
僅對insert有用,令Mybatis使用jdbc的getGeneratedkeys方法來取出由資料庫内部生成的主鍵(如mysql)管理資料庫系統的自動遞增字段。
10.Timeout(預設值為unset,依賴驅動)
這設定是在抛出異常之前,驅動程式等待資料庫傳回請求結果的描述,預設為unset(依賴驅動)
五、常見屬性分析
(1)parameterType使用
Mybatis的傳入參數parameterType類型分為:
基本資料類型:int,string,long,data
複雜資料類型:實體類和Map
如何擷取參數中的值:
基本資料類型:#{參數}擷取參數中的值
複雜資料類型:類是#{屬性名},map中則是#{key}
注:傳入多個參數如何寫:
無論傳入的參數是什麼,最後mybatis都會将傳入的轉換為map的,既然這樣,當傳入多個參數是,直接map類型,然後mapper.xml通過#{map.key}來擷取值即可,實作動态搜尋,或多個參數查詢
I :Dao層的函數方法
public User selectUser(String username,String password);
<select id=”selectUser”resultType=”User”>
Select * from user where username=#{0} and password=#{1}>
</select>
注:#{0}代表接收的是dao層的第一個參數,#{1}代表的是dao層的第二個參數
II: Map傳多參數
DAO: public User selectUser(Map paramMap);
<select id=”selectUser” resultType=”User”>
Select * from user where username=#{username} and password=#{password}
</select>
Service:
Private User selectUser(){
Mao paramMap=new hashMap();
paramMap.put(“username”,”對應具體的參數值”);
paramMap.put(“password”,”對應具體的參數值“);
User user=xx.selectUser(paramMap);
III:基于注解(推薦)
public List<User> selectUser(@Param(“username”)String username, @Param(“password”)String password)
<select id=”selectUser” resultMap=”usermap”>
<select * from user where username=#{username} and password=#{password}
</select>
(2) resultType:
用于指定傳回類型,指定的類型可以是基本類型,可以是類,注意類要寫全名,并且如果傳回是集合,傳回類型為集合中泛型的類型
(3)resultMap:
resultMap和resultType作用類似,用于引導通過resultMap标簽定義的映射類型,查詢複雜資料,查詢多個表資料映射到一個結果集當中。如果需要查詢的隻是一個表。可以簡單定義實體類,實體代表資料庫表中的一條記錄,可以使用resultType;如果遇到一對多的問題,查詢是需要查詢多個表的列資訊,那麼便要使用resultMap
使用resultMap 裡面的值為:resultMap标簽的id
六、resultMap标簽詳解
配置resultMap标簽
<!--column不做限制,可以為任意表的字段,而property須為type 定義的pojo屬性-->
<resultMap id=" " type=" ">
id :唯一的辨別 type:映射的pojo對象
<id column=" " jdbcType=" " property=" " />
<result column=" " jdbcType=" " property=" "/>
<association property=" " javaType=" ">
<!--Property: pojo的一個對象屬性-->
<!--javaType: pojo關聯的pojo對象-->
<id column=" " jdbcType=" " property=" "/>
<!--Column: 關聯pojo對象對應表的主鍵字段-->
<!--JdbcType:字段類型-->
<!--Property: 關聯pojo對象的主鍵屬性-->
<result column=" " jdbcType=" " property=" "/>
</association>
<!-- 集合中的property須為oftype定義的pojo對象的屬性-->
<collection property=" " ofType=" ">
<!--Property: pojo的集合屬性-->
<!--ofType: 集合中的pojo對象-->
<id column=" " jdbcType=" " property=" " />
<!--Column: 集合中pojo對象對應的表的主鍵字段-->
<!--jdbcType: 字段類型-->
<!--property: 集合中pojo對象的主鍵屬性-->
<result column=" " jdbcType="字段類型" property=" " />
<!--Column: 可以為任意表的字段-->
<!-- Property: 集合中的pojo對象的屬性-->
</collection>
</resultMap>
注:resultMap中對象屬性類中的字段和前面的字段名字最好别重複,否則查詢時會顯示前面的值;
對象屬性類中的字段要在sql語句中列出
七、#{}和${}
#{}表示一個占位符号,通過#{}可以實作preparedStatement向占位符中設定值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。#{}可以接收簡單類型或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括号中可以是value或其他名稱。
${}表示拼接sql,通過${}可以将parameterType傳入的内容拼接在sql中且不進行jdbc類型轉換,${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括号中隻能是value
例:實作模糊查詢:
第一種使用#{}完成
<select id=”queryUser” parameterType=”string”
resultType=”com.fyl.User”>
select * from user where username LIKE #{username}
</select>
測試:List<Object> list=sqlSession.selectList(“queryUser”,”%張%”);
第二種:使用${}完成
<select id=”queryUser” parameterType=”string”
resultType=”com.fyl.User”>
select * from user where username LIKE ‘%${value}%’
<select>
測試:List<Object> list=sqlSession.selectList(“queryUser”,”張”);
注:Mybatis使用order by 動态傳參問題?
mybatis在使用order by 時,要使用$符号,而不是#符号。
#将傳入的資料都當成一個字元串,會對自動傳入的資料加一個雙引号,如
order by #{id} 傳入為id,解析為 order by ‘id’;
$将傳入的值直接顯示生成在sql中,如order by ${id}傳入為id,解析為order by id;