欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis核心組成部分之SQL映射文件揭秘詳解

 更新時間:2018年11月11日 11:44:38   作者:DearLoser  
MyBatis真正的力量是在映射語句中,下面這篇文章主要給大家介紹了關(guān)于Mybatis核心組成部分之SQL映射文件揭秘的相關(guān)資料,現(xiàn)在分享給大家,給大家做個參考。一起跟隨小編過來看看吧

前言

Mybatis真正強(qiáng)大的地方在于SQL映射語句,這也是它的魅力所在。

相對于它強(qiáng)大的功能,SQL映射文件的配置卻非常簡單,我上篇文章語句講了Mybatis的搭建以及核心配置的講解,接下來咱們就一起來看看Mybatis另一個重要的元素-SQL映射文件

首先先介紹一下SQL映射文件的幾個頂級元素配置

頂級元素配置

1、Mapper:映射文件的根元素節(jié)點,只有一個屬性namespace(命名空間),其作用如下

  • 用于區(qū)分不同的mapper,全局唯一
  • 綁定DAO接口,即面向接口編程。當(dāng)namespace綁定某一接口之后,就可以不用寫該接口的實現(xiàn)類,Mybatis會通過接口的完整限定名查找到對應(yīng)的mapper配置來執(zhí)行SQL語句。因此namespace的命名必須要跟接口名同名

2、cache:配置給定命名空間引用緩存。

3、cache-ref:從其他命名空間引用緩存配置

4、resultMap:用來描述數(shù)據(jù)庫結(jié)果集和對象的對象關(guān)系(鍵值對)

5、sql:可以重用的sql塊,也可以被其他語句引用。

6、insert:映射插入的語句

7、update:映射更新的語句

8、delete:映射刪除的語句

9、select:映射查詢的語句

接下來我就逐一的為大家介紹

select:映射查詢語句

