最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java自定義映射resultMap定義及用法

 更新時間:2022年11月09日 09:37:48   作者:學習使我快樂T  
MyBatis的每一個查詢映射的返回類型都是ResultMap,當我們提供返回類型屬性是resultType時,MyBatis會自動給我們把對應值賦給resultType所指定對象的屬性,當我們提供返回類型是resultMap時,將數(shù)據(jù)庫中列數(shù)據(jù)復制到對象的相應屬性上,可以用于復制查詢,兩者不能同時用

搭建Mybatis框架

①引入相關的依賴

②一些配置文件給復制到我們的resources文件夾下

例如:jdbc.properties;log4j.xml

③創(chuàng)建mybatis-config核心配置文件

④創(chuàng)建utils包和pojo包和mapper包以及映射文件所對應的包

⑤創(chuàng)建數(shù)據(jù)庫的表

t_emp

t_dept

⑥在pojo創(chuàng)建數(shù)據(jù)庫對應的實體類

也就是創(chuàng)建屬性,getset方法和構造器,還有重寫toString方法

⑦mapper包下創(chuàng)建接口,看對表有什么操作需求

⑧在配置文件中創(chuàng)建mybatis-mapper,對應mapper接口

一、resultMap處理字段和屬性的映射關系

①mapper接口:

    /**
     * 根據(jù)id查詢員工信息
     * @param empId
     * @return
     */
    Emp getEmpByeEmpId(@Param("empId") Integer empId);

②mapper映射文件:

    <!--    Emp getEmpByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpByEmpId" resultMap="empResultMap">
        select * from t_emp where emp_id = #{empId}
    </select>

③ 測試類

    @Test
    public void testGetEmpByEmpId() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpByEmpId(1);
        System.out.println(emp);
    }

結果:

由于字段名和屬性名不一致,而且沒有創(chuàng)建映射關系,java中是駝峰的命名方式,而我們mysql中是下劃線的命名方式,所以這時,我們就需要一些操作來將它們進行對應

Emp{empId=null,empName='null',age=20,gender='男'}

字段名和屬性名不一致的情況,如何處理映射關系

1.為查詢的字段設置別名,和屬性名保持一致

2.當字段符合MySQL的要求使用_,而屬性符合java的要求使用駝峰

此時可以在Mybatis的核心配置文件中設置一個全局配置,可以自動將下劃線映射為駝峰

emp_id--》empId ,emp_name--》empName

3.使用resultMap自定義映射處理

方式一:起別名

select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}

方式二: 使用標簽進行配置

    <settings>
        <!--將下劃線映射為駝峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <select id="getEmpByEmpId" resultType="Emp">
        select * from t_emp where emp_id = #{empId}
    </select>

方式三:設置自定義映射

resultMap:設置自定義映射

    resultMap:設置自定義映射
    屬性:
    id:表示自定義映射的唯一標識
    type:查詢的數(shù)據(jù)要映射的實體類的類型
    子標簽:
    id:設置主鍵的映射關系
    result:設置普通字段的映射關系
    association:設置多對一的映射關系(處理集合類型的屬性)
    collection:設置一對多的映射關系(處理集合類型的屬性)
    屬性:
    property:設置映射關系中實體類中的屬性名,必須是處理的實體類類型中的屬性名
    column:設置映射關系中表中的字段名,必須是sql查詢出的某個字段

    <resultMap id="empResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
    </resultMap>
    <!--    Emp getEmpByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpByEmpId" resultMap="empResultMap">
        select * from t_emp where emp_id = #{empId}
    </select>

二、多對一映射處理

處理多對一的映射關系:

1.級聯(lián)方式處理

2.association :處理多對一的映射關系(處理實體類類型的屬性)

property:設置需要處理映射關系的屬性和屬性名

javaType:設置要處理的屬性的類型

3.分布查詢

    /**
     * 獲取員工以及對應的部門信息
     * @param empId
     * @return
     */
    Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);

方式一:級聯(lián)方式處理

    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <result column="dept_id" property="dept.deptId"></result>
        <result column="dept_name" property="dept.deptName"></result>
    </resultMap>
<!--    Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select
        t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

方式二:使用association處理映射關系

    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <association property="dept" javaType="Dept">
            <id column="dept_id" property="deptId"></id>
            <result column="dept_name" property="deptName"></result>
        </association>
    </resultMap>
<!--    Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select
        t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

測試類:

    @Test
    public void testGetEmpAndDeptByEmpId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptByEmpId(2);
        System.out.println(emp);
        sqlSession.close();
    }

方式三:分布查詢

EmpMapper接口中添加方法

    /**
     * 通過分布查詢查詢員工以及所對應的部門信息的第一步
     * @param empId
     * @return
     */
    Emp getEmpAndDeptByStep(@Param("empId") Integer empId);

EmpMapper映射配置文件中添加操作

property:設置需要處理映射關系的屬性和屬性名

select:設置分布查詢的sql的唯一標識

column:將查詢出的某個字段作為分布查詢的sql的條件

fetchType:在開啟了延遲加載的環(huán)境中,通過該屬性設置當前的分布查詢是否使用延遲加載

fetchType="eager(立即加載)\lazy(延遲加載)"

    <resultMap id="empAndDeptByStepResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <association property="dept"
                     select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="dept_id">
        </association>
    </resultMap>
<!--    Emp getEmpAndDeptByStep(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
        select * from t_emp where emp_id = #{empId}
    </select>

因為需要兩個sql來查,所以我們把DeptMapper接口和對應的映射文件創(chuàng)建出來

DeptMapper接口

    /**
     * 通過分布查詢查詢員工以及所對應的部門信息的第二步
     * @param deptId
     * @return
     */
    Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);

DeptMapper映射文件

<!--    Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);-->
    <select id="getEmpAndDeptByStepTwo" resultType="Dept">
        select * from t_dept where dept_id = #{deptId}
    </select>

分步查詢的優(yōu)點:可以實現(xiàn)延遲加載

但是必須在核心配置文件中設置全局配置信息:

lazyLoadingEnabled:延遲加載的全局開關。當開啟時,所有關聯(lián)對象都會延遲加載

aggressiveLazyLoading:當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載

此時就可以實現(xiàn)按需加載,獲取的數(shù)據(jù)是什么,就只會執(zhí)行相應的sql。此時可通過association和collection中的fetchType屬性設置當前的分步查詢是否使用延遲加載, fetchType="lazy(延遲加 載)|eager(立即加載)"

引入,延遲加載:

<!--開啟延遲加載-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--按需加載-->
<setting name="aggressiveLazyLoading" value="false"/>

因為在配置文件配置是全局加載,所以是針對于所有的分布查詢,如果我們要想讓某一個分布查詢來實現(xiàn)一個完整的加載,這個時候就需要去association標簽,也就是實現(xiàn)分布查詢的地方,添加一個屬性fatchType。

三、一對多映射處理

處理一對多的映射關系:

1.collection

2.分布查詢

方式一:collection

例如一個部門對應多個員工

private List<Emp> emps;

①DeptMapper接口

    /**
     * 查詢部門以及部門中的員工信息
     * @param deptId
     * @return
     */
    Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);

②DeptMapper映射配置文件

collection:用于處理一對多映射關系

ofType:設置集合類型的屬性中存儲的數(shù)據(jù)的類型

    <resultMap id="deptAndEmpResultMap" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <collection property="emps" ofType="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
        </collection>
    </resultMap>
<!--    Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByDeptId" resultMap="deptAndEmpResultMap">
        select *
        from t_dept
        left join t_emp
        on t_dept.dept_id = t_emp.dept_id
        where t_dept.dept_id = #{deptId}
    </select>

③測試類:

    @Test
    public void testGetDeptAndEmpByDeptId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpByDeptId(1);
        System.out.println(dept);
        sqlSession.close();
    }

方式二:分布查詢

DeptMapper接口

    /**
     * 通過分布查詢查詢部門以及部門中的員工信息的第一步
     * @param deptId
     * @return
     */
    Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);

DeptMapper映射文件

    <resultMap id="deptAndEmpResultMapByStep" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <collection property="emps"
                    select=""
                    column="">
        </collection>
    </resultMap>
<!--    Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
        select * from t_dept where dept_id = #{deptId}
    </select>

EmpMapper接口

/**
 * 通過分布查詢查詢部門以及部門中的員工信息的第二步
 * @param deptId
 * @return
 */
