Mybatis-04-結果集對映resultMap/動態SQL/關聯查詢
一.結果集對映resultMap
resultType可以指定將查詢結果對映為持久化類,但需要持久化類的屬性名和sql查詢的列名一致才能對映成功。如果資料庫中的表的欄位名和持久化類的屬性名不一致,則需要通過resultMap將欄位名和屬性名建立起對應關係
例如:
資料庫表bbs_employee
持久化類BbsEmployee
public class BbsEmployee {
private String username;
private String password;
private String degree;
private String email;
private Boolean gender;
private String imgUrl;
private String phone;
private String realName;
private String school;
.......
需要在mapper.xml檔案中新增配置:
<!-- type指定對映到哪一個持久化類-->
<resultMap id="BaseResultMap" type="com.sandking.mybatis.pojo.BbsEmployee" >
<id column ="username" property="username" jdbcType="VARCHAR" />
<!-- property:對應持久化類中的屬性 -->
<!-- column:對應資料庫表中的欄位 -->
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="degree" property="degree" jdbcType="VARCHAR" />
<result column ="email" property="email" jdbcType="VARCHAR" />
<result column="gender" property="gender" jdbcType="BIT" />
......
<result column="is_del" property="isDel" jdbcType="BIT" />
</resultMap>
< resultMap >標籤與< select >< insert >等標籤同級
二.動態SQL
通過Mybatis為mapper對映檔案提供的幾種標籤,實現動態**拼接**SQL,即SQL不是寫死的而是根據傳入的引數可以發生變化的
1.if標籤
為引數設定條件,當條件滿足才會將if標籤內的內容拼接到向資料庫傳送的SQL中
if標籤的使用案例:
mapper.xml檔案
<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
resultType="com.sandking.mybatis.pojo.BbsEmployee">
SELECT * FROM `bbs_employee`
WHERE 1=1
<!--新增if標籤,test屬性是if的條件-->
<if test="username != null and username !=''">
AND username LIKE #{username}
</if>
<if test="password != null and password !=''">
AND password LIKE #{password}
</if>
</select>
測試程式:
@Test
public void testQuery(){
SqlSession sqlSession = sqlSessionFactory.openSession();
BbsEmployee employee = new BbsEmployee();
employee.setUsername("%ad%");
//傳入查詢引數,password的值不為空
employee.setPassword("%1%");
BbsEmployee bbsEmployee = sqlSession.selectOne("queryTest",employee);
System.out.println(bbsEmployee);
sqlSession.close();
}
查詢結果:
Mybatis向資料庫傳送的查詢語句中有兩個限定範圍的條件,username和password
更改測試程式傳入的查詢引數值
@Test
public void testQuery(){
SqlSession sqlSession = sqlSessionFactory.openSession();
BbsEmployee employee = new BbsEmployee();
employee.setUsername("%ad%");
//設定傳入引數password的值為空
employee.setPassword("");
BbsEmployee bbsEmployee = sqlSession.selectOne("queryTest",employee);
System.out.println(bbsEmployee);
sqlSession.close();
}
查詢結果:
可以看到,因為password的值為null,不符合if標籤的條件,if標籤內的內容就沒有拼接到向資料庫傳送的SQL中
2.foreach標籤
如果SQL的引數是一個數組,例如:
SELECT * FROM `bbs_employee` WHERE id IN ( ? , ? , ? , ? )
需要傳遞id的值,而且不確定到底有多少個id值(即SQL需要根據引數的數量做相應更改),這是就需要用到foreach標籤
foreach標籤的使用案例:
在BbsEmployee持久化類中增加一個字串陣列
private List<String> ids;
mapper對映檔案:
<select id="query3" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
resultType="com.sandking.mybatis.pojo.BbsEmployee">
SELECT * FROM `bbs_employee`
WHERE
<!-- foreach標籤遍歷集合或陣列 -->
<!-- collection:遍歷的集合,這裡是的ids屬性 -->
<!-- item:定義被遍歷的元素的名稱,需要和後面的#{}中的名稱對應 -->
<!-- open:在前面新增的sql片段 -->
<!-- close:在結尾處新增的sql片段 -->
<!-- separator:指定遍歷的元素之間使用的分隔符 -->
<foreach collection="ids" item="id" open="id IN (" close=")"
separator=",">
#{id}
</foreach>
</select>
測試程式:
@Test
public void query3(){
SqlSession sqlSession = sqlSessionFactory.openSession();
BbsEmployee employee = new BbsEmployee();
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("4");
list.add("5");
employee.setIds(list);
List<BbsEmployee> list1 = sqlSession.selectList("query3",employee);
for (BbsEmployee e:list1) {
System.out.println(e);
}
sqlSession.close();
}
查詢結果:
3.include標籤
用於抽取相同的SQL片段,增加重用性,減少書寫量
include標籤的使用案例:
<select id="query3" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
resultType="com.sandking.mybatis.pojo.BbsEmployee">
<include refid="select"/>
WHERE
<foreach collection="ids" item="id" open="id IN (" close=")"
separator=",">
#{id}
</foreach>
</select>
<sql id="select">
SELECT * FROM `bbs_employee`
</sql>
4.where標籤
用於代替傳統SQL語句中的“where 1=1”
where標籤的使用案例:
傳統方式:
<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
resultType="com.sandking.mybatis.pojo.BbsEmployee">
SELECT * FROM `bbs_employee`
WHERE 1=1
<if test="username != null and username !=''">
AND username LIKE #{username}
</if>
<if test="password != null and password !=''">
AND password LIKE #{password}
</if>
</select>
使用where標籤:
<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
resultType="com.sandking.mybatis.pojo.BbsEmployee">
SELECT * FROM `bbs_employee`
<where>
<if test="username != null and username !=''">
AND username LIKE #{username}
</if>
<if test="password != null and password !=''">
AND password LIKE #{password}
</if>
</where>
</select>
查詢結果:
可以看出where標籤自動去掉了username的前的AND關鍵字
三.關聯查詢
相關推薦
Mybatis-04-結果集對映resultMap/動態SQL/關聯查詢
一.結果集對映resultMap resultType可以指定將查詢結果對映為持久化類,但需要持久化類的屬性名和sql查詢的列名一致才能對映成功。如果資料庫中的表的欄位名和持久化類的屬性名不一致,則需要通過resultMap將欄位名和屬性名建立起對應關係
mybatis百科-結果集對映類ResultMap
ResultMap 對應的是結果集 <resultMap>中的一個結果集。 其基本組成部分中, 含有 ResultMapping 物件。 其組成大致如下: 本文, 主要講解一下該類的組成。 1 成員變數 // resultMap 節點的 id private String id; /
Mybatis3.0-[tp_28-29]-對映檔案-resultMap_自定義結果集對映規則_及關聯環境的搭建
筆記要點出錯分析與總結工程組織 1.定義介面 EmployeeMapperPlus.java package com.dao; import com.bean.*; public interface EmployeeMapperPlus { public
Mybatis 強大的結果集對映器resultMap
![](https://img2020.cnblogs.com/other/1739473/202005/1739473-20200524091305801-1718891610.jpg) ## 1. 前言 > `resultMap` 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90
MyBatis的關聯對映和動態SQL
一、MyBatis的關聯對映 在實際開發中,實體與實體之間不是孤立存在的,往往實體與實體之間是存在關聯的;例如班級中可以多個學生,每個學生屬於一個班級,這種例項之間相互訪問就是關聯關係。關聯關係分為三類:一對一,一對多,多對多。 1.一對一 比如說,一個人只能有一個身份證,一個身份證只能
resultMap的用法以及關聯結果集對映
resultType resultType可以把查詢結果封裝到pojo型別中,但必須pojo類的屬性名和查詢到的資料庫表的欄位名一致。 如果sql查詢到的欄位與pojo的屬性名不一致,則需要使用resultMap將欄位名和屬性名對應起來,進行手動配置封裝,將
MyBatis中的結果集對映---介面全註解
實體類: package cn.et.lesson03; public class Emp { private String empNo; private String ename; public String getEmpNo() { return
MyBatis框架的學習(四)——Mapper.xml檔案中的輸入和輸出對映以及動態sql
前面對MyBatis框架的學習中,我們對Mapper.xml對映檔案多少有些瞭解。本文將對Mapper.xml對映檔案作更加細緻的梳理,首先從Mapper.xml檔案中的輸入和輸出對映開始。本文案例程式碼的編寫是建立在前文MyBatis框架的學習(三)——Dao
hibernate將sql或hql查詢結果集對映為實體類 不需要對映檔案
感謝glamey兄弟的文章,正好解決了當前遇到的問題。原文連結如下:http://glamey.iteye.com/blog/721019 假設我們現在有一個DTO,其屬性包括兩張表的屬性,我們現在需要將sql語句查詢得到的內容轉為一個DTO物件,其解決
MyBatis中的結果集對映---xml配置檔案
實體類: package cn.et.lesson03.dept; // default package import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; /**
MyBatis輸入對映、輸出對映、動態SQL、關聯關係、Spring整合加強筆記
1. 計劃 1. 輸入對映 2. 輸出對映 3. 動態SQL 4. 關聯關係 5. Spring整合MyBatis 2. 輸入對映 2.1.1. 輸入對映-包裝pojo 我們假設建立一個身份證資
MyBatis查詢結果集對映到JavaBean原理淺談
MyBatis對JDBC做了很好的封裝,其中一個吸引人的地方就是能夠對從資料庫內查詢出來的表的記錄集對映生成一系列JavaBean,供應用程式使用。今天跟著原始碼一層一層探討一下MyBatis把資料庫記錄集對映到POJO物件的一個簡要的過程。 1. DefaultResul
Mybatis中update一個實體的動態sql
trim myba type 包含 刪掉 logs ear err ref <update id="updateOne" parameterType="com.inspur.search.data.EntityRelation"> UPDATE ENTIT
Mybatis——傳入POJO對象,動態SQL,多表關系
this h標簽 根據 strong src 實現 圖片 tis his 傳入POJO對象 QueryVo.java public class QueryVo implements Serializable{ private User user; pu
mybatis 詳解(五)------動態SQL
調用 otherwise efi 實例 其中 參數 sep 引用 完成 目錄 1、動態SQL:if 語句 2、動態SQL:if+where 語句 3、動態SQL:if+set 語句 4、動態SQL:choose(when,otherwise) 語句 5、動態SQL:tr
MyBatis學習總結(三)——多表關聯查詢與動態SQL
一、多表關聯查詢 表與表之間有三種常見的關聯關係,分別是一對一,一對多與多對多關係,MyBatis直接提供一對一與一對多的關聯關係,可以通過間接的方式實現多對多關聯。 1.1、一對一關係 1.1.1、執行環境 假定一個員工(emp)擁有一個登入使用者(user),員工與使用者表之間是一對一關係:
mybatis學習筆記(七)- 動態 SQL
工程目錄 1. 環境配置 1.1 建立 EmployeeMapperDynamicSQL 介面 1.2 建立 EmployeeMapperDynamicSQL.xml 檔案 2. 重要標籤的使用 2.1 在 EmployeeMapperDynamicSQL 中
結果集對映
這樣使用,程式碼如下(紅色字型): --------------------------------程式碼開始---------------------------------- <?xml version="1.0" encoding="UTF-8" ?> <!DOCTY
Mybatis動態SQL 條件查詢,批量刪除
比如說某寶的搜尋。可以新增選擇的嘛。也就是where 後面的條件。如果有12種條件。要是全一個一個寫那是要寫很多哦。mybatis就有動態sql。根據條件組合sql語句。 首先建立個前端頁面 <!DOCTYPE html> <html&
Mybatis學習筆記(六)--動態sql拼接
介紹 通過mybatis提供的各種標籤方法實現動態拼接sql Mybatis動態sql---<sql>與<include> <!-- 使用include標籤載入sql片段;refid是sql片段id --> <sql id="select"&