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

mybatis中映射文件(mapper)中的使用規(guī)則

 更新時(shí)間:2021年11月26日 10:15:00   作者:北平天空  
這篇文章主要介紹了mybatis中映射文件(mapper)中的使用規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、增刪改

1、增加

<!-- 添加用戶-->
<insert id="saveUser" parameterType="com.tfjybj.domain.User">
		insert into user(username,birthday,sex,address)
		values(#{username},#{birthday},#{sex},#{address})
</insert>

說明

  • id屬性:

映射文件中方法的唯一標(biāo)識(shí),與對(duì)應(yīng)dao層中執(zhí)行此功能的方法名相同。

  • parameterType 屬性:

代表參數(shù)的類型,因?yàn)槲覀円獋魅氲氖且粋€(gè)類的對(duì)象,所以類型就寫類的全名稱。

  • sql 語句中使用#{}字符:

它代表占位符,相當(dāng)于原來 jdbc 部分所學(xué)的?,都是用于執(zhí)行語句時(shí)替換實(shí)際的數(shù)據(jù)。具體的數(shù)據(jù)是由#{}里面的內(nèi)容決定的。

  • #{}中內(nèi)容的寫法:

由于參數(shù)是 一個(gè) User 對(duì)象,此處要寫 User 對(duì)象中的屬性名稱。這里應(yīng)用了 ognl 表達(dá)式。

  • ognl 表達(dá)式:

它是 apache 提供的一種表達(dá)式語言,全稱是:Object Graphic Navigation Language 對(duì)象圖導(dǎo)航語言。它是按照 #{對(duì)象.對(duì)象}的語法格式來獲取數(shù)據(jù)的,#{user.username}它會(huì)先去找 user 對(duì)象,然后在 user 對(duì)象中找到 username 屬性,并調(diào)用getUsername()方法把值取出來。但是我們?cè)?parameterType 屬性上指定了實(shí)體類名稱,所以可以省略 user,而直接寫 username。

如何獲得新增數(shù)據(jù)id的返回值

方式一

mysql支持自增主鍵,自增主鍵的獲取,mybatis利用了statement.getGenreatedKeys();

在< insert> 標(biāo)簽中添加

userGeneratedKeys=“true” :標(biāo)明使用自增主鍵獲取主鍵值策略。

keyProperty:指定對(duì)應(yīng)的主鍵屬性,也就是mybatis獲取到主鍵值之后,將這個(gè)值封裝給JavaScriptBean的哪個(gè)屬性。

<insert id="saveUser" parameterType="com.tfjybj.domain.User" 
	useGeneratedKeys="true" keyProperty="id">
		insert into user(username,birthday,sex,address)
		values(#{username},#{birthday},#{sex},#{address})
</insert>

方式二

新增用戶后,要求在新增數(shù)據(jù)后,將自動(dòng)增長(zhǎng)的auto_increment的值返回,mysql主鍵自增的返回,配置如下:

<insert id="saveUser" parameterType="com.tfjybj.domain.User">
<!-- keyColumn:要獲得哪個(gè)列的值
	 keyProperty:查詢出來的主鍵值封裝給就AV額Bean的哪個(gè)屬性
	 order:取值為before,當(dāng)前SQL在插入SQL之前運(yùn)行。取值為fater,當(dāng)前SQL在插入SQL之后運(yùn)行
	 resultType:查出的數(shù)據(jù)的返回值類型 -->
	<selectKey keyColumn="id" keyProperty="id" resultType="int" order="after">
		select last_insert_id();
	</selectKey>
	
	insert into user(username,birthday,sex,address)
	values(#{username},#{birthday},#{sex},#{address})
</insert>

2、刪除

<!-- 刪除用戶 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
	delete from user where id = #{uid}
</delete>

3、更新

<!-- 更新用戶 -->
<update id="updateUser" parameterType="com.tfjybj.domain.User">
	update user set username=#{username},birthday=#{birthday},sex=#{sex},
	address=#{address} where id=#{id}
</update>

注:對(duì)于增刪改,我們需要手動(dòng)提交數(shù)據(jù)

sqlSessionFactory.openSession(false)——默認(rèn)為false即代表手動(dòng)提交

二、傳入?yún)?shù)處理

1、單個(gè)參數(shù)

mybatis不會(huì)做特殊處理,#{參數(shù)名},取出參數(shù)值。

2、多個(gè)參數(shù)

mybatis會(huì)被特殊處理,多個(gè)參數(shù)會(huì)被封裝成一個(gè)map

