Mybatis中輸入輸出映射與動態(tài)Sql圖文詳解
一、輸入映射
我們通過配置parameterType的值來指定輸入?yún)?shù)的類型,這些類型可以是簡單數(shù)據(jù)類型、POJO、HashMap等數(shù)據(jù)類型
1、簡單類型

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

②我們使用自定義POJO類型來具體的了解一下
先設計 包裝類型如下,其中UserPOJO是除了User本身之外的添加的其他跟User相關的屬性的包裝類,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);
}
最后結果如下

二、輸出映射
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);
}
④可以發(fā)現(xiàn),使用resultMap的方式跟直接查詢的結果是一致的

三、動態(tài)Sql
1、if判斷
我們在上面使用包裝類查詢的用例的時候,考慮到可能出現(xiàn)userPoJo會是null的情況,以及其相應的屬性也可能是null的情況,這樣的話,如果我們直接在Sql中進行拼接而不做判斷的話,可能會出現(xiàn)一些錯誤,所以我們使用if來進行動態(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判斷抽取出來作為一個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
當我們需要一種同樣的查詢方式只是參數(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:開始遍歷時拼接串
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>
測試結果如下

總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
細說Springcloud eureka的幾種主動下線服務的方式
這篇文章主要介紹了細說Springcloud eureka的幾種主動下線服務的方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
java中JVM中如何存取數(shù)據(jù)和相關信息詳解
這篇文章主要介紹了JVM中如何存取數(shù)據(jù)和相關信息詳解,Java源代碼文件(.java后綴)會被Java編譯器編譯為字節(jié)碼文件,然后由JVM中的類加載器加載各個類的字節(jié)碼文件,加載完畢之后,交由JVM執(zhí)行引擎執(zhí)行。JVM中怎么存取數(shù)據(jù)和相關信息呢?,需要的朋友可以參考下2019-06-06
SpringBoot整合MyBatis Plus實現(xiàn)基本CRUD與高級功能
Spring Boot是一款用于快速構建Spring應用程序的框架,而MyBatis Plus是MyBatis的增強工具,本文將詳細介紹如何在Spring Boot項目中整合MyBatis Plus,并展示其基本CRUD功能以及高級功能的實現(xiàn)方式,需要的朋友可以參考下2024-02-02
詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置
本篇文章主要介紹了詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置,非常具有實用價值,需要的朋友可以參考下2017-05-05
Springboot如何配置多個Redis數(shù)據(jù)源(非集群)
這篇文章主要介紹了Springboot如何配置多個Redis數(shù)據(jù)源(非集群)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03

