激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - 利用MyBatis實現(xiàn)條件查詢的方法匯總

利用MyBatis實現(xiàn)條件查詢的方法匯總

2020-08-18 00:34LiuLiangLONG Java教程

這篇文章主要給大家介紹了關于利用MyBatis實現(xiàn)條件查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用MyBatis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

 

SQL映射文件

 

Mybatis真正強大的是在于它的SQL映射語句,也是它的流弊之處。

它的功能強大,SQL映射文件的配置卻比較簡單。

使用SQL映射文件可以減少50%以上的代碼量。

Mybatis專注于SQL,對于開發(fā)人員來說可極大限度地進行SQL調(diào)優(yōu),以保證性能,下面是SQL映射文件的幾個頂級元素配置

1、mapper 它是映射文件的根節(jié)點,只有一個屬性就是 namespace(命名空間)它的作用是區(qū)分不同的mapper,里面的參數(shù)是全局唯一的,綁定DAO層接口,即面向接口編程 namespace綁定某個接口之后,就可以不寫該接口的實現(xiàn)類,因為mybatis會根據(jù)接口的完整名稱來找到對應的mapper配置來執(zhí)行SQL語句。因此namespace的命名必須跟你設置的接口同名比如

利用MyBatis實現(xiàn)條件查詢的方法匯總

利用MyBatis實現(xiàn)條件查詢的方法匯總

2.cache:配置給命名空間的緩存

?
1
2
3
4
5
6
<!-- cache配置 -->
<cache
    eviction="FIFO"
    flushInterval="60000"
 size="512"
    readOnly="true" />

在mapper文件配置支持cache后如果需要對個別查詢進行調(diào)整,可以單獨設置cache,代碼如下

?
1
2
3
   <select id="selectTest" resultType="int" useCache="true">
 select id from text where id = 1
</select>

由于Mybatis框架不擅長緩存查詢結果數(shù)據(jù)集,所以不對它進一步了解,所以采用OSCahe,Memcached等專門的緩存服務器做更為合理。

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

4.resultMap:用于描述數(shù)據(jù)庫結果集合對應關系

5.SQL:可以重用的SQL 塊,也可以被其他語句引用

6.insert:映射插入語句

7.delete:映射刪除語句

8.update:映射更新語句

9.映射查詢語句

 

使用SELECT完成單條件查詢

 

Select 元素的屬性 id 命名空間中唯一的標識符,可以被用來引用這條語句

ParameterType 表示查詢語句傳入?yún)?shù)的類型的完全限定名或別名,它支持基礎數(shù)據(jù)類型和復雜數(shù)據(jù)類型

利用MyBatis實現(xiàn)條件查詢的方法匯總

除了內(nèi)建的類型別名外,還可以為自定義的類設置別名,該表格只列出了部分映射,其他的別名請參考mybatis的幫助文檔,ResultType 查詢語句返回結果類型的完全限定名或別名。別名的使用方式與parameterType是一樣的

?
1
2
3
<select id="selectTest" resultType="User" parameterType="string">
  select * from text where name = #{name}
 </select>

這是一個 id為 selectTest的SQL映射語句 ,它的參數(shù)類型為 string 也可為復雜類型,返回值是 User類型,如果使用類 做返回值的話 類中的字段設置的和數(shù)據(jù)庫表的字段一致,這樣可以使數(shù)據(jù)庫和類中的屬性自動匹配以便開發(fā)(注意如果數(shù)據(jù)庫表和實體類的屬性命名不一樣則需要手動配置),參數(shù)類型為 #{參數(shù)名} 它會告訴Mybatis生成PreparedStatement參數(shù) ,對于JDBC該參數(shù)會被識別成 ? 若采用JDBC來實現(xiàn)代碼如下:

?
1
2
3
String sql = "select * from text where name = ? ";
PreparedStatement ps = new PreparedStatement(sql);
ps.setString(1,name);

由此看出,Mybatis可以節(jié)省大量的代碼,如果想完成復雜一些的查詢或者讓配置文件更簡潔些,這就需要了解select元素的屬性和mybatis配置文件的屬性,
介紹屬性:

  • id:命名空間中的唯一標識符,可以被用來引用這條語句
  • parameterType:表示查詢語句傳入的參數(shù)的類型的完全限定名或別名
  • resultType:查詢語句返回結果類型的完全限定名或別名

 

使用SELECT完成多條查詢

 

上面只是對一個表進行查詢,但是在實際操作中查詢數(shù)據(jù)會有多條件,

