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

MyBatis自定義映射關系和關聯查詢實現方法詳解

 更新時間:2023年04月12日 10:59:57   作者:會洗碗的CV工程師  
這篇文章主要介紹了MyBatis自定義映射關系和關聯查詢實現方法,當POJO屬性名與數據庫列名不一致時,需要自定義實體類和結果集的映射關系,在MyBatis注解開發(fā)中,使用@Results定義并使用自定義映射,使用 @ResultMap使用自定義映射

一、使用注解實現自定義映射關系

當POJO屬性名與數據庫列名不一致時,需要自定義實體類和結果集的映射關系,在MyBatis注解開發(fā)中,使用 @Results 定義并使用自定義映射,使用 @ResultMap 使用自定義映射,用法如下:

前戲:為了體驗這個效果,我們可以修改一下User實體類代碼,如下

package com.example.pojo;
import java.io.Serializable;
public class User implements Serializable {
    private int id;
    private String username1;
    private String sex1;
    private String address1;
    public User(String programmer, String man, String shangHai) {
        this.username1 = programmer;
        this.sex1 = man;
        this.address1 = shangHai;
    }
    public User(int i, String programmer_1, String woman, String shenzhen) {
        this.id = i;
        this.username1 = programmer_1;
        this.sex1 = woman;
        this.address1 = shenzhen;
    }
    public User() {
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername1() {
        return username1;
    }
    public void setUsername1(String username1) {
        this.username1 = username1;
    }
    public String getSex1() {
        return sex1;
    }
    public void setSex1(String sex1) {
        this.sex1 = sex1;
    }
    public String getAddress1() {
        return address1;
    }
    public void setAddress1(String address1) {
        this.address1 = address1;
    }
    @Override
    public String toString() {
        return "User[ " +
                "id=" + id +
                ", username1='" + username1 + '\'' +
                ", sex1='" + sex1 + '\'' +
                ", address1='" + address1 + '\'' +
                " ]";
    }
}

1. 編寫注解方法

    // 查詢所有用戶
    @Results(id="userDiyMapper",value = {
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "username1",column = "username"),
            @Result(property = "sex1",column = "sex"),
            @Result(property = "address1",column = "address")
    })
    @Select("select * from user")
    List<User> findAll1();
    // 根據id查詢
    @ResultMap("userDiyMapper")
    @Select("select * from user where id = #{id}")
    User findById(int id);

注意?。哼@里property對應的是實體類屬性名,column對應的就是數據庫表的列名

2. 編寫測試方法

    @Test
    public void testFindAll1(){
        List<User> all = userMapper.findAll1();
        all.forEach(System.out::println);
        System.out.println("---------------------");
        System.out.println(userMapper.findById(5));
    }

看看能否查詢出所有用戶和id為5的用戶,并且留意對應的屬性名

3. 查看運行結果

OK,看來都是符合我們的預期的。

二、使用注解實現一對一關聯查詢

在MyBatis的注解開發(fā)中對于多表查詢只支持分解查詢,不支持連接查詢。

這里我們采用學生表和班級表做對比,所以我們先新建Student實體類和Classes實體類

Classes實體類

package com.example.pojo;
import java.util.List;
public class Classes {
    private int cid;
    private String className;
    private List<Student> studentList;
    public int getCid() {
        return cid;
    }
    public void setCid(int cid) {
        this.cid = cid;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    public List<Student> getStudentList() {
        return studentList;
    }
    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
    @Override
    public String toString() {
        return "Classes[ " +
                "cid=" + cid +
                ", className='" + className + '\'' +
                ", studentList=" + studentList + 
                " ]";
    }
}

Student實體類

package com.example.pojo;
public class Student {
    private int sid;
    private String name;
    private int age;
    private String sex;
    private Classes classes;
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Classes getClasses() {
        return classes;
    }
    public void setClasses(Classes classes) {
        this.classes = classes;
    }
    @Override
    public String toString() {
        return "Student[ " +
                "sid=" + sid +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", classes=" + classes +
                " ]";
    }
}

1. 編寫注解方法

StudentMapper添加查詢所有用戶

package com.example.mapper;
import com.example.pojo.Student;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import java.util.List;
public interface StudentMapper {
    @Select("select * from student")
    // 自定義映射關系
    @Results(id = "studentMapper",value = {
            @Result(id = true,property = "sid",column = "sid"),
            @Result(property = "name",column = "name"),
            @Result(property = "age",column = "age"),
            @Result(property = "sex",column = "sex"),
            /**
             * property:屬性名
             * column:調用從表方法時傳入的參數列
             * one:表示該屬性是一個對象
             * select:調用的是從表方法
             * fetchType:加載方式
             */
            @Result(property = "classes",column = "classId",
                one = @One(select = "com.example.mapper.ClassesMapper.findByCid",
                        fetchType = FetchType.EAGER)
                )
    })
    List<Student> findAll();
}

ClassesMapper添加根據id查詢班級

package com.example.mapper;
import com.example.pojo.Classes;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import java.util.List;
public interface ClassesMapper {
    // 根據id查詢班級
    @Select("select * from classes where cid = #{cid}")
    Classes findByCid(Integer id);
}

2. 編寫測試方法

// 測試一對一查詢
    @Test
    public void testFindAllStudent(){
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        List<Student> all = studentMapper.findAll();
        all.forEach(System.out::println);
    }

看看能否查詢出學生對應的班級,如果可以則查詢成功

3. 查看運行結果

OK,看圖我們是已經成功查詢出每個學生對應的班級的

三、使用注解實現一對多關聯查詢

在這里我們主要實現查詢所有班級的時候把對應的學生列表也查詢出來。

1. 編寫注解方法

StudentMapper添加根據班級id查詢學生

// 根據班級Id查詢學生
    @Select("select * from student where ClassId = #{classId}")
    List<Student> findByClassId(int classId);

Classes添加查詢所有班級

// 查詢所有班級
    @Select("select * from classes")
    @Results(id = "classMapper",value = {
            @Result(id = true,property = "cid",column = "cid"),
            @Result(property = "className",column = "className"),
            // many:表示該屬性是一個集合
            @Result(property = "studentList",column = "cid",
            many = @Many(select = "com.example.mapper.StudentMapper.findByClassId",
                        fetchType = FetchType.LAZY))
    })
    List<Classes> findAll();

2. 編寫測試方法

// 測試一對多查詢
    @Test
    public void findAllClasses(){
        ClassesMapper classesMapper = session.getMapper(ClassesMapper.class);
        List<Classes> all = classesMapper.findAll();
        all.forEach(System.out::println);
    }

觀察能否查詢出班級對應的學生列表

3. 查看運行結果

OK,確實也是可以查詢出來了的。

四、注解文件和映射文件開發(fā)對比

注解開發(fā)更快,映射文件更方便。

MyBatis中更推薦使用映射文件開發(fā),Spring、SpringBoot更推薦注解方式。具體使用要視項目情況而定。它們的優(yōu)點對比如下:

映射文件:

  • 代碼與Sql語句是解耦的,修改時只需修改配置文件,無需修改源碼。
  • Sql語句集中,利于快速了解和維護項目。
  • 級聯查詢支持連接查詢和分解查詢兩種方式,注解開發(fā)只支持分解查詢。

注解:

  • 配置簡單,開發(fā)效率高。
  • 類型安全,在編譯期即可進行校驗,不用等到運行時才發(fā)現錯誤。

我個人也是比較喜歡映射文件開發(fā),主要更喜歡方便維護和了解。

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

相關文章

  • @Scheduled fixedDelayString 加載properties配置方式

    @Scheduled fixedDelayString 加載properties配置方式

    這篇文章主要介紹了@Scheduled fixedDelayString 加載properties配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java foreach循環(huán)為什么不能賦值的講解

    java foreach循環(huán)為什么不能賦值的講解

    這篇文章主要介紹了java foreach循環(huán)為什么不能賦值的講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java8 HashMap遍歷方式性能探討

    Java8 HashMap遍歷方式性能探討

    JDK8之前,可以使用keySet或者entrySet來遍歷HashMap,JDK8中引入了map.foreach來進行遍歷
    2021-09-09
  • Mybatis使用連表查詢的操作代碼

    Mybatis使用連表查詢的操作代碼

    這篇文章主要介紹了Mybatis如何使用連表查詢,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • java中json-diff簡單使用及對象是否一致詳解

    java中json-diff簡單使用及對象是否一致詳解

    這篇文章主要為大家介紹了java中json-diff簡單使用及對象是否一致對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • java設計模式—靜態(tài)代理模式(聚合與繼承方式對比)

    java設計模式—靜態(tài)代理模式(聚合與繼承方式對比)

    下面小編就為大家?guī)硪黄猨ava設計模式—靜態(tài)代理模式(聚合與繼承方式對比)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Spring事務Transaction配置的五種注入方式詳解

    Spring事務Transaction配置的五種注入方式詳解

    這篇文章主要介紹了Spring事務Transaction配置的五種注入方式詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java中的ConcurrentHashMap原理詳解

    Java中的ConcurrentHashMap原理詳解

    這篇文章主要介紹了Java中的ConcurrentHashMap原理詳解,ConcurrentHashMap和HashMap一樣,是一個存放鍵值對的容器,使用hash算法來獲取值的地址,因此時間復雜度是O(1),查詢非常快,需要的朋友可以參考下
    2023-12-12
  • Java21虛擬線程實踐

    Java21虛擬線程實踐

    java21正式版發(fā)布了,為我們帶來了很多新的特性,其中我最感興趣的就是虛擬線程,本文主要介紹了Java21虛擬線程實踐,感興趣的可以;了解一下
    2023-10-10
  • java如何獲取系統CPU、內存占用

    java如何獲取系統CPU、內存占用

    這篇文章主要介紹了java如何獲取系統CPU、內存占用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10

最新評論

天峨县| 毕节市| 西安市| 大丰市| 鹤峰县| 福海县| 图木舒克市| 铁力市| 恩平市| 沧源| 胶南市| 华坪县| 关岭| 瑞昌市| 高邑县| 黄陵县| 共和县| 邻水| 赣州市| 济宁市| 雅安市| 莱州市| 嘉兴市| 冀州市| 衡水市| 台北县| 祁连县| 新建县| 南通市| 庆阳市| 枣阳市| 湖北省| 清涧县| 新泰市| 天峻县| 湖南省| 玉田县| 资中县| 东平县| 武功县| 秭归县|