List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);

EmpMapper映射文件

<!--    List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByStepTwo" resultType="Emp">
        select * from t_emp where dept_id = #{deptId}
    </select>

然后把EmpMapper寫的引入到DeptMapper中

    <resultMap id="empAndDeptByStepResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <association property="dept" fetchType="eager"
                     select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="dept_id">
        </association>
    </resultMap>

測試類:

    @Test
    public void testGetDeptAndEmpByStep(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpByStepOne(1);
//        System.out.println(dept);
        System.out.println(dept.getDeptName());
        sqlSession.close();
    }

到此這篇關于Java自定義映射resultMap使用方法詳解的文章就介紹到這了,更多相關Java resultMap內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot遠程debug調試全過程

    springboot遠程debug調試全過程

    這篇文章主要介紹了springboot遠程debug調試全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Mybatis Plus 大數(shù)據(jù)游標分頁的實現(xiàn)

    Mybatis Plus 大數(shù)據(jù)游標分頁的實現(xiàn)

    使用MyBatis Plus的游標分頁,我們可以輕松應對大數(shù)據(jù)量的場景,本文主要介紹了Mybatis Plus 大數(shù)據(jù)游標分頁的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • SSM框架整合之junit測試的方法

    SSM框架整合之junit測試的方法

    本篇文章主要介紹了SSM框架整合之junit測試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 什么是遞歸?用Java寫一個簡單的遞歸程序

    什么是遞歸?用Java寫一個簡單的遞歸程序

    這篇文章主要介紹了什么是遞歸?用Java寫一個簡單的遞歸程序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 詳解Java的Hibernat框架中的Map映射與SortedMap映射

    詳解Java的Hibernat框架中的Map映射與SortedMap映射

    這篇文章主要介紹了Java的Hibernat框架中的Map映射與SortedMap映射,Hibernat是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • 利用java實現(xiàn)二叉搜索樹

    利用java實現(xiàn)二叉搜索樹

    這篇文章主要介紹了利用java實現(xiàn)二叉搜索樹,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java實現(xiàn)的漢字轉五筆功能實例

    java實現(xiàn)的漢字轉五筆功能實例

    這篇文章主要介紹了java實現(xiàn)的漢字轉五筆功能,結合具體實例形式分析了java基于字符串遍歷與編碼轉換等操作實現(xiàn)五筆編碼獲取的相關操作技巧,需要的朋友可以參考下
    2017-06-06
  • springboot以FTP方式上傳文件到遠程服務器

    springboot以FTP方式上傳文件到遠程服務器

    這篇文章主要介紹了springboot以FTP方式上傳文件到遠程服務器,需要的朋友可以參考下
    2019-12-12
  • JAVA Spring中讓人頭痛的JAVA大事務問題要如何解決你知道嗎

    JAVA Spring中讓人頭痛的JAVA大事務問題要如何解決你知道嗎

    這篇文章主要介紹了Java Spring事務使用及驗證過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-09-09
  • SpringBoot中Token登錄授權、續(xù)期和主動終止的方案流程分析

    SpringBoot中Token登錄授權、續(xù)期和主動終止的方案流程分析

    SpringBoot項目中,基于Token的登錄授權方案主要有兩種:利用Session/Cookie和JWT,Cookie/Session方案有狀態(tài),不適合分布式架構,而JWT雖無狀態(tài),但存在過期時間不可強制失效、一次性等缺點,本文介紹SpringBoot中Token登錄授權、續(xù)期和主動終止的方案,感興趣的朋友一起看看吧
    2024-09-09

最新評論

缙云县| 临邑县| 尖扎县| 屏边| 岚皋县| 宁化县| 绥芬河市| 图木舒克市| 洞口县| 和静县| 邯郸县| 安吉县| 邓州市| 合作市| 东丰县| 福安市| 民权县| 伊吾县| 泾川县| 垫江县| 永靖县| 沂水县| 太仆寺旗| 江西省| 吉木萨尔县| 盐亭县| 十堰市| 英山县| 渝北区| 上杭县| 萨迦县| 修文县| 延安市| 横峰县| 积石山| 建水县| 嘉定区| 乌苏市| 微山县| 禄丰县| 高清|