key :param1,param2,…paramN, 或者參數(shù)的索引也可以

value:傳入的參數(shù)值

#{key} 就是從map中獲取指定的key的值。

在這里插入圖片描述

取值時(shí),寫成 #{param1},#{param2}就會(huì)不報(bào)錯(cuò)。

注解 @Param

而mybatis中還為我們提供了一個(gè)注解 @Param,用來將傳入的參數(shù),做一個(gè)別名處理,取值是直接使別名就能取到值:#{別名}

在這里插入圖片描述

3、參數(shù)中有Collection(List、Set) 類型或者是數(shù)組

如果傳入的參數(shù)中有Collection(List、Set) 類型或者是數(shù)組,也會(huì)特殊處理,也會(huì)吧傳入的list或者數(shù)組封裝到map中。

key:Collection(collection)。

如果是List還可以使用key(list)、如果是數(shù)組可以使用key(array)

在這里插入圖片描述

4、參數(shù)封裝成數(shù)據(jù)模型

如果多個(gè)參數(shù)正好是我們業(yè)務(wù)邏輯的數(shù)據(jù)模型,我們可以直接傳入pojo;

#{屬性名}:取出傳入的pojo的屬性值。

//dao層方法參數(shù)為一個(gè)pojo
public Employee getEmpById(Employee employee);
<!-- mapper中可直接取出屬性名 -->
<select id="getEmpById"  resultType="com.zhyheima.mybatis.bean.Employee">
        select * from tb1_employee where id=#{id}
    </select>

如果多個(gè)參數(shù)不是業(yè)務(wù)模型中的數(shù)據(jù),沒有對(duì)應(yīng)的pojo,不經(jīng)常使用,為了方便,我們可以傳入map

#{key}:取出map中對(duì)應(yīng)的值。

在這里插入圖片描述

5、parameterType 配置 參數(shù)

基本類型和 String 我 們可以直接寫類型名稱 ,也可以使用包 名 . 類名的方式 ,例如 :java.lang.String。

實(shí)體類類型,目前我們只能使用全限定類名(前提是沒有在mybatis的全局配置文件中起別名)。

mybaits 在加載時(shí)已經(jīng)把常用的數(shù)據(jù)類型注冊(cè)了別名,從而我們?cè)谑褂脮r(shí)可以不寫包名,而我們的是實(shí)體類并沒有注冊(cè)別名,所以必須寫全限定類名。

在這里插入圖片描述

三、查詢

1、模糊查詢

方式一

<!-- 根據(jù)名稱模糊查詢 -->
<select id="findByName" resultType="com.tfjybj.domain.User" parameterType="String">
	select * from user where username like #{username}
</select>

以上寫法中沒有加入%來作為模糊查詢的條件,所以在程序代碼中傳入字符串實(shí)參時(shí),就需要給定模糊查詢的標(biāo)識(shí)%。配置文件中的#{username}也只是一個(gè)占位符,所以 SQL 語句顯示為“?”。

方式二

<!-- 根據(jù)名稱模糊查詢 -->
<select id="findByName" parameterType="string" resultType="com.tfjybj.domain.User">
	select * from user where username like '%${value}%'
</select>

將原來的#{}占位符,改成了$ {value}。注意如果用模糊查詢的這種寫法,那么$ {value}的寫法就是固定的,不能寫成其它名字。這樣在程序代碼中就不需要加入模糊查詢的匹配符%了。

2、#{}與${}的區(qū)別

#{} 表示一個(gè)占位符號(hào)

通過#{}可以實(shí)現(xiàn) preparedStatement 向占位符中設(shè)置值,自動(dòng)進(jìn)行 java 類型和 jdbc 類型轉(zhuǎn)換,#{}可以有效防止 sql 注入。 #{}可以接收簡(jiǎn)單類型值或 pojo 屬性值。 如果 parameterType 傳輸單個(gè)簡(jiǎn)單類型值,#{}括號(hào)中可以是 value 或其它名稱。

$ {} 表示拼接 sql 串

通過$ {}可以將 parameterType 傳入的內(nèi)容拼接在 sql中且不進(jìn)行 jdbc 類型轉(zhuǎn)換, $ {}可以接收簡(jiǎn)單類型值或 pojo 屬性值,如果 parameterType 傳輸單個(gè)簡(jiǎn)單類型值,$ {}括號(hào)中只能是 value。

大多數(shù)情況下,我們?nèi)?shù)的值都應(yīng)該去使用#{};

3、返回屬性為resultType

