Mybatis中輸入輸出映射和動態Sql

一、輸入映射

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

  1、簡單類型

  2、POJO包裝類型

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

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

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

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

 1 package cn.mybatis.po;2 3 public class UserPoJo extends User{4     private User user;5 6     public void setUser(User user) {7         this.user = user;8     }9 
10     public User getUser() {
11         return user;
12     }
13 }復制代碼

 1 package cn.mybatis.po;2 3 public class UserVo {4     private UserPoJo userPoJo;5 6     public UserPoJo getUserPoJo() {7         return userPoJo;8     }9 
10     public void setUserPoJo(UserPoJo userPoJo) {
11         this.userPoJo = userPoJo;
12     }
13 }復制代碼

  然后我們配置UserMapper.xml文件

  然后在UserMapper接口文件中添加

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

  使用Junit測試剛剛做的配置

 1     @Test2     public void testFindUserList() throws Exception {3         SqlSession sqlSession = sqlSessionFactory.openSession();4         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);5 6         UserPoJo userPoJo = new UserPoJo();7         UserVo userVo = new UserVo();8         userPoJo.setSex("男");9         userPoJo.setUsername("u");
10         userVo.setUserPoJo(userPoJo);
11 
12         List<UserPoJo> userPoJoList = userMapper.findUserList(userVo);
13 
14         System.out.println(userPoJoList);
15     }復制代碼

  最后結果如下

二、輸出映射

1、resultType

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

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

如下所示示例

SELECT COUNT(*) FROM t_userSELECT username FROM t_user WHERE id = 2復制代碼

2、resultMap  

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

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

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

 1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">5 <mapper namespace="cn.mybatis.mapper.UserMapper">6 7     <!--定義resultMap8         type:resultMap最終映射的Java對象類型9         id:對resultMap的標識
10     -->
11     <resultMap id="userResultMap" type="user">
12         <!--id:標識查詢結果集中的唯一標識-->
13         <id column="_id" property="id"></id>
14         <!--result:標識查詢結果集中其他列的標識-->
15         <result column="_username" property="username"></result>
16         <result column="_password" property="password"></result>
17         <result column="_sex" property="sex"></result>
18         <result column="_address" property="address"></result>
19     </resultMap>
20 
21     <select id="findUserById_resultMap" parameterType="int" resultMap="userResultMap">
22         SELECT id _id, username _username, PASSWORD _password, address _address, sex _sex FROM t_user WHERE id = #{id}
23     </select>
24 </mapper>復制代碼

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

    //測試resultMappublic User findUserById_resultMap(int id) throws Exception;復制代碼

  ③ 測試方法

1     @Test
2     public void testFindUserById_resultMap() throws Exception {
3         SqlSession sqlSession = sqlSessionFactory.openSession();
4         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
5 
6         User user = userMapper.findUserById_resultMap(2);
7 
8         System.out.println(user);
9     }復制代碼

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

三、動態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>復制代碼

2.Sql片段

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

 1     <!--定義Sql片段-->2     <sql id="query_user_info">3         <if test="userPoJo != null">4             <if test="userPoJo.sex != null and userPoJo.sex != ''">5                 AND sex = #{userPoJo.sex}6             </if>7             <if test="userPoJo.username != null and userPoJo.username != ''">8                 AND username LIKE '%${userPoJo.username}%'9             </if>
10         </if>
11     </sql>復制代碼

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

1     <select id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">
2         SELECT * FROM t_user
3         <where>
4             <include refid="query_user_info"></include>
5         </where>
6     </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>復制代碼

測試結果如下


轉載于:https://juejin.im/post/5ceb9bc9f265da1bb13f1022

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css純字母或者字母換行顯示

white-space:normal; word-break:break-all;轉載于:https://www.cnblogs.com/mmykdbc/p/7661009.html

javascript使用btoa和atob來進行Base64轉碼和解碼

javascript中如何使用Base64轉碼 let str javascript;let btoaStr window.btoa(str); //轉碼結果 amF2YXNjcmlwdAconsole.log(btoaStr);console.log(window.atob(btoaStr)); //解碼結果 javascriptBase64轉碼的對象只能是字符串, var str "China&#xff0c;中國"…

珠寶條碼打印掃描解決方案

隨著人們生活水平的逐步提高&#xff0c;珠寶消費日益增長&#xff0c;據統計&#xff0c;我國珠寶首飾零售規模超過7000億&#xff0c;過去5年復合增長為15%&#xff0c;是規模增長最為迅速的可選消費品類之一。面對千億級的消費市場&#xff0c;珠寶行業競爭激烈&#xff0c;…

課程作業1

1使用組合數公式利用n!來計算 a.設計思想 定義n和k&#xff0c;用遞歸函數表示出N!的階乘結果&#xff0c;c(n,k)n!/(k!(n-k)!);調用函數求出c(n,k)的結果 b.源代碼 package kecheng1; import java.util.Scanner; public class Test {public static void main(String[] args) {…

新手學Python推薦的四本書籍+2個資源網站

2019獨角獸企業重金招聘Python工程師標準>>> 很多伙伴初學Python&#xff0c;會問到&#xff1a;有沒有好的學習書籍推薦&#xff1f;有沒有好的學習網站推薦&#xff1f; 針對這類伙伴的問題&#xff0c;小優給大家整理了學習Python的四本書籍2個資源網站&#xff…

【轉】Linux系統編程---dup和dup2詳解

