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

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

 更新時(shí)間:2020年08月17日 16:31:07   作者:LiuLiangLONG  
這篇文章主要給大家介紹了關(guān)于利用MyBatis實(shí)現(xiàn)條件查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

SQL映射文件

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

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

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

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

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

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

<!-- cache配置 -->
<cache 
	eviction="FIFO"
 	flushInterval="60000"
 size="512" 
 	readOnly="true" />

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

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

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

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

4.resultMap:用于描述數(shù)據(jù)庫結(jié)果集合對(duì)應(yīng)關(guān)系

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

6.insert:映射插入語句

7.delete:映射刪除語句

8.update:映射更新語句

9.映射查詢語句

使用SELECT完成單條件查詢

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

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

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

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

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

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

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

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

使用SELECT完成多條查詢

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

結(jié)果也會(huì)有各種類型。

<!-- 設(shè)置resultMap的映射 -->
<resultMap id="TestMap" type="text">
	<id property="id" column="id" />
	<reuslt property="name" column="name" />
	<!-- 比如text類中有個(gè) List<User> 的屬性
	則需要使用該該標(biāo)簽綁定User表 
	如果只是 User類型的參數(shù)的話使用 association 標(biāo)簽 
	他們兩個(gè)標(biāo)簽的屬性差不多只,是association是javaType來指定類型
	而collection使用的是ofType來指定類型,
	多表查詢時(shí)最好給每個(gè)id設(shè)置別名,以免插入到其他的id
	-->
	<collection property="userList" ofType="User">
		<id property="id" column="u_id" />
		<result property="UserName" column="UserName" />
		<result property="password" column="password" />
	</collection>
</reusltMap>
<!-- 設(shè)置多表查詢 -->
<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ù)類型,但是只適用于一個(gè)參數(shù)的情況通過#{參數(shù)名}即可獲取傳入的值,如果多參入?yún)?,需要?fù)雜數(shù)據(jù)類型來支持,包括java實(shí)體類,Map,通過#{屬性名}或#{Map 的 key}來獲取傳入的參數(shù)值。

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

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

<resultMap type = "實(shí)體類或基本數(shù)據(jù),他們的別名" id = "userList">
	<result property="id" column="對(duì)應(yīng)數(shù)據(jù)庫的id" />
	<result property="name" column="對(duì)應(yīng)數(shù)據(jù)庫的name" />
	<result property="password" column="對(duì)應(yīng)數(shù)據(jù)庫的password" />
	<result property="age" column="對(duì)應(yīng)數(shù)據(jù)庫的age" />
</resultMap> 

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

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

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

事務(wù)開啟回滾

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

Sqlsession = factory.opSession(false);//true 為自動(dòng)提交事務(wù)

commit 提交方法

Sqlsession.commit();//提交事務(wù)

rollback回滾

Sqlsession.rollback();//回滾事務(wù)

使用INSERT完成增加操作

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

然后我們?cè)赟QL映射文件中定義一個(gè)insert節(jié)點(diǎn)

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

insert 的屬性

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

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

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

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

使用update完成修改操作

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

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

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

假如我需要?jiǎng)h除 刪除 姓名 為 李XX 的數(shù)據(jù) 當(dāng)數(shù)據(jù)庫有很多個(gè)同名的數(shù)據(jù) 所以需要其他的條件來 確認(rèn)刪除那個(gè)李XX 數(shù)據(jù) 但我們 直接使用一個(gè)類對(duì)象作為參數(shù)的話,有點(diǎn)多余,因?yàn)槲覀冎恍枰?個(gè)條件,就ok了,當(dāng)由于它的參數(shù)類型時(shí)采用map的方式只有一個(gè)參數(shù)時(shí)可直接 #{任意名}來使用,但有多個(gè)參數(shù)的時(shí)候就不行了 所以這時(shí)需要@Param注解

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

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

<update >
	update user set userName = #{name}
	where id = #{id}
</update >

使用delete完成刪除操作

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

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

delete元素映射

<delete parameterType="Integer">
	delete from user where id = #{id}
</delete>

association

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

實(shí)體類

class User{
	private int id;
	private String name;
	private String password;
	private text userText;
	//省略getter和setter方法
}

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

<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類名或者別名,若映射到一個(gè)JavaBean,則MyBatis通常會(huì)自行檢測(cè)到其類型;若映射到一個(gè)HashMap,則應(yīng)該明確指定javaType,來確保所需行為
property 映射數(shù)據(jù)庫列的實(shí)體對(duì)象的屬性
resultMap 用于引用外部的resultMap映射

resultMap 引用外部 resultMap

<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處理一對(duì)一的關(guān)聯(lián)關(guān)系,那么對(duì)于一對(duì)多的關(guān)聯(lián)關(guān)系的處理這就需要用到collection元素來實(shí)現(xiàn)了

collection

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

class User{
	private int id;
	private String name;
	private String password;
	private List<text> userText;
	//省略getter和setter方法
}

我們?cè)诮涌谥刑砑?一個(gè)方法

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

使用 collection實(shí)現(xiàn)結(jié)果映射

<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類名或者別名,若映射到一個(gè)JavaBean,則MyBatis通常會(huì)自行檢測(cè)到其類型;若映射到一個(gè)HashMap,則應(yīng)該明確指定javaType,來確保所需行為
property 映射數(shù)據(jù)庫列的實(shí)體對(duì)象的屬性
resultMap 用于引用外部的resultMap映射

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

<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自動(dòng)映射級(jí)別

設(shè)置 reultMap的自動(dòng)映射級(jí)別我們需要在mybatis的核心配置文件中設(shè)置

<settings>
<!-- 設(shè)置resultMap的自動(dòng)映射級(jí)別為FULL(自動(dòng)匹配所有) -->
	<setting name="autoMappingBehavior" value="FULL"/>
</settings>

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

在使用時(shí) 如果沒有設(shè)置映射級(jí)別,對(duì)于復(fù)雜類型他們是不會(huì)自動(dòng)匹配的,需要手動(dòng)匹配,復(fù)雜類型需要自己對(duì)association和collection的進(jìn)行設(shè)置

總結(jié)

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

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

關(guān)于MyBatis的SQL語句參數(shù)入?yún)ⅲ瑢?duì)于經(jīng)基礎(chǔ)數(shù)據(jù)類型的參數(shù)數(shù)據(jù),使用@Param注解來實(shí)現(xiàn) ,復(fù)雜類型的參數(shù)直接入?yún)⒓纯?br />

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

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

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

相關(guān)文章

  • Java線程之間的共享與協(xié)作詳解

    Java線程之間的共享與協(xié)作詳解

    這篇文章主要介紹了Java線程之間的共享與協(xié)作詳解,進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的最小單位,線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比經(jīng)常更小的、能夠獨(dú)立運(yùn)行的基本單位
    2022-07-07
  • http basic authentication通過post方式訪問api示例分享 basic認(rèn)證示例

    http basic authentication通過post方式訪問api示例分享 basic認(rèn)證示例

    在HTTP中,基本認(rèn)證是一種用來允許Web瀏覽器或其他客戶端程序在請(qǐng)求時(shí)提供以用戶名和口令形式的憑證,這篇文章主要介紹了http basic authentication通過post方式訪問api示例,大家參考使用吧
    2014-01-01
  • SpringBoot使用?Sleuth?進(jìn)行分布式跟蹤的過程分析

    SpringBoot使用?Sleuth?進(jìn)行分布式跟蹤的過程分析

    Spring Boot Sleuth是一個(gè)分布式跟蹤解決方案,它可以幫助您在分布式系統(tǒng)中跟蹤請(qǐng)求并分析性能問題,Spring Boot Sleuth是Spring Cloud的一部分,它提供了分布式跟蹤的功能,本文將介紹如何在Spring Boot應(yīng)用程序中使用Sleuth進(jìn)行分布式跟蹤,感興趣的朋友一起看看吧
    2023-10-10
  • Java實(shí)現(xiàn)按比例縮小圖片

    Java實(shí)現(xiàn)按比例縮小圖片

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)按比例縮小圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Spring?BeanFactory容器的構(gòu)建和使用示例詳解

    Spring?BeanFactory容器的構(gòu)建和使用示例詳解

    BeanFactory是Spring框架中的一部分,它提供了IoC(控制反轉(zhuǎn))的實(shí)現(xiàn)機(jī)制,下面小編就來和大家簡單聊聊BeanFactory容器的構(gòu)建和使用示例吧
    2023-07-07
  • SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程

    SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程

    Spring?Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架,接下來通過本文給大家介紹SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程,感興趣的朋友一起看看吧
    2022-05-05
  • 解決nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further informa問題

    解決nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further&

    這篇文章主要介紹了解決nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further informa問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java實(shí)現(xiàn)PDF打印的解決方案

    Java實(shí)現(xiàn)PDF打印的解決方案

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)PDF打印的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Kotlin 與 Java基本語法對(duì)比

    Kotlin 與 Java基本語法對(duì)比

    這篇文章主要介紹了Kotlin 與 Java基本語法對(duì)比的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SpringCloud服務(wù)網(wǎng)關(guān)Gateway的使用教程詳解

    SpringCloud服務(wù)網(wǎng)關(guān)Gateway的使用教程詳解

    SpringCloud Gateway是Spring體系內(nèi)的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式。本文就來為大家詳細(xì)講講Gateway的使用教程,需要的可以參考一下
    2022-09-09

最新評(píng)論