<!--根據(jù)用戶名稱查詢用戶列表(模糊查詢)-->
<select id="getUserListByUserName" resultType="User" parameterType="string">
select * from user_info where userName like CONCAT('%',#{userName},'%')
</select>

上面這段代碼是一個id為getUserListByUserName的映射語句,參數(shù)類型為string,返回結(jié)果的類型是User,注意參數(shù)的傳遞使用#{參數(shù)名},它告訴Mybatis生成PreparedStatement參數(shù),對于JDBC,該參數(shù)會被標(biāo)識為“?”,若采用JDBC來實現(xiàn),那代碼就得換一下方式了

String sql="select * from user_info where userName like CONCAT('%',?,'%')";
PreparedStatement ps=conn.preparedStatement(sql);
ps.setString(1,userName);

從上面兩端代碼我相信大家都能看出區(qū)別,Mybatis節(jié)省了大量的代碼,我相信大家會喜歡上它的
接下來我來介紹一下select映射語句中的家庭成員吧!

  • id:命名空間中唯一的標(biāo)識符,可以被用來引用這條語句
  • parameter:表示查詢語句傳遞參數(shù)的類型的完全限定名或別名。它支持基礎(chǔ)數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型,就比如咱們上面用到的string就是一個基礎(chǔ)數(shù)據(jù)類型,當(dāng)然你會發(fā)現(xiàn)這的string的s是小寫,其實它只是一個別名,還是代表String,只不過它屬于一個內(nèi)建的類型別名,那么以此類推,對于普通的Java類型,也有許多的內(nèi)建類型別名,并且它們對大小寫不明感,介意大家去閱讀以下Mybatis的幫助文檔。
  • resultType:查詢語句返回結(jié)果類型的完全限定名或別名,別名的使用方式與parameterType的使用方式是一致的

接下來我就用一個實例來向大家演示一下

首先我弄了一個以用戶名、用戶角色來查詢用戶列表的功能,咱們先創(chuàng)建UserMapper.java文件

public interface UserMapper {
public List<User> getUserList(Map<String,String> userMap);
}

從上面大家可以看到我用來一個集合來接受返回的結(jié)果集,并且傳遞的參數(shù)是一個user對象

下面再來編寫UserMapper.xml文件的主體內(nèi)容

<!--查詢用戶列表(參數(shù):對象入?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>

上面便是咱們此次測試的查詢映射語句了,這和我在上面說的映射語句區(qū)別不大,唯一大點的區(qū)別就在于參數(shù)類型,這的參數(shù)類型我換成了一個Map集合。

接下來就可以去測試了。

@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

接下來說說resultMap,我們?yōu)槭裁匆胷esultMap呢?

用小編的話說:當(dāng)我們要使用的查詢映射語句是需要關(guān)聯(lián)多表的時候,那么一個實體類的字段就不夠用了,比如User表中有一個部門ID,而部門ID又對應(yīng)了部門表,我們想查詢部門名稱而不是查詢部門ID,這時候我們就要在User實體類中加入一個部門名稱屬性,且該屬性的類型為部門實體類,

到這我們就需要使用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元素用來描述如何將結(jié)果集映射到j(luò)ava對象,此處使用resultMap對列表展示所需的必要字段來進(jìn)行自由映射。接下來看看resultMap元素的屬性值和子節(jié)點吧

  • id屬性:唯一標(biāo)識符,此id值用于select元素resultMap屬性的引用
  • type屬性:表示該result的映射結(jié)果類型
  • result子節(jié)點:用于標(biāo)識一些簡單屬性,其中column屬性表示從數(shù)據(jù)庫中查詢的字段名,property則表示查詢出來的字段對應(yīng)的值賦給實體對象的哪個屬性。

Mybatis中對查詢進(jìn)行select映射的時候,返回類型可以用resultType,也可以用resultMap,那么resultType和resultMap到底有何關(guān)聯(lián)呢?接下里小編就做一下詳細(xì)的講解

resultType

resultType直接表示返回類型,包括基礎(chǔ)數(shù)據(jù)庫類型和復(fù)雜數(shù)據(jù)類型

resultMap

resultMap則是對外部resultMap定義的引用,對外部resultMap的ID,表示返回結(jié)果映射到哪一個resultMap上,它的應(yīng)用場景一般是:數(shù)據(jù)庫字段信息與對象屬性不一致或者需要做復(fù)雜的聯(lián)合查詢以便自由控制映射結(jié)果。

resultType與resultMap的關(guān)聯(lián)

在Mybatis的select元素中,resultType和resultMap本質(zhì)上是一樣的,都是Map數(shù)據(jù)結(jié)構(gòu),但需要明確的一點:resultType屬性和resultMap屬性絕對不能同時存在,只能二者選其一。

接下來說說使用Mybatis實現(xiàn)增刪改的操作,其實這幾個操作都大同小異(小編認(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>

從上面的操作中可以看出其實這三種操作都差不多,其中的屬性也都見過哈!那么小編在這就不多做介紹了,上面我所說的都是SQL映射文件最基礎(chǔ)的一些東西,后面還有動態(tài)SQL之類的我在這就不做介紹了,感興趣的童鞋可以去查查(我覺得闊以)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中IO流簡介_動力節(jié)點Java學(xué)院整理

    Java中IO流簡介_動力節(jié)點Java學(xué)院整理

    Java io系統(tǒng)的設(shè)計初衷,就是為了實現(xiàn)“文件、控制臺、網(wǎng)絡(luò)設(shè)備”這些io設(shè)置的通信。接下來通過本文給大家介紹Java中IO流簡介,感興趣的朋友一起看看吧
    2017-05-05
  • IDEA中maven無法下載源碼的解決方法

    IDEA中maven無法下載源碼的解決方法

    這篇文章主要為大家詳細(xì)介紹了當(dāng)IDEA中maven無法下載源碼時改如何解決,文中通過圖文為大家進(jìn)行了詳細(xì)講解,需要的小伙伴可以參考一下
    2023-08-08
  • 解決JDK版本沖突顯示問題(雙版本沖突)

    解決JDK版本沖突顯示問題(雙版本沖突)

    這篇文章主要介紹了解決JDK版本沖突顯示問題(雙版本沖突),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java實現(xiàn)一鍵獲取Mysql所有表字段設(shè)計和建表語句的工具類

    Java實現(xiàn)一鍵獲取Mysql所有表字段設(shè)計和建表語句的工具類

    這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個工具類,可以實現(xiàn)一鍵獲取Mysql所有表字段設(shè)計和建表語句,感興趣的小伙伴可以了解一下
    2023-05-05
  • RabbitMQ中的延遲隊列機(jī)制詳解

    RabbitMQ中的延遲隊列機(jī)制詳解

    這篇文章主要介紹了RabbitMQ中的延遲隊列機(jī)制詳解,延時隊列內(nèi)部是有序的,最重要的特性就體現(xiàn)在它的延時屬性上,延時隊列中的元素是希望,在指定時間到了以后或之前取出和處理,簡單來說,延時隊列就是用來存放需要在指定時間被處理的元素的隊列,需要的朋友可以參考下
    2023-09-09
  • Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀

    Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀,UDP協(xié)議全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議,在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層,需要的朋友可以參考下
    2023-12-12
  • 徹底搞明白Spring中的自動裝配和Autowired注解的使用

    徹底搞明白Spring中的自動裝配和Autowired注解的使用

    這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Java中怎樣使用JSON進(jìn)行文件解析

    Java中怎樣使用JSON進(jìn)行文件解析

    這篇文章主要介紹了Java中怎樣使用JSON進(jìn)行文件解析問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java基礎(chǔ)之包裝類的介紹及使用

    java基礎(chǔ)之包裝類的介紹及使用

    今天帶大家復(fù)習(xí)Java基礎(chǔ)知識,文中對Java包裝類作了非常詳細(xì)的介紹及總結(jié),對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java ScheduledExecutorService定時任務(wù)案例講解

    Java ScheduledExecutorService定時任務(wù)案例講解

    這篇文章主要介紹了Java ScheduledExecutorService定時任務(wù)案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論