Mybatis核心組成部分之SQL映射文件揭秘詳解
前言
Mybatis真正強(qiáng)大的地方在于SQL映射語(yǔ)句,這也是它的魅力所在。
相對(duì)于它強(qiáng)大的功能,SQL映射文件的配置卻非常簡(jiǎn)單,我上篇文章語(yǔ)句講了Mybatis的搭建以及核心配置的講解,接下來(lái)咱們就一起來(lái)看看Mybatis另一個(gè)重要的元素-SQL映射文件
首先先介紹一下SQL映射文件的幾個(gè)頂級(jí)元素配置
頂級(jí)元素配置
1、Mapper:映射文件的根元素節(jié)點(diǎn),只有一個(gè)屬性namespace(命名空間),其作用如下
- 用于區(qū)分不同的mapper,全局唯一
- 綁定DAO接口,即面向接口編程。當(dāng)namespace綁定某一接口之后,就可以不用寫(xiě)該接口的實(shí)現(xiàn)類(lèi),Mybatis會(huì)通過(guò)接口的完整限定名查找到對(duì)應(yīng)的mapper配置來(lái)執(zhí)行SQL語(yǔ)句。因此namespace的命名必須要跟接口名同名
2、cache:配置給定命名空間引用緩存。
3、cache-ref:從其他命名空間引用緩存配置
4、resultMap:用來(lái)描述數(shù)據(jù)庫(kù)結(jié)果集和對(duì)象的對(duì)象關(guān)系(鍵值對(duì))
5、sql:可以重用的sql塊,也可以被其他語(yǔ)句引用。
6、insert:映射插入的語(yǔ)句
7、update:映射更新的語(yǔ)句
8、delete:映射刪除的語(yǔ)句
9、select:映射查詢(xún)的語(yǔ)句
接下來(lái)我就逐一的為大家介紹
select:映射查詢(xún)語(yǔ)句
<!--根據(jù)用戶(hù)名稱(chēng)查詢(xún)用戶(hù)列表(模糊查詢(xún))-->
<select id="getUserListByUserName" resultType="User" parameterType="string">
select * from user_info where userName like CONCAT('%',#{userName},'%')
</select>
上面這段代碼是一個(gè)id為getUserListByUserName的映射語(yǔ)句,參數(shù)類(lèi)型為string,返回結(jié)果的類(lèi)型是User,注意參數(shù)的傳遞使用#{參數(shù)名},它告訴Mybatis生成PreparedStatement參數(shù),對(duì)于JDBC,該參數(shù)會(huì)被標(biāo)識(shí)為“?”,若采用JDBC來(lái)實(shí)現(xiàn),那代碼就得換一下方式了
String sql="select * from user_info where userName like CONCAT('%',?,'%')";
PreparedStatement ps=conn.preparedStatement(sql);
ps.setString(1,userName);
從上面兩端代碼我相信大家都能看出區(qū)別,Mybatis節(jié)省了大量的代碼,我相信大家會(huì)喜歡上它的
接下來(lái)我來(lái)介紹一下select映射語(yǔ)句中的家庭成員吧!
- id:命名空間中唯一的標(biāo)識(shí)符,可以被用來(lái)引用這條語(yǔ)句
- parameter:表示查詢(xún)語(yǔ)句傳遞參數(shù)的類(lèi)型的完全限定名或別名。它支持基礎(chǔ)數(shù)據(jù)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型,就比如咱們上面用到的string就是一個(gè)基礎(chǔ)數(shù)據(jù)類(lèi)型,當(dāng)然你會(huì)發(fā)現(xiàn)這的string的s是小寫(xiě),其實(shí)它只是一個(gè)別名,還是代表String,只不過(guò)它屬于一個(gè)內(nèi)建的類(lèi)型別名,那么以此類(lèi)推,對(duì)于普通的Java類(lèi)型,也有許多的內(nèi)建類(lèi)型別名,并且它們對(duì)大小寫(xiě)不明感,介意大家去閱讀以下Mybatis的幫助文檔。
- resultType:查詢(xún)語(yǔ)句返回結(jié)果類(lèi)型的完全限定名或別名,別名的使用方式與parameterType的使用方式是一致的
接下來(lái)我就用一個(gè)實(shí)例來(lái)向大家演示一下
首先我弄了一個(gè)以用戶(hù)名、用戶(hù)角色來(lái)查詢(xún)用戶(hù)列表的功能,咱們先創(chuàng)建UserMapper.java文件
public interface UserMapper {
public List<User> getUserList(Map<String,String> userMap);
}
從上面大家可以看到我用來(lái)一個(gè)集合來(lái)接受返回的結(jié)果集,并且傳遞的參數(shù)是一個(gè)user對(duì)象
下面再來(lái)編寫(xiě)UserMapper.xml文件的主體內(nèi)容
<!--查詢(xún)用戶(hù)列表(參數(shù):對(duì)象入?yún)ⅲ?->
<select id="getUserList" resultType="user" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole=#{userRole} and u.userRole=r.id
</select>
上面便是咱們此次測(cè)試的查詢(xún)映射語(yǔ)句了,這和我在上面說(shuō)的映射語(yǔ)句區(qū)別不大,唯一大點(diǎn)的區(qū)別就在于參數(shù)類(lèi)型,這的參數(shù)類(lèi)型我換成了一個(gè)Map集合。
接下來(lái)就可以去測(cè)試了。
@Test
public void getUserList(){
SqlSession sqlSession=null;
List<User> userList=new ArrayList<User>();
try{
sqlSession=MyBatisUtil.createSqlSession();
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("uName","趙");
userMap.put("uRole","3");
userList=sqlSession.getMapper(UserMapper.class).getUserListMap(userMap);
}catch(Exception e){
e.printStackTrace();
}finally{
MyBatisUtil,closeSqlSession(sqlSession);
}
for(User user:userList){
logger.debug("testGetUserList userCode:"+user.getUserCode()+"and userName:"+user.getUserName());
}
}
resultMap
接下來(lái)說(shuō)說(shuō)resultMap,我們?yōu)槭裁匆胷esultMap呢?
用小編的話(huà)說(shuō):當(dāng)我們要使用的查詢(xún)映射語(yǔ)句是需要關(guān)聯(lián)多表的時(shí)候,那么一個(gè)實(shí)體類(lèi)的字段就不夠用了,比如User表中有一個(gè)部門(mén)ID,而部門(mén)ID又對(duì)應(yīng)了部門(mén)表,我們想查詢(xún)部門(mén)名稱(chēng)而不是查詢(xún)部門(mén)ID,這時(shí)候我們就要在User實(shí)體類(lèi)中加入一個(gè)部門(mén)名稱(chēng)屬性,且該屬性的類(lèi)型為部門(mén)實(shí)體類(lèi),
到這我們就需要使用resultMap了
<select id="getUserList" resultMap="user" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole=#{userRole} and u.userRole=r.id
</select>
<resultMap id="userList" type="User">
<result property="userRole" column="roleName"/>
</resultMap>
resultMap元素用來(lái)描述如何將結(jié)果集映射到j(luò)ava對(duì)象,此處使用resultMap對(duì)列表展示所需的必要字段來(lái)進(jìn)行自由映射。接下來(lái)看看resultMap元素的屬性值和子節(jié)點(diǎn)吧
- id屬性:唯一標(biāo)識(shí)符,此id值用于select元素resultMap屬性的引用
- type屬性:表示該result的映射結(jié)果類(lèi)型
- result子節(jié)點(diǎn):用于標(biāo)識(shí)一些簡(jiǎn)單屬性,其中column屬性表示從數(shù)據(jù)庫(kù)中查詢(xún)的字段名,property則表示查詢(xún)出來(lái)的字段對(duì)應(yīng)的值賦給實(shí)體對(duì)象的哪個(gè)屬性。
Mybatis中對(duì)查詢(xún)進(jìn)行select映射的時(shí)候,返回類(lèi)型可以用resultType,也可以用resultMap,那么resultType和resultMap到底有何關(guān)聯(lián)呢?接下里小編就做一下詳細(xì)的講解
resultType
resultType直接表示返回類(lèi)型,包括基礎(chǔ)數(shù)據(jù)庫(kù)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型
resultMap
resultMap則是對(duì)外部resultMap定義的引用,對(duì)外部resultMap的ID,表示返回結(jié)果映射到哪一個(gè)resultMap上,它的應(yīng)用場(chǎng)景一般是:數(shù)據(jù)庫(kù)字段信息與對(duì)象屬性不一致或者需要做復(fù)雜的聯(lián)合查詢(xún)以便自由控制映射結(jié)果。
resultType與resultMap的關(guān)聯(lián)
在Mybatis的select元素中,resultType和resultMap本質(zhì)上是一樣的,都是Map數(shù)據(jù)結(jié)構(gòu),但需要明確的一點(diǎn):resultType屬性和resultMap屬性絕對(duì)不能同時(shí)存在,只能二者選其一。
接下來(lái)說(shuō)說(shuō)使用Mybatis實(shí)現(xiàn)增刪改的操作,其實(shí)這幾個(gè)操作都大同小異(小編認(rèn)為的)。
insert
<insert id="add" parameterType="User">
INSERT INTO `smbms`.`smbms_user`(`userCode`, `userName`, `userPassword`, `gender`, `birthday`, `phone`, `address`, `userRole`, `createdBy`, `creationDate`)
VALUES (#{userCode}, #{userName}, #{userPassword}, #{gender}, #{birthday}, #{phone}, #{address}, #{userRole}, #{createdBy}, #{creationDate})
</insert>
update
<update id="modify" parameterType="User">
update smbms_user set userCode=#{userCode} where id=#{uId}
</update>
delete
<delete id="del" parameterType="User">
delete from smbms_user where id=#{id}
</delete>
從上面的操作中可以看出其實(shí)這三種操作都差不多,其中的屬性也都見(jiàn)過(guò)哈!那么小編在這就不多做介紹了,上面我所說(shuō)的都是SQL映射文件最基礎(chǔ)的一些東西,后面還有動(dòng)態(tài)SQL之類(lèi)的我在這就不做介紹了,感興趣的童鞋可以去查查(我覺(jué)得闊以)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中實(shí)現(xiàn)String字符串分割的3種方法
這篇文章主要介紹了Java中實(shí)現(xiàn)String字符串分割的3種方法,文章底部介紹了JAVA?截取字符串的三種方法subString,StringUtils,split,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
SpringBoot進(jìn)行多表查詢(xún)功能的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot進(jìn)行多表查詢(xún)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Spring之AOP兩種代理機(jī)制對(duì)比分析(JDK和CGLib動(dòng)態(tài)代理)
這篇文章主要介紹了Spring之AOP兩種代理機(jī)制對(duì)比分析(JDK和CGLib動(dòng)態(tài)代理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Mybatis中連接查詢(xún)和嵌套查詢(xún)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Mybatis中連接查詢(xún)和嵌套查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java中基于maven實(shí)現(xiàn)zxing二維碼功能
這篇文章主要介紹了Java中基于maven實(shí)現(xiàn)zxing二維碼功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

