亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis中輸入輸出映射與動態Sql圖文詳解

發布時間:2020-09-07 13:38:24 來源:腳本之家 閱讀:164 作者:風沙迷了眼 欄目:編程語言

一、輸入映射

我們通過配置parameterType的值來指定輸入參數的類型,這些類型可以是簡單數據類型、POJO、HashMap等數據類型

1、簡單類型

Mybatis中輸入輸出映射與動態Sql圖文詳解

2、POJO包裝類型

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

Mybatis中輸入輸出映射與動態Sql圖文詳解

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

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

Mybatis中輸入輸出映射與動態Sql圖文詳解

其中User文件同上一篇Mybatis簡單入門中的User,包括數據表部分也一樣。這里給出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文件

Mybatis中輸入輸出映射與動態Sql圖文詳解

然后在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);
 }

最后結果如下

Mybatis中輸入輸出映射與動態Sql圖文詳解

二、輸出映射

1、resultType

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

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

如下所示示例

SELECT COUNT(*) FROM t_user

SELECT username FROM t_user WHERE id = 2

2、resultMap  

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

下面我們使用一個例子來進行具體的測試

①首先編寫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對象類型
 id:對resultMap的標識
 -->
 <resultMap id="userResultMap" type="user">
 <!--id:標識查詢結果集中的唯一標識-->
 <id column="_id" property="id"></id>
 <!--result:標識查詢結果集中其他列的標識-->
 <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);
 }

④可以發現,使用resultMap的方式跟直接查詢的結果是一致的

Mybatis中輸入輸出映射與動態Sql圖文詳解

三、動態Sql

1、if判斷

我們在上面使用包裝類查詢的用例的時候,考慮到可能出現userPoJo會是null的情況,以及其相應的屬性也可能是null的情況,這樣的話,如果我們直接在Sql中進行拼接而不做判斷的話,可能會出現一些錯誤,所以我們使用if來進行動態的拼接。

<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>

Mybatis中輸入輸出映射與動態Sql圖文詳解

2.Sql片段

上面的例子中,我們可以將if判斷抽取出來作為一個Sql片段,這樣做的好處是,可能再進行別的單表查詢User信息的時候可以重復使用這些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

當我們需要一種同樣的查詢方式只是參數不同的時候: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: 指定的是輸入參數集合的屬性名
  item:每次遍歷的名稱
  open:開始遍歷時拼接串
  close:結束遍歷時候拼接的串
  separator:遍歷的兩個對象中間需要拼接的串
  -->
  <foreach collection="ids" item="item_id" open="AND (" close=")" separator=" OR ">
  id=#{item_id}
  </foreach>
 </if>
 </sql>

然后將上面的Sql片段加入響應的statment中

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

測試結果如下

Mybatis中輸入輸出映射與動態Sql圖文詳解

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

稻城县| 沅江市| 仪征市| 凤凰县| 泗阳县| 恭城| 丹寨县| 平邑县| 文水县| 卓尼县| 龙山县| 白水县| 盱眙县| 田东县| 碌曲县| 海安县| 松滋市| 垫江县| 达州市| 龙陵县| 自治县| 乌恰县| 永寿县| 西昌市| 香格里拉县| 禹城市| 西峡县| 吴川市| 宁国市| 哈密市| 祁阳县| 长白| 古田县| 永济市| 陇西县| 绥宁县| 曲沃县| 泌阳县| 印江| 双辽市| 深圳市|