resultType 屬性可以指定結(jié)果集的類型,它支持基本類型和實(shí)體類類型。

  • 若返回的是一個(gè)List集合,則resultType中寫這個(gè)集合中的類型即可。
  • 若返回的是一個(gè)Map集合(查詢一條數(shù)據(jù)),則mybatis中的resultType中可以直接寫小map。
  • 若返回的是一個(gè)Map集合(查詢多條數(shù)據(jù),每條數(shù)據(jù)的model作為value),則mybatis中用這個(gè)model作為返回類型,并且在dao層返回的Map聲明上加上注解@MapKey(“要作為key的字段名”)

在這里插入圖片描述

對(duì)于實(shí)體類型,它和 parameterType 一樣,如果注冊(cè)過類型別名的,可以直接使用別名。沒有注冊(cè)過的必須使用全限定類名。

同時(shí),當(dāng)是實(shí)體類名稱時(shí),還有一個(gè)要求,實(shí)體類中的屬性名稱必須和查詢語句中的列名保持一致,否則無法實(shí)現(xiàn)封裝。

4、返回屬性為resultMap

若mybatis中查詢出的數(shù)據(jù)列與bean中的屬性無法對(duì)應(yīng)上(名稱不對(duì)應(yīng)),解決辦法:

  • sql查詢的時(shí)候,查詢出的字段用as 后面加一個(gè)別名。
  • 在全局配置文件中,使用settings設(shè)置,支持駝峰命名法。(mybatis在window系統(tǒng)下不區(qū)分字母大小寫,若數(shù)據(jù)庫中字段名為lastname,javabean中的屬性名稱為lastName,則可以查詢成功)。
  • mybatis中使用resultMap作為返回,resultMap可以自定義結(jié)果映射規(guī)則。

resultMap 標(biāo)簽可以建立查詢的列名和實(shí)體類的屬性名稱不一致時(shí)建立對(duì)應(yīng)關(guān)系。從而實(shí)現(xiàn)封裝。

在 select 標(biāo)簽中使用 resultMap 屬性指定引用即可。同時(shí) resultMap 可以實(shí)現(xiàn)將查詢結(jié)果映射為復(fù)雜類型的 pojo,比如在查詢結(jié)果映射對(duì)象中包括 pojo 和 list 實(shí)現(xiàn)一對(duì)一查詢和一對(duì)多查詢。

自定義某個(gè)javaBean的封裝規(guī)則

resultMap屬性

  • type 屬性:指定實(shí)體類的全限定類名
  • id 屬性:給定一個(gè)唯一標(biāo)識(shí),是給查詢 select 標(biāo)簽引用用的。

內(nèi)部標(biāo)簽

  • id 標(biāo)簽:用于指定主鍵字段
  • result 標(biāo)簽:用于指定非主鍵字段
  • column 屬性:用于指定數(shù)據(jù)庫列名
  • property 屬性:用于指定實(shí)體類屬性名稱
<!-- 建立 User 實(shí)體和數(shù)據(jù)庫表的對(duì)應(yīng)關(guān)系
type 屬性:指定實(shí)體類的全限定類名
id 屬性:給定一個(gè)唯一標(biāo)識(shí),是給查詢 select 標(biāo)簽引用用的。
-->
<resultMap type="com.zhyheima.domain.User" id="userMap">
	<id column="id" property="userId"/>
	<result column="username" property="userName"/>
	<result column="sex" property="userSex"/>
	<result column="address" property="userAddress"/>
	<result column="birthday" property="userBirthday"/>
</resultMap>
<!-- 配置查詢所有操作 -->
<select id="findAll" resultMap="userMap">
	select * from user
</select>

聯(lián)合查詢,實(shí)體級(jí)聯(lián)屬性封裝結(jié)果集(一對(duì)一或多對(duì)一)

一對(duì)一:對(duì)于查詢結(jié)果中,是兩個(gè)model的集合,即一個(gè)model嵌套了一個(gè)model,比如查詢被雇傭者的信息,并根據(jù)該信息查詢出雇主的信息,返回被雇傭者和雇主兩個(gè)model的信息。

多對(duì)一:雇傭者可能有多個(gè),但只有一個(gè)雇主。

在這里插入圖片描述

使用asscociation聯(lián)合查詢,定義實(shí)體級(jí)聯(lián)屬性封裝規(guī)則(一對(duì)一或多對(duì)一)

resultMap中還可以使用association標(biāo)簽,進(jìn)行一對(duì)一查詢。

在這里插入圖片描述

進(jìn)行分步查詢,使用asscociation聯(lián)合查詢,定義實(shí)體級(jí)聯(lián)屬性封裝規(guī)則(一對(duì)一或多對(duì)一)

