最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis中輸入輸出映射與動(dòng)態(tài)Sql圖文詳解

 更新時(shí)間:2019年02月11日 09:16:53   作者:風(fēng)沙迷了眼  
這篇文章主要給大家介紹了關(guān)于Mybatis中輸入輸出映射與動(dòng)態(tài)Sql的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

一、輸入映射

我們通過配置parameterType的值來指定輸入?yún)?shù)的類型,這些類型可以是簡單數(shù)據(jù)類型、POJO、HashMap等數(shù)據(jù)類型

1、簡單類型

2、POJO包裝類型

①這是單表查詢的時(shí)候傳入的POJO包裝類型,即可以直接傳入實(shí)體類,但是當(dāng)多表查詢的時(shí)候,就需要自定義POJO類型

②我們使用自定義POJO類型來具體的了解一下

先設(shè)計(jì) 包裝類型如下,其中UserPOJO是除了User本身之外的添加的其他跟User相關(guān)的屬性的包裝類,UserVo是用于視圖層面的包裝類型,同樣也是作為Mapper配置文件的輸入類型

其中User文件同上一篇Mybatis簡單入門中的User,包括數(shù)據(jù)表部分也一樣。這里給出UserPoJO和UserVo文件

package cn.mybatis.po;

public class UserPoJo extends User{
 private User user;

 public void setUser(User user) {
 this.user = user;
 }

 public User getUser() {
 return user;
 }
}

UserPOJO
package cn.mybatis.po;

public class UserVo {
 private UserPoJo userPoJo;

 public UserPoJo getUserPoJo() {
 return userPoJo;
 }

 public void setUserPoJo(UserPoJo userPoJo) {
 this.userPoJo = userPoJo;
 }
}

UserVo

然后我們配置UserMapper.xml文件

然后在UserMapper接口文件中添加

//測試包裝類型的查詢
 public List<UserPoJo> findUserList(UserVo userVo) throws Exception;

使用Junit測試剛剛做的配置

@Test
 public void testFindUserList() throws Exception {
 SqlSession sqlSession = sqlSessionFactory.openSession();
 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

 UserPoJo userPoJo = new UserPoJo();
 UserVo userVo = new UserVo();
 userPoJo.setSex("男");
 userPoJo.setUsername("u");
 userVo.setUserPoJo(userPoJo);

 List<UserPoJo> userPoJoList = userMapper.findUserList(userVo);

 System.out.println(userPoJoList);
 }

最后結(jié)果如下

二、輸出映射

1、resultType

①在使用resultType進(jìn)行映射的時(shí)候,只有查詢出來的列名和包裝類型中的屬性名一致的時(shí)候,才會(huì)映射成功

②當(dāng)使用簡單類型作為輸出映射的時(shí)候,我們需要保證Sql查詢的結(jié)果只有一行一列,這樣就可以使用簡單類型

如下所示示例

SELECT COUNT(*) FROM t_user

SELECT username FROM t_user WHERE id = 2

2、resultMap  

查詢出來的列名和包裝類型的屬性名不一致的時(shí)候,可以使用resultMap來進(jìn)行相應(yīng)的映射(具體在使用中來說就是:定義resultMap中和屬性的映射關(guān)系,然后將輸出結(jié)果設(shè)置為resultMap的類型)  

下面我們使用一個(gè)例子來進(jìn)行具體的測試

①首先編寫mapper配置文件,其中需要加上resultMap的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mybatis.mapper.UserMapper">

 <!--定義resultMap
 type:resultMap最終映射的Java對(duì)象類型
 id:對(duì)resultMap的標(biāo)識(shí)
 -->
 <resultMap id="userResultMap" type="user">
 <!--id:標(biāo)識(shí)查詢結(jié)果集中的唯一標(biāo)識(shí)-->
 <id column="_id" property="id"></id>
 <!--result:標(biāo)識(shí)查詢結(jié)果集中其他列的標(biāo)識(shí)-->
 <result column="_username" property="username"></result>
 <result column="_password" property="password"></result>
 <result column="_sex" property="sex"></result>
 <result column="_address" property="address"></result>
 </resultMap>

 <select id="findUserById_resultMap" parameterType="int" resultMap="userResultMap">
 SELECT id _id, username _username, PASSWORD _password, address _address, sex _sex FROM t_user WHERE id = #{id}
 </select>
</mapper>

②然后在Mapper接口中添加方法

 //測試resultMap
 public User findUserById_resultMap(int id) throws Exception;

③ 測試方法

@Test
 public void testFindUserById_resultMap() throws Exception {
 SqlSession sqlSession = sqlSessionFactory.openSession();
 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

 User user = userMapper.findUserById_resultMap(2);

 System.out.println(user);
 }

④可以發(fā)現(xiàn),使用resultMap的方式跟直接查詢的結(jié)果是一致的

三、動(dòng)態(tài)Sql

1、if判斷

我們?cè)谏厦媸褂冒b類查詢的用例的時(shí)候,考慮到可能出現(xiàn)userPoJo會(huì)是null的情況,以及其相應(yīng)的屬性也可能是null的情況,這樣的話,如果我們直接在Sql中進(jìn)行拼接而不做判斷的話,可能會(huì)出現(xiàn)一些錯(cuò)誤,所以我們使用if來進(jìn)行動(dòng)態(tài)的拼接。

<select id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">
 SELECT * FROM t_user
 <where>
  <if test="userPoJo != null">
  <if test="userPoJo.sex != null and userPoJo.sex != ''">
   AND sex = #{userPoJo.sex}
  </if>
  <if test="userPoJo.username != null and userPoJo.username != ''">
   AND username LIKE '%${userPoJo.username}%'
  </if>
  </if>
 </where>
 </select>