結果也會有各種類型。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- 設置resultMap的映射 -->
<resultMap id="TestMap" type="text">
    <id property="id" column="id" />
    <reuslt property="name" column="name" />
    <!-- 比如text類中有個 List<User> 的屬性
    則需要使用該該標簽綁定User表
    如果只是 User類型的參數(shù)的話使用 association 標簽
    他們兩個標簽的屬性差不多只,是association是javaType來指定類型
    而collection使用的是ofType來指定類型,
    多表查詢時最好給每個id設置別名,以免插入到其他的id
    -->
    <collection property="userList" ofType="User">
        <id property="id" column="u_id" />
        <result property="UserName" column="UserName" />
        <result property="password" column="password" />
    </collection>
</reusltMap>
<!-- 設置多表查詢 -->
<select id="textList" resultMap="TestMap" parameterType="Integer">
    select t.*,u.id = u_id,u.UserName,u.password
    from text as t,User as u where t.id = u.id and t.id = #{id}
</select>

注意Mybatis傳入?yún)?shù)類型可以是Java基本數(shù)據(jù)類型,但是只適用于一個參數(shù)的情況通過#{參數(shù)名}即可獲取傳入的值,如果多參入?yún)ⅲ枰獜碗s數(shù)據(jù)類型來支持,包括java實體類,Map,通過#{屬性名}或#{Map 的 key}來獲取傳入的參數(shù)值。

 

使用resultMap完成查詢結果的展現(xiàn)

 

在Mybatis中使用resultType做自動映射,一定要注意:字段名和實體類的屬性名一致,若不一致,則需要給數(shù)據(jù)庫字段 as 起別名,保證別名與屬性名一致,我們還可以使用resultMap做自定義結果映射,字段名可以不一致,并且還可以指定要顯示的列,比較靈活,應用也廣泛,推薦使用第二種方式來做結果映射。

?
1
2
3
4
5
6
<resultMap type = "實體類或基本數(shù)據(jù),他們的別名" id = "userList">
    <result property="id" column="對應數(shù)據(jù)庫的id" />
    <result property="name" column="對應數(shù)據(jù)庫的name" />
    <result property="password" column="對應數(shù)據(jù)庫的password" />
    <result property="age" column="對應數(shù)據(jù)庫的age" />
</resultMap>

resultMap元素用來描述如何將結果集映射到Java對象,此處使用reusltMap對列表展示所需的必要字段來進行自由映射,resultMap元素的屬性值和子節(jié)點

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

 

屬性 說明
resultType resultType直接表示返回值類型,包括基礎數(shù)據(jù)類型和復雜數(shù)據(jù)類型
resultMap resultMap則是對外部resultMao定義的引用,對應外部resultMap的id,表示返回結果映射到哪一個resultMap
resultType和resultMap的關聯(lián) 在Mybatis進行查詢映射的時候,其實查詢出來的每個字段值都放在一個對應的Map里面,其中關鍵字是字段名,值是其對應的值,當select元素提供的返回值屬性是resultType的時候,Mybatis會將Map里面的鍵值對取出賦給resultType所指定對象的屬性,(即調(diào)用對應對象的屬性的setter方法進行填充), 注意在Mybatis的select元素中resultType 和resultMap本質(zhì)是一樣的,都是Map數(shù)據(jù)結構,但需要明確的一點他們是不能同時存在的,只能二選一。
resultMap的自動映射級別 在Mybatis中,使用resultMap能夠進行自動映射匹配的前提是字段名和屬性名需要一致,在默認映射級別(PARTIAL)情況下,若一致,即使沒有做屬性名和字段名的匹配,也可以在后臺獲取到未匹配過的屬性值,若不一致,且在resultMap里沒有做映射,那么無法在后臺獲取并輸出

 

 

事務開啟回滾

 

在使用 sqlsessionFactory獲取sqlsession時給openSession(boolean)帶有參數(shù)表示事務是否提交 ,不帶參數(shù)不開啟事務

?
1
Sqlsession = factory.opSession(false);//true 為自動提交事務

commit 提交方法

?
1
Sqlsession.commit();//提交事務

rollback回滾

?
1
Sqlsession.rollback();//回滾事務

 

使用INSERT完成增加操作

 

Mybatis實現(xiàn)增加操作,使用的是insert 元素來映射插入語句,操作方法很簡單,先向接口定義一個方法 比如   int add(User user);

然后我們在SQL映射文件中定義一個insert節(jié)點