分步查詢,先查詢被雇傭者的信息,在根據(jù)被雇傭者查詢雇傭者信息。被分為了兩個(gè)sql語句。

在這里插入圖片描述

使用collection嵌套結(jié)果集(一對(duì)多或多對(duì)多)

例如:

查詢所有用戶信息及用戶關(guān)聯(lián)的賬戶信息。

用戶信息和他的賬戶信息為一對(duì)多關(guān)系。

<resultMap type="com.zhyheima.bean.user" id="userMap">
	<id column="id" property="id"></id>
	<result column="username" property="username"/>
	<result column="address" property="address"/>
	<result column="sex" property="sex"/>
	<result column="birthday" property="birthday"/>
	
	<!-- collection 是用于建立一對(duì)多中集合屬性的對(duì)應(yīng)關(guān)系
	ofType 用于指定集合元素的數(shù)據(jù)類型
	-->
	<collection property="accounts" ofType="com.zhyheima.bean.account">
		<id column="aid" property="id"/>
		<result column="uid" property="uid"/>
		<result column="money" property="money"/>
	</collection>
</resultMap>
<!-- 配置查詢所有操作 -->
<select id="findAll" resultMap="userMap">
select u.*,a.id as aid ,a.uid,a.money from user u left outer join account
a on u.id =a.uid
</select>

collection

部分定義了用戶關(guān)聯(lián)的賬戶信息。表示關(guān)聯(lián)查詢結(jié)果集。

property=“accounts”

關(guān)聯(lián)查詢的結(jié)果集存儲(chǔ)在 User 對(duì)象的上哪個(gè)屬性。

ofType=“com.zhyheima.bean.account”

指定關(guān)聯(lián)查詢的結(jié)果集中的對(duì)象類型即List中的對(duì)象類型。

同樣collection也支持分布查詢,具體查詢方式和association的方式一樣。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot中jsp配置tiles全過程

    springboot中jsp配置tiles全過程

    這篇文章主要介紹了springboot中jsp配置tiles全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入

    簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入

    這篇文章主要介紹了簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java Predicate接口定義詳解

    Java Predicate接口定義詳解

    Predicate是Java中的一個(gè)函數(shù)式接口,它代表一個(gè)判斷邏輯,接收一個(gè)輸入?yún)?shù),返回一個(gè)布爾值,這篇文章主要介紹了Java Predicate接口的定義及示例代碼,需要的朋友可以參考下
    2025-04-04
  • Java案例分享-集合嵌套

    Java案例分享-集合嵌套

    這篇文章主要介紹了Java案例分享-集合嵌套,通過案例創(chuàng)建一個(gè)ArrayList集合,存儲(chǔ)三個(gè)元素,每一個(gè)元素都是HashMap,每一個(gè)HashMap的鍵和值都是String,并遍歷,實(shí)際操作內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

    Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

    這篇文章主要介紹了Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring Boot整合Mybatis Plus和Swagger2的教程詳解

    Spring Boot整合Mybatis Plus和Swagger2的教程詳解

    這篇文章主要介紹了Spring Boot整合Mybatis Plus和Swagger2的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • spring?NamedContextFactory在Fegin配置及使用詳解

    spring?NamedContextFactory在Fegin配置及使用詳解

    在我們?nèi)粘m?xiàng)目中,使用FeignClient實(shí)現(xiàn)各系統(tǒng)接口調(diào)用變得更加簡(jiǎn)單,?在各個(gè)系統(tǒng)集成過程中,難免會(huì)遇到某些系統(tǒng)的Client需要特殊的配置、返回讀取等需求。Feign使用NamedContextFactory來為每個(gè)Client模塊構(gòu)造單獨(dú)的上下文(ApplicationContext)
    2023-11-11
  • 詳解Spring AOP 攔截器的基本實(shí)現(xiàn)

    詳解Spring AOP 攔截器的基本實(shí)現(xiàn)

    本篇文章主要介紹了詳解Spring AOP 攔截器的基本實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java中instanceof關(guān)鍵字實(shí)例講解

    Java中instanceof關(guān)鍵字實(shí)例講解

    大家好,本篇文章主要講的是Java中instanceof關(guān)鍵字實(shí)例講解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Java生成獨(dú)一無二的工單號(hào)實(shí)例

    Java生成獨(dú)一無二的工單號(hào)實(shí)例

    這篇文章主要介紹了Java生成獨(dú)一無二的工單號(hào)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評(píng)論