2.Sql片段

上面的例子中,我們可以將if判斷抽取出來作為一個(gè)Sql片段,這樣做的好處是,可能再進(jìn)行別的單表查詢User信息的時(shí)候可以重復(fù)使用這些Sql。

<!--定義Sql片段-->
 <sql id="query_user_info">
 <if test="userPoJo != null">
  <if test="userPoJo.sex != null and userPoJo.sex != ''">
  AND sex = #{userPoJo.sex}
  </if>
  <if test="userPoJo.username != null and userPoJo.username != ''">
  AND username LIKE '%${userPoJo.username}%'
  </if>
 </if>
 </sql>

然后在別的Sql中將上面的Sql片段引入拼接即可

<select id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">
 SELECT * FROM t_user
 <where>
  <include refid="query_user_info"></include>
 </where>
 </select>

3.foreach

當(dāng)我們需要一種同樣的查詢方式只是參數(shù)不同的時(shí)候:SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3),可以使用foreach來記性sql拼接

<sql id="query_ids">
 <if test="ids != null">
  <!--
  SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3)
  cilleation: 指定的是輸入?yún)?shù)集合的屬性名
  item:每次遍歷的名稱
  open:開始遍歷時(shí)拼接串
  close:結(jié)束遍歷時(shí)候拼接的串
  separator:遍歷的兩個(gè)對(duì)象中間需要拼接的串
  -->
  <foreach collection="ids" item="item_id" open="AND (" close=")" separator=" OR ">
  id=#{item_id}
  </foreach>
 </if>
 </sql>

然后將上面的Sql片段加入響應(yīng)的statment中

 <select id="findUserByIds" parameterType="userVo" resultType="userPoJo">
 SELECT * FROM t_user
 <where>
  <include refid="query_ids"></include>
 </where>
 </select>

測試結(jié)果如下

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • java調(diào)用Restful接口的三種方法

    java調(diào)用Restful接口的三種方法

    本文主要介紹了java調(diào)用Restful接口的三種方法,主要包括HttpURLConnection實(shí)現(xiàn),HttpClient實(shí)現(xiàn)和Spring的RestTemplate,具有一定的參考,感興趣的可以了解一下    
    2021-08-08
  • 深層剖析java應(yīng)用開發(fā)中MyBayis緩存

    深層剖析java應(yīng)用開發(fā)中MyBayis緩存

    這篇文章主要為大家深層剖析java開發(fā)中MyBayis緩存,文中講解了Mybatis緩存的分類以及使用的方式,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • springboot配置mysql連接的實(shí)例代碼

    springboot配置mysql連接的實(shí)例代碼

    這篇文章主要介紹了springboot配置mysql連接的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛好者有所幫助,同時(shí)祝大家有一個(gè)好成績,需要的朋友可以參考下,希望能給你帶來幫助
    2021-07-07
  • Hadoop Combiner使用方法詳解

    Hadoop Combiner使用方法詳解

    這篇文章主要介紹了 Hadoop Combiner使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 細(xì)說Springcloud eureka的幾種主動(dòng)下線服務(wù)的方式

    細(xì)說Springcloud eureka的幾種主動(dòng)下線服務(wù)的方式

    這篇文章主要介紹了細(xì)說Springcloud eureka的幾種主動(dòng)下線服務(wù)的方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • java中JVM中如何存取數(shù)據(jù)和相關(guān)信息詳解

    java中JVM中如何存取數(shù)據(jù)和相關(guān)信息詳解

    這篇文章主要介紹了JVM中如何存取數(shù)據(jù)和相關(guān)信息詳解,Java源代碼文件(.java后綴)會(huì)被Java編譯器編譯為字節(jié)碼文件,然后由JVM中的類加載器加載各個(gè)類的字節(jié)碼文件,加載完畢之后,交由JVM執(zhí)行引擎執(zhí)行。JVM中怎么存取數(shù)據(jù)和相關(guān)信息呢?,需要的朋友可以參考下
    2019-06-06
  • SpringBoot整合MyBatis Plus實(shí)現(xiàn)基本CRUD與高級(jí)功能

    SpringBoot整合MyBatis Plus實(shí)現(xiàn)基本CRUD與高級(jí)功能

    Spring Boot是一款用于快速構(gòu)建Spring應(yīng)用程序的框架,而MyBatis Plus是MyBatis的增強(qiáng)工具,本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中整合MyBatis Plus,并展示其基本CRUD功能以及高級(jí)功能的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-02-02
  • 詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置

    詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置

    本篇文章主要介紹了詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • Springboot如何配置多個(gè)Redis數(shù)據(jù)源(非集群)

    Springboot如何配置多個(gè)Redis數(shù)據(jù)源(非集群)

    這篇文章主要介紹了Springboot如何配置多個(gè)Redis數(shù)據(jù)源(非集群)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評(píng)論

延寿县| 广安市| 涟水县| 南汇区| 宜兰市| 汶川县| 铜陵市| 林周县| 定南县| 彝良县| 奉化市| 会宁县| 彭泽县| 长乐市| 皋兰县| 翁牛特旗| 洛扎县| 高碑店市| 潍坊市| 新兴县| 雷山县| 云林县| 灌南县| 西乌珠穆沁旗| 甘孜县| 疏勒县| 永清县| 瑞安市| 淮南市| 九台市| 会宁县| 天等县| 定安县| 福清市| 辛集市| 宁河县| 和静县| 东平县| 海安县| 察雅县| 宁明县|