本次主要來了解:MyBatis資料庫配置檔案SqlMapConfig.xml
SQL映射配置中輸入映射的配置
SQL映射配置中輸出映射的配置
SQL映射配置中動态SQL語句的配置
1. SqlMapConfig配置檔案詳解
主要來配置MyBatis的一些核心資訊。配置名稱配置含義配置簡介configuration包裹所有配置标簽整個配置檔案的頂級标簽
properties屬性該标簽可以引入外部配置的屬性,也可以自己配置。該配置标簽所在的同一個配置檔案中的其他配置均可引用次配置中的屬性
setting全局配置參數用來配置一些改變運作時行為的資訊。例如是否使用緩存機制,是否使用延遲加載,是否使用錯誤處理機制等。并且可以設定最大并發請求數量、最大并發事務數量,以及是否啟用命名空間等。
typeAliases類型别名用來設定一些别名來替代Java的長類型聲明(如: java.lang.int變為int),減少配置編碼的備援
typeHandlers類型處理器将SQL中傳回的資料庫類型轉換為相應的Java類型的處理器配置
objectFactory對象工廠執行個體化目标類的工廠類配置
plugins插件可以通過插件修改MyBatis的核心行為,例如對語句執行的某一點進行攔截調用
environments環境集合屬性對象資料庫環境配置的詳細配置
environment環境子屬性對象資料庫環境的配置資訊
transactionManager事務管理指定MyBatis的事務管理器
dataSource資料源使用其中的type指定資料源的連接配接類型,在标簽對中可以使用property屬性指定資料庫連接配接池的其他資訊
mappers映射器配置SQL映射檔案的位置,告知MyBatis去哪裡加載SQL映射配置<?xml version="1.0" encoding="UTF-8"?>configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
關于SqlMapConfig.xml各個配置名稱的詳細說明請通路
:MyBatis配置檔案詳解
2. Mapper映射檔案
Mapper映射檔案,主要就是用來配置SQL映射語句的,根據不同的SQL語句性質,要使用不同的标簽來包裹。
Mapper配置檔案标簽:标簽名稱标簽作用insert用來映射插入語句
update用來映射更新語句
delete用來映射删除語句
select用來映射查詢語句
resultMap用來将從資料庫結果集取出的資料映射到相應的實體對象的相應字段中
sql配置可以被其他語句引用的SQL語句塊
cache給定命名空間的緩存配置
cache-ref其他命名空間緩存配置的引用
parameterMap參數映射,該配置現已被抛棄
select、insert、delete、update樣例:
SELECT * FROM USER WHERE id=#{id}
SELECT * FROM USER WHERE username LIKE '%${value}'
INSERT INTO USER(username, password, gender, birthday, email, province, city)
VALUE (#{username}, #{password}, #{gender}, #{birthday,jdbcType=DATE}, #{email}, #{province}, #{city})
DELETE FROM USER WHERE id=#{id}
UPDATE USER SET username=#{username} where id=#{id}
關于mapper.xml各個配置檔案的詳細說明請通路
:Mapper XML檔案詳解
3. Mapper配置動态SQL語句在Mapper配置檔案中,有時候需要根據一些查詢條件來選擇不同的SQL語句,或者将一些使用頻率極高的SQL語句單獨配置,在需要的地方引用。MyBatis提供了一種可以根據條件動态配置SQL語句,以及單獨配置SQL語句塊的機制。
當查詢語句的查詢條件由于輸入參數的不同而無法确切定義時,可以使用“”标簽對來包裹需要動态指定的SQL查詢條件,而在“”标簽對中,可以使用“”條件來分情況設定SQL查詢條件。
下面的樣例設定了,當輸入參數的Java包裝類中含有的條件不同時,查詢條件可動态變化:
SELECT * FROM USER
AND user.gender = #{UserQueryVo.gender}
AND user.username LIKE '%${UserQueryVo.username}%'
上面的輸入參數為封裝了查詢條件的包裝類,在查詢條件中使用了動态配置,當性别gender、username不為空時,将其作為查詢條件之一,若其中一個為空,不将其作為查詢條件。值得注意的是,當使用“”标簽對包裹if條件語句時,将會忽略查詢條件中的第一個“and”(這樣才能組成一個可執行的SQL語句)。
另外,可以将複用性比較強的SQL語句封裝成SQL片段,在需要使用該SQl片段的映射配置中聲明一下,即可引入該SQL語句。聲明如下:
其中id是SQL片段的唯一辨別,是不可重複的。SQL片段支援動态SQL語句,但不支援“”标簽。
下面示例将上面的SQL語句的查詢條件封裝為一個“SQL片段”,然後可供所有的SQL映射配置使用:
SELECT * FROM USER
SELECT COUNT(*) FROM USER
這裡的标簽還可以引用外部mapper.xml檔案的SQL片段,refid隻需寫成該檔案的namespace.sql_id (如:test.query_user_where)
語句包含多個查詢資訊情況(如查詢id為2、4、6的User使用者)SELECT * FROM USER WHERE id=2 OR id=4 OR id=6SELECT * FROM USER WHERE id IN (2,4,6)
而此時如果在Mapper檔案中配置這樣的語句,則需要向SQL配置傳遞一個數組或者List類型的輸入參數,然後MyBatis使用“”标簽去周遊并解析這些數組或List中的值。
示例:
首先輸入參數是一個Java包裝類,其屬性為一個包含多個id資訊的List集合:pubic class UserQueryVo{ //多個id
private List ids; public List getIds(){ return ids;
} public void setIds(List ids){ this.ids = ids;
}
}
在Mapper中配置一個包含foreach查詢條件的動态SQL片段,并在查詢SQL映射中引入它:
id=#{user_id}
SELECT * FROM USER
上面示例使用foreach周遊傳入的ids查詢參數,在foreach标簽中:collection指定輸入對象中的集合屬性;
item為每次周遊生成的對象名;
open為開始周遊時要拼接的串;
close為結束周遊時要拼接的串;
separator為周遊的兩個對象中間需要拼接的串。
上面示例拼出的效果為:“where (id=2 or id=4 or id=6)”
當然,實作“where id in (2,4,6)” 效果的配置與此類似,隻要将拼接字首open屬性改成“and id in(”,separator改為“,”,标簽對中的标簽改為“#{user_id}”,即可:
#{user_id}
作者:LeaveStyle
連結:https://www.jianshu.com/p/5448403c6e3d