溫馨提示×

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

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

MyBatis怎么實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

發(fā)布時(shí)間:2023-04-12 15:29:06 來(lái)源:億速云 閱讀:144 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“MyBatis怎么實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    一、使用注解實(shí)現(xiàn)自定義映射關(guān)系

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

      前戲:為了體驗(yàn)這個(gè)效果,我們可以修改一下User實(shí)體類代碼,如下

    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();
     
        // 根據(jù)id查詢
        @ResultMap("userDiyMapper")
        @Select("select * from user where id = #{id}")
        User findById(int id);

    注意?。哼@里property對(duì)應(yīng)的是實(shí)體類屬性名,column對(duì)應(yīng)的就是數(shù)據(jù)庫(kù)表的列名 

    2. 編寫測(cè)試方法

        @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的用戶,并且留意對(duì)應(yīng)的屬性名 

    3. 查看運(yùn)行結(jié)果

    MyBatis怎么實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

     OK,看來(lái)都是符合我們的預(yù)期的。

     二、使用注解實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)查詢

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

    這里我們采用學(xué)生表和班級(jí)表做對(duì)比,所以我們先新建Student實(shí)體類和Classes實(shí)體類

     Classes實(shí)體類 

    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實(shí)體類

    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")
        // 自定義映射關(guān)系
        @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:調(diào)用從表方法時(shí)傳入的參數(shù)列
                 * one:表示該屬性是一個(gè)對(duì)象
                 * select:調(diào)用的是從表方法
                 * fetchType:加載方式
                 */
                @Result(property = "classes",column = "classId",
                    one = @One(select = "com.example.mapper.ClassesMapper.findByCid",
                            fetchType = FetchType.EAGER)
                    )
        })
        List<Student> findAll();
    }

    ClassesMapper添加根據(jù)id查詢班級(jí)

    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 {
        // 根據(jù)id查詢班級(jí)
        @Select("select * from classes where cid = #{cid}")
        Classes findByCid(Integer id);
    }

    2. 編寫測(cè)試方法

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

    看看能否查詢出學(xué)生對(duì)應(yīng)的班級(jí),如果可以則查詢成功 

     3. 查看運(yùn)行結(jié)果

    MyBatis怎么實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    OK,看圖我們是已經(jīng)成功查詢出每個(gè)學(xué)生對(duì)應(yīng)的班級(jí)的

    三、使用注解實(shí)現(xiàn)一對(duì)多關(guān)聯(lián)查詢

    在這里我們主要實(shí)現(xiàn)查詢所有班級(jí)的時(shí)候把對(duì)應(yīng)的學(xué)生列表也查詢出來(lái)。

    1. 編寫注解方法

    StudentMapper添加根據(jù)班級(jí)id查詢學(xué)生

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

    Classes添加查詢所有班級(jí)

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

    2. 編寫測(cè)試方法

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

    觀察能否查詢出班級(jí)對(duì)應(yīng)的學(xué)生列表

     3. 查看運(yùn)行結(jié)果

    MyBatis怎么實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    OK,確實(shí)也是可以查詢出來(lái)了的。 

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

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

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

    映射文件:

    • 代碼與Sql語(yǔ)句是解耦的,修改時(shí)只需修改配置文件,無(wú)需修改源碼。

    • Sql語(yǔ)句集中,利于快速了解和維護(hù)項(xiàng)目。

    • 級(jí)聯(lián)查詢支持連接查詢和分解查詢兩種方式,注解開發(fā)只支持分解查詢。

    注解:

    • 配置簡(jiǎn)單,開發(fā)效率高。

    • 類型安全,在編譯期即可進(jìn)行校驗(yàn),不用等到運(yùn)行時(shí)才發(fā)現(xiàn)錯(cuò)誤。

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

    “MyBatis怎么實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

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

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

    AI