?
1
2
3
4
5
<!-- 增加用戶 -->
<insert parameterType="User">
    insert user into(userName,password)
    values(#{userName},#{password})
</insert>

insert 的屬性

  • id :與 select元素的id一樣,是命名空間中唯一的標識碼,可以被引用這條語句
  • parameterType :與select元素的parameterType一樣,是傳入的參數(shù)的類型完全限定名,別名和select元素的解釋一致

對于增刪改(insert,delete,update),這類數(shù)據(jù)庫更新操作,需要注意:

1.該類型的操作本身默認返回默認返回執(zhí)行SQL影響的行數(shù),所以DAO層接口方法的方法值最好為int,不要為boolean類型

2.insert,delete,update元素中均沒有resultType屬性,只有查詢需要對返回結果類型(resultType,resultMap)進行相應的指定

 

使用update完成修改操作

 

Mybatis 實現(xiàn)修改操作,使用的是 update元素來映射修改語句,具體用法和insert類似

?
1
2
3
4
5
<!-- 修改用戶 -->
<update parameterType="User">
    update user set userName = #{userName} ,password =#{password}
    where id = #{id}
</update >

 

@Param注解實現(xiàn)多參數(shù)入?yún)?/strong>

 

假如我需要刪除 刪除 姓名 為 李XX 的數(shù)據(jù) 當數(shù)據(jù)庫有很多個同名的數(shù)據(jù) 所以需要其他的條件來 確認刪除那個李XX 數(shù)據(jù) 但我們 直接使用一個類對象作為參數(shù)的話,有點多余,因為我們只需要2個條件,就ok了,當由于它的參數(shù)類型時采用map的方式只有一個參數(shù)時可直接 #{任意名}來使用,但有多個參數(shù)的時候就不行了 所以這時需要@Param注解

?
1
2
3
4
/**
*我們需要接口方法的參數(shù)里面添加@Param注解
**/
 int update(@Param("id") int id,@Param("name") String name);

而我們在 SQL映射文件中使用參數(shù):

?
1
2
3
4
<update >
    update user set userName = #{name}
    where id = #{id}
</update >

 

使用delete完成刪除操作

 

Mybatis 實現(xiàn)刪除操作,是通過使用delete元素來映射刪除語句的,具體用法和update ,insert 類似

?
1
int deleteUser(@Param("id") Integer id);

delete元素映射

?
1
2
3
<delete parameterType="Integer">
    delete from user where id = #{id}
</delete>

 

association

 

association 映射到JavaBean的某個 ‘復雜類型' 屬性 比如JavaBean類,即JavaBean 內(nèi)部嵌入了一個復雜數(shù)據(jù)類型(JavaBean)屬性,這種情況就屬于復雜類型的關聯(lián),但是需要注意:association 僅處理一對一的關聯(lián)關系

實體類

?
1
2
3
4
5
6
7
class User{
    private int id;
    private String name;
    private String password;
    private text userText;
    //省略getter和setter方法
}

我們使用association來映射 User 的text屬性

?
1
2
3
4
5
6
7
8
9
10
<resultMap type = "User" >
    <result property="id" column="id" />
    <result property="name" column="name" />
    <result property="password" column="password" />
    <association property="userText" javaType="Text">
        <id property="id" cloumn="t_id"/>
        <result property="tname" column="tname" />
        <result property="text" column="text" />
    </association>
</resultMap>

association 的屬性

 

屬性 說明
javaType 完整的Java類名或者別名,若映射到一個JavaBean,則MyBatis通常會自行檢測到其類型;若映射到一個HashMap,則應該明確指定javaType,來確保所需行為
property 映射數(shù)據(jù)庫列的實體對象的屬性
resultMap 用于引用外部的resultMap映射

 

resultMap 引用外部 resultMap

?
1
2
3
4
5
6
7
8
9
10
11
<resultMap type = "User" >
    <result property="id" column="id" />
    <result property="name" column="name" />
    <result property="password" column="password" />
    <association property="userText" javaType="Text" resultMap="TextEntity" />
</resultMap>
<resultMap type = "Text" >
        <id property="id" cloumn="t_id"/>
        <result property="tname" column="tname" />
        <result property="text" column="text" />
</resultMap>

association處理一對一的關聯(lián)關系,那么對于一對多的關聯(lián)關系的處理這就需要用到collection元素來實現(xiàn)了

 

collection

 

collection 元素的作用和association元素的作用差不多一樣,事實上,它們非常類似,也是映射到JavaBean的某個復雜類型 屬性,只不過這個屬性是一個集合列表,即 JavaBean內(nèi)部嵌套一個復雜數(shù)據(jù)類型(集合)屬性,和使用association元素一樣,我們使用嵌套查詢,或者從連接中嵌套結果集
實體類

?
1
2
3
4
5
6
7
class User{
    private int id;
    private String name;
    private String password;
    private List<text> userText;
    //省略getter和setter方法
}

我們在接口中添加 一個方法

?
1
public List<User> getUserIDListBy(@Param("id") Integer userid);

使用 collection實現(xiàn)結果映射

?
1
2
3
4
5
6
7
8
9
10
<resultMap type = "User" >
    <result property="id" column="id" />
    <result property="name" column="name" />
    <result property="password" column="password" />
    <collection property="userText" ofType="Text">
        <id property="id" cloumn="t_id"/>
        <result property="tname" column="tname" />
        <result property="text" column="text" />
    </collection>
</resultMap>

collection 的屬性

 

屬性 說明
ofType 完整的Java類名或者別名,若映射到一個JavaBean,則MyBatis通常會自行檢測到其類型;若映射到一個HashMap,則應該明確指定javaType,來確保所需行為
property 映射數(shù)據(jù)庫列的實體對象的屬性
resultMap 用于引用外部的resultMap映射

 

collection 引用外部映射和association引用基本一致

?
1
2
3
4
5
6
7
8
9
10
11
<resultMap type = "User" >
    <result property="id" column="id" />
    <result property="name" column="name" />
    <result property="password" column="password" />
    <collection property="userText" ofType="Text" resultMap="textList" />
</resultMap>
<resultMap type = "Text" >
        <id property="id" cloumn="t_id"/>
        <result property="tname" column="tname" />
        <result property="text" column="text" />
</resultMap>

 

resultMap自動映射級別

 

設置 reultMap的自動映射級別我們需要在mybatis的核心配置文件中設置

?
1
2
3
4
<settings>
<!-- 設置resultMap的自動映射級別為FULL(自動匹配所有) -->
    <setting name="autoMappingBehavior" value="FULL"/>
</settings>

 

屬性 說明
NONE 禁止自動匹配
PARTIAL(默認) 自動匹配所有的屬性,但有內(nèi)部嵌套的(association和collection)的除外
FULL 自動匹配所有

 

在使用時 如果沒有設置映射級別,對于復雜類型他們是不會自動匹配的,需要手動匹配,復雜類型需要自己對association和collection的進行設置

總結

MyBatis的SQL映射文件提供 select,insert,update,delete等元素來實現(xiàn)SQL語句的映射

SQL映射文件的根節(jié)點是mapper元素,需要指定namespace來區(qū)別其他的mapper,保證全局唯一,并且其名稱必須和接口同名,作用是綁定接口,即面向接口編程

關于MyBatis的SQL語句參數(shù)入?yún)ⅲ瑢τ诮?jīng)基礎數(shù)據(jù)類型的參數(shù)數(shù)據(jù),使用@Param注解來實現(xiàn) ,復雜類型的參數(shù)直接入?yún)⒓纯?/p>

resultMap的association和collection都可以實現(xiàn)高級映射

SQL 映射文件的select的返回結果類型的映射可以使用resultMap和resultType,但它們不能同時使用

到此這篇關于利用MyBatis實現(xiàn)條件查詢的文章就介紹到這了,更多相關MyBatis實現(xiàn)條件查詢內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/LiuLiangLONG/article/details/108009854

延伸 · 閱讀

精彩推薦
385
主站蜘蛛池模板: 小视频免费在线观看 | 想要xx在线观看 | 深夜福利久久久 | 宅男噜噜噜66国产在线观看 | 黄网站色成年大片免费高 | 国产在线色 | 亚洲日本韩国在线观看 | 国产一级片| 色淫网站免费视频 | 久久免费视频精品 | 国产精品18久久久久久久 | 99欧美精品| 国产交换3p国产精品 | 成人激情综合网 | 在线看免费观看日本 | 久久久噜噜噜久久熟有声小说 | 久久久在线免费观看 | 黑人日比 | 国产宾馆3p国语对白 | 精品呦女 | 国产婷婷一区二区三区 | 成人在线视频黄色 | 国产精品国产三级国产aⅴ无密码 | 国产乱色精品成人免费视频 | 国产免费美女 | 欧美成年私人网站 | 国产成年免费视频 | 国产91精品亚洲精品日韩已满 | 中文字幕在线永久 | videos真实高潮xxxx | 久啪视频| 羞羞视频免费视频欧美 | 国产扩阴视频 | 免费在线观看国产精品 | 国产大片免费看 | 在线观看日韩电影 | 色七七网站| 国产自在自线午夜精品视频在 | 免费a级毛片永久免费 | 国产精品一品二区三区四区18 | 久久精品视频一区二区三区 |