詳解MyBatis resultType與resultMap中的幾種返回類(lèi)型
一、返回集合
1.返回JavaBean集合
public List<MyUser> selectMyUserByNameLike(String name);
<!-- resultType 集合內(nèi)的元素類(lèi)型 -->
<select id="selectMyUserByNameLike" resultType="myUser" parameterType="string">
select * from myuser where name like #{name}
</select>
測(cè)試方法
public static void main(String[] args) {
SqlSession session = null;
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
session = sqlSessionFactory.openSession();
MyUserMapper mapper = session.getMapper(MyUserMapper.class);
List<MyUser> myUsers = mapper.selectMyUserByNameLike("%a%");
System.out.println(myUsers);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}

2.返回 Map 集合
<!--public List<Map<String,Object>> getMyUser()--> <select id="getMyUser" resultType="map"> select * from myuser </select>

二、返回 Map
1.一條記錄
public Map<String,Object> selectMyUserById(Integer id);
<select id="selectMyUserById" resultType="map" parameterType="integer">
select * from myuser where id = #{id}
</select>

2.多條記錄,需要指定 Map 的 Key 和 Value 的類(lèi)型
// 指定 Map 的 Key 從記錄中的 id 列獲取
@MapKey("id")
public Map<String,MyUser> selectMyUserByGtId(Integer id);
<!-- resultType Map 中 value 的類(lèi)型 -->
<select id="selectMyUserByGtId" resultType="myUser" parameterType="integer">
select * from myuser where id > #{id}
</select>

三、返回 resultMap 自定義結(jié)果集封裝
關(guān)于自動(dòng)映射封裝的配置
<settings>
<!-- 自動(dòng)映射有三種模式,NONE、PARTIAL、FULL。NONE 不啟用自動(dòng)映射,PARTIAL 只對(duì)非嵌套的 resultMap 進(jìn)行自動(dòng)映射,F(xiàn)ULL 表示對(duì)所有的 resultMap 都進(jìn)行自動(dòng)映射。默認(rèn)為 PARTIAL -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 數(shù)據(jù)庫(kù)字段下劃線轉(zhuǎn)Bean字段的駝峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 控制臺(tái)打印SQL -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
默認(rèn)數(shù)據(jù)庫(kù)字段與 JavaBean 對(duì)應(yīng)不上時(shí)可開(kāi)啟駝峰命名或查詢(xún)時(shí)使用別名http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
1.自定義 JavaBean 的封裝
確認(rèn)是否成功可以關(guān)掉 MyBatis 的自動(dòng)映射
<setting name="autoMappingBehavior" value="NONE"/>
public MyUser selectMyUserById(Integer id);
<!-- 自定義某個(gè) javaBean 的封裝規(guī)則
type:自定義規(guī)則中JavaBean類(lèi)型的全路徑,可用別名
id:唯一id方便引用 -->
<resultMap type="myUser" id="myUserResultMap">
<!-- 指定主鍵列的封裝規(guī)則,用 id 標(biāo)簽定義主鍵會(huì)底層有優(yōu)化
column:指定哪一列
property:指定對(duì)應(yīng)的javaBean屬性 -->
<id column="id" property="id"/>
<!-- 定義普通列封裝規(guī)則 -->
<result column="name" property="name"/>
<!-- 其他不指定的列會(huì)自動(dòng)封裝:建議只要寫(xiě) resultMap 就把全部的映射規(guī)則都寫(xiě)上 -->
<result column="age" property="age"/>
</resultMap>
<!-- 使用 resultMap,不使用 resultType -->
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
select * from myuser where id = #{id}
</select>

2.關(guān)聯(lián)查詢(xún)的封裝,一對(duì)一,JavaBean 屬性包含 JavaBean

public MyUser selectMyUserById(Integer id);
直接調(diào)用屬性賦值
<resultMap type="myUser" id="myUserResultMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!--直接屬性封裝-->
<result column="did" property="dept.id"/>
<result column="dname" property="dept.name"/>
</resultMap>
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
SELECT m.id, m.name, m.age, m.did, d.name AS dname FROM myuser m,dept d WHERE m.did = d.id AND m.id = #{id}
</select>

使用association
<resultMap type="com.bean.MyUser" id="myUserResultMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!-- association 指定聯(lián)合的 javaBean 對(duì)象
property="dept":指定哪個(gè)屬性是聯(lián)合的對(duì)象
javaType:指定這個(gè)屬性對(duì)象的類(lèi)型[不能省略] -->
<association property="dept" javaType="com.bean.Dept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
</association>
</resultMap>
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
SELECT m.id, m.name, m.age, m.did, d.name AS dname FROM myuser m,dept d WHERE m.did = d.id AND m.id = #{id}
</select>
使用association 二次查詢(xún),即有兩條 SQL
<resultMap id="myUserResultMap" type="com.bean.MyUser">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!-- association 定義關(guān)聯(lián)對(duì)象的封裝規(guī)則
select:當(dāng)前屬性是調(diào)用 select 指定的方法查出的結(jié)果
column:將哪一列的值傳給這個(gè)方法 -->
<association property="dept" select="com.dao.DeptMapper.selectDeptById" column="did"/>
</resultMap>
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
SELECT * FROM myuser WHERE id = #{id}
</select>
<?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">
<!-- namespace 對(duì)應(yīng)接口文件的全路徑 -->
<mapper namespace="com.dao.DeptMapper">
<select id="selectDeptById" resultType="dept" parameterType="string">
select * from dept where id = #{id}
</select>
</mapper>