正常的文件描述符&#xff1a; 在linux下&#xff0c;通過open打開以文件后&#xff0c;會返回一個文件描述符&#xff0c;文件描述符會指向一個文件表&#xff0c;文件表中的節點指針會指向節點表。看下圖&#xff1a; 打開文件的內核數據結構 dup和dup2兩個函數都可以用來復制…

Android Activity標簽屬性

Android Activity標簽屬性 Activity 是 Android 系統四大應用組件之一&#xff0c;用戶可與 Activity 提供的屏幕進行交互&#xff0c;以執行撥打電話、拍攝照片、發送電子郵件等操作開發者必須在清單文件中聲明要使用的 Activity&#xff0c;這樣系統才能訪問它。聲明方式是在…

Java -----JVM運行時數據區

一、JVM體系結構 想要了解運行時數據區&#xff0c;先關注一下JVM的體系結構&#xff0c;知道數據區在JVM的整體位置和作用。 二、JVM運行時數據區 1.程序計數器 一塊較小的內存空間&#xff0c;它是當前線程所執行的字節碼的行號指示器&#xff0c;字節碼解釋器工作時通過改變…

20155235 《網絡攻防》 實驗八 Web基礎

20155235 《網絡攻防》 實驗八 Web基礎 實驗內容 Web前端HTML(0.5分) 能正常安裝、啟停Apache。理解HTML&#xff0c;理解表單&#xff0c;理解GET與POST方法,編寫一個含有表單的HTML。Web前端javascipt(0.5分) 理解JavaScript的基本功能&#xff0c;理解DOM。編寫JavaScript驗…

python每天1道面試題(3)--字符串組合

""" 題目3&#xff1a;輸入一個字符串&#xff0c;輸出該字符串中字符的所有組合。舉個例子&#xff0c;如果輸入abc&#xff0c;它的組合有a、b、c、ab、ac、bc、abc。解題思路: 先用列舉法,舉例出組合元素長度分別是1,2,..,len(str)時的具體元素, 然后發現當數…

【每周一圖】蜂鳥

攝影/祈澈姑娘小花園偶遇的一只蜂鳥轉載于:https://www.cnblogs.com/wangting888/p/9702088.html

API網關如何實現對服務下線實時感知

上篇文章《Eureka 緩存機制》介紹了Eureka的緩存機制&#xff0c;相信大家對Eureka 有了進一步的了解&#xff0c;本文將詳細介紹API網關如何實現服務下線的實時感知。 一、前言 在基于云的微服務應用中&#xff0c;服務實例的網絡位置都是動態分配的。而且由于自動伸縮、故障和…

TCP為什么要三次握手和四次揮手

http://www.jellythink.com/archives/705 簡析TCP的三次握手與四次分手 https://zhuanlan.zhihu.com/p/24001696 計算機網絡面試題 https://www.zhihu.com/question/36930631 TCP四次分手中&#xff0c;主動關閉方最后為什么要等待2MSL之后才關閉連接&#xff1f; http://ww…

Java處理文件BOM頭的方式推薦

背景&#xff1a; java普通的文件讀取方式對于bom是無法正常識別的。 使用普通的InputStreamReader&#xff0c;如果采用的編碼正確&#xff0c;那么可以獲得正確的字符&#xff0c;但bom仍然附帶在結果中&#xff0c;很容易導致數據處理出錯。另外&#xff0c;對于存在BOM頭的…

封裝svg組件

如何封裝svg圖標組件 封裝svg圖標組件的方法有很多種&#xff0c;如果只是單純的想使用svg圖標&#xff0c;可以將svg導出fonts字體圖標使用&#xff0c;但這樣做會失去svg原有的樣式與尺寸&#xff0c;也可以當成img圖片或者背景引入&#xff0c;但這樣做非常繁瑣。 最近項目中…

RabbitMQ 延遲隊列,消息延遲推送

應用場景 目前常見的應用軟件都有消息的延遲推送的影子&#xff0c;應用也極為廣泛&#xff0c;例如&#xff1a; 淘寶七天自動確認收貨。在我們簽收商品后&#xff0c;物流系統會在七天后延時發送一個消息給支付系統&#xff0c;通知支付系統將款打給商家&#xff0c;這個過程…

windows Navicat Premium連接oracle

需要下載并指定Instant Client 下載地址&#xff1a;在oracle官網搜索Instant Client Downloads選擇自己需要的客戶端 //說明 //Navicat 版本 9 或以上捆綁了 instant client&#xff0c;但是捆綁的用不了&#xff0c;捆綁的10.2。因此下載高版本替換之 //版本有要求&#xff0…

關于arraylist的擴容機制

ArrayList會自動改變size的長度&#xff1a; 首先&#xff0c;ArrayList定義了一個私有的未被序列化的數組elementData&#xff0c;用來存儲ArrayList的對象列表&#xff08;注意只定義未初始&#xff09;&#xff1a;private transient Object[] elementData;   其次&am…

不同級別UI設計師的區別有哪些?

不同等級的UI設計師在工作內容以及基本的薪資待遇方面也是有區別的&#xff0c;很多在UI培訓學校學習的小伙伴們并不知道各個等級的UI設計師工作內容有什么差別&#xff0c;那么合肥學碼思小編就給大家總結一下這些區別分別表現在哪些方面。 一、初級UI設計師 初級UI設計師的主…

Linux命令行參數前加--,-和不加杠

參數前“-”的表明后面的參數是字符形式。參數前“--”的則表明后面的參數是單詞形式。參數前有橫的是System V風格。 參數前沒有橫的是BSD風格。 轉載于:https://www.cnblogs.com/YYRise/p/9090476.html