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;