開(kāi)啟懶加載:在沒(méi)有使用 Dept 的屬性時(shí),則只會(huì)加載 MyUser 的屬性。即只會(huì)發(fā)送一條 SQL 語(yǔ)句,要使用Dept 屬性時(shí)才會(huì)發(fā)送第二條 SQL。不會(huì)一次性發(fā)送兩條 SQL
<!-- 延遲加載的全局開(kāi)關(guān)。當(dāng)開(kāi)啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載。 特定關(guān)聯(lián)關(guān)系中可通過(guò)設(shè)置fetchType屬性來(lái)覆蓋該項(xiàng)的開(kāi)關(guān)狀態(tài)。默認(rèn)false --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 當(dāng)開(kāi)啟時(shí),任何方法的調(diào)用都會(huì)加載該對(duì)象的所有屬性。否則,每個(gè)屬性會(huì)按需加載。默認(rèn)false (true in ≤3.4.1) --> <setting name="aggressiveLazyLoading" value="false"/>
3.關(guān)聯(lián)查詢(xún)的封裝,一對(duì)多,JavaBean 屬性包含 JavaBean 的集合

使用association
public Dept getDeptById(Integer id);
<resultMap type="com.bean.Dept" id="MyDept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
<!-- collection 定義關(guān)聯(lián)集合類(lèi)型的屬性封裝規(guī)則
ofType 指定集合里面元素的類(lèi)型 -->
<collection property="myUsers" ofType="com.bean.MyUser">
<!-- 定義集合中元素的封裝規(guī)則 -->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</collection>
</resultMap>
<select id="getDeptById" resultMap="MyDept">
SELECT m.id,m.name,m.age,m.did,d.name AS dname FROM myuser m,dept d WHERE m.did = d.id AND d.id = #{id}
</select>

關(guān)閉懶加載,使用二次查詢(xún)
public Dept getDeptByIdStep(Integer did);
<!-- Collection 分段查詢(xún) -->
<resultMap type="com.bean.Dept" id="MyDeptStep">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="myUsers" select="com.dao.MyUserMapper.selectMyUserByDid"
column="{did=id}" fetchType="eager"/>
<!-- column 要處理復(fù)合主鍵或傳遞多個(gè)值過(guò)去:可以將多列的值封裝 Map 傳遞,指定多個(gè)列名通過(guò) column="{prop1=col1,prop2=col2}"
語(yǔ)法來(lái)傳遞給嵌套查詢(xún)語(yǔ)句。這會(huì)引起 prop1 和 prop2 以參數(shù)對(duì)象形式來(lái)設(shè)置給目標(biāo)嵌套查詢(xún)語(yǔ)句
fetchType="lazy":是否延遲加載,優(yōu)先級(jí)高于全局配置,lazy:延遲,eager:立即 -->
</resultMap>
<select id="getDeptByIdStep" resultMap="MyDeptStep">
select * from dept where id = #{id}
</select>
public List<MyUser> selectMyUserByDid(Integer dId);
<select id="selectMyUserByDid" resultType="myUser">
select * from myuser where dId = #{did}
</select>

4.鑒別器discriminator
<!--public MyUser selectMyUserById(Integer id);-->
<select id="selectMyUserById" resultMap="MyEmpDis" parameterType="integer">
SELECT * FROM myuser WHERE id = #{id}
</select>
<resultMap id="MyEmpDis" type="com.bean.MyUser">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!-- column:指定判定的列名 javaType:列值對(duì)應(yīng)的java類(lèi)型 -->
<discriminator javaType="integer" column="age">
<!-- 21歲 封裝課程至 JavaBean -->
<case value="21" resultType="com.bean.MyUser">
<association property="dept" select="com.dao.DeptMapper.selectDeptById" column="did"/>
</case>
<!-- 33歲 不封裝課程至 JavaBean 且把 age 賦值給 id -->
<case value="33" resultType="com.bean.MyUser">
<result column="age" property="id"/>
</case>
</discriminator>
</resultMap>
<!--public Dept selectDeptById(Integer id);-->
<select id="selectDeptById" resultType="dept" parameterType="string">
select * from dept where id = #{id}
</select>


上面測(cè)試中使用的實(shí)體類(lèi)與數(shù)據(jù)
public class Dept {
private Integer id;
private String name;
private List<MyUser> myUsers;
public class MyUser {
private Integer id;
private String name;
private Integer age;
private Dept dept;

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
到此這篇關(guān)于詳解MyBatis resultType與resultMap中的幾種返回類(lèi)型的文章就介紹到這了,更多相關(guān)MyBatis resultType與resultMap返回類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Controller Post接口單元測(cè)試示例
今天小編就為大家分享一篇關(guān)于SpringBoot Controller Post接口單元測(cè)試示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Spring Boot中快速操作Mongodb數(shù)據(jù)庫(kù)指南
這篇文章主要給大家介紹了關(guān)于Spring Boot中如何快速操作Mongodb的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Java加密解密工具(適用于JavaSE/JavaEE/Android)
這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下2016-04-04
Java JDK11基于嵌套的訪問(wèn)控制的實(shí)現(xiàn)
這篇文章主要介紹了Java JDK11基于嵌套的訪問(wèn)控制的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Springboot Retry組件@Recover失效問(wèn)題解決方法
在使用springboot的retry模塊時(shí),你是否出現(xiàn)過(guò)@Recover注解失效的問(wèn)題呢?不用擔(dān)心,這篇文章就來(lái)告訴你解決@Recover失效的辦法,需要的小伙伴可以參考一下2021-11-11
使用@Autowired注解警告Field injection is not recommended的解決
這篇文章主要介紹了使用@Autowired注解警告Field injection is not recommended的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

