溫馨提示×

溫馨提示×

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

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

MyBatis中resultType與resultMap的返回類型有哪些

發(fā)布時(shí)間:2021-09-15 10:54:41 來源:億速云 閱讀:168 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下MyBatis中resultType與resultMap的返回類型有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、返回集合

1.返回JavaBean集合

public List<MyUser> selectMyUserByNameLike(String name);
<!-- resultType 集合內(nèi)的元素類型 -->
<select id="selectMyUserByNameLike" resultType="myUser" parameterType="string">
  select * from myuser where name like #{name}
</select>

測試方法

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();
        }
    }
}

MyBatis中resultType與resultMap的返回類型有哪些

2.返回 Map 集合

<!--public List<Map<String,Object>> getMyUser()-->
<select id="getMyUser" resultType="map">
  select * from myuser
</select>

MyBatis中resultType與resultMap的返回類型有哪些

二、返回 Map

1.一條記錄

public Map<String,Object> selectMyUserById(Integer id);
<select id="selectMyUserById" resultType="map" parameterType="integer">
  select * from myuser where id = #{id}
</select>

MyBatis中resultType與resultMap的返回類型有哪些

2.多條記錄,需要指定 Map 的 Key 和 Value 的類型

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

MyBatis中resultType與resultMap的返回類型有哪些

三、返回 resultMap 自定義結(jié)果集封裝

關(guān)于自動(dòng)映射封裝的配置

<settings>
    <!-- 自動(dòng)映射有三種模式,NONE、PARTIAL、FULL。NONE 不啟用自動(dòng)映射,PARTIAL 只對非嵌套的 resultMap 進(jìn)行自動(dòng)映射,F(xiàn)ULL 表示對所有的 resultMap 都進(jìn)行自動(dòng)映射。默認(rèn)為 PARTIAL -->
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <!-- 數(shù)據(jù)庫字段下劃線轉(zhuǎn)Bean字段的駝峰命名 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- 控制臺(tái)打印SQL -->
    <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

默認(rèn)數(shù)據(jù)庫字段與 JavaBean 對應(yīng)不上時(shí)可開啟駝峰命名或查詢時(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類型的全路徑,可用別名
    id:唯一id方便引用 -->
<resultMap type="myUser" id="myUserResultMap">
    <!-- 指定主鍵列的封裝規(guī)則,用 id 標(biāo)簽定義主鍵會(huì)底層有優(yōu)化
    column:指定哪一列
    property:指定對應(yīng)的javaBean屬性 -->
    <id column="id" property="id"/>
    <!-- 定義普通列封裝規(guī)則 -->
    <result column="name" property="name"/>
    <!-- 其他不指定的列會(huì)自動(dòng)封裝:建議只要寫 resultMap 就把全部的映射規(guī)則都寫上 -->
    <result column="age" property="age"/>
</resultMap>

<!-- 使用 resultMap,不使用 resultType -->
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
  select * from myuser where id = #{id}
</select>

MyBatis中resultType與resultMap的返回類型有哪些

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

MyBatis中resultType與resultMap的返回類型有哪些

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>

MyBatis中resultType與resultMap的返回類型有哪些

使用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 對象
        property="dept":指定哪個(gè)屬性是聯(lián)合的對象
        javaType:指定這個(gè)屬性對象的類型[不能省略] -->
    <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 二次查詢,即有兩條 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)對象的封裝規(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 對應(yīng)接口文件的全路徑 -->
<mapper namespace="com.dao.DeptMapper">
    <select id="selectDeptById" resultType="dept" parameterType="string">
      select * from dept where id = #{id}
    </select>
</mapper>

MyBatis中resultType與resultMap的返回類型有哪些

開啟懶加載:在沒有使用 Dept 的屬性時(shí),則只會(huì)加載 MyUser 的屬性。即只會(huì)發(fā)送一條 SQL 語句,要使用Dept 屬性時(shí)才會(huì)發(fā)送第二條 SQL。不會(huì)一次性發(fā)送兩條 SQL

<!-- 延遲加載的全局開關(guān)。當(dāng)開啟時(shí),所有關(guān)聯(lián)對象都會(huì)延遲加載。 特定關(guān)聯(lián)關(guān)系中可通過設(shè)置fetchType屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài)。默認(rèn)false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 當(dāng)開啟時(shí),任何方法的調(diào)用都會(huì)加載該對象的所有屬性。否則,每個(gè)屬性會(huì)按需加載。默認(rèn)false (true in ≤3.4.1) -->
<setting name="aggressiveLazyLoading" value="false"/>

3.關(guān)聯(lián)查詢的封裝,一對多,JavaBean 屬性包含 JavaBean 的集合

MyBatis中resultType與resultMap的返回類型有哪些

使用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)集合類型的屬性封裝規(guī)則
        ofType 指定集合里面元素的類型 -->
    <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>

MyBatis中resultType與resultMap的返回類型有哪些

關(guān)閉懶加載,使用二次查詢

public Dept getDeptByIdStep(Integer did);
<!-- Collection 分段查詢 -->
<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è)值過去:可以將多列的值封裝 Map 傳遞,指定多個(gè)列名通過 column="{prop1=col1,prop2=col2}"
        語法來傳遞給嵌套查詢語句。這會(huì)引起 prop1 和 prop2 以參數(shù)對象形式來設(shè)置給目標(biāo)嵌套查詢語句
        fetchType="lazy":是否延遲加載,優(yōu)先級高于全局配置,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>

MyBatis中resultType與resultMap的返回類型有哪些

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:列值對應(yīng)的java類型  -->
    <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>

MyBatis中resultType與resultMap的返回類型有哪些

MyBatis中resultType與resultMap的返回類型有哪些

上面測試中使用的實(shí)體類與數(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;

MyBatis中resultType與resultMap的返回類型有哪些

以上是“MyBatis中resultType與resultMap的返回類型有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI