您好,登錄后才能下訂單哦!
本篇內(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有所成!
當(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 + '\'' + " ]"; } }
// 查詢所有用戶 @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ù)表的列名
@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)的屬性名
OK,看來(lái)都是符合我們的預(yù)期的。
在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 + " ]"; } }
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); }
// 測(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í),如果可以則查詢成功
OK,看圖我們是已經(jīng)成功查詢出每個(gè)學(xué)生對(duì)應(yīng)的班級(jí)的
在這里我們主要實(shí)現(xiàn)查詢所有班級(jí)的時(shí)候把對(duì)應(yīng)的學(xué)生列表也查詢出來(lái)。
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();
// 測(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é)生列表
OK,確實(shí)也是可以查詢出來(lái)了的。
注解開發(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í)用文章!
免責(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)容。