Mybatis?Lombok使用方法與復(fù)雜查詢介紹
基本要點(diǎn)
1、Lombok
作用:在我們的實(shí)體類中,我們?cè)僖膊恍枰暶鱣et、set、有參無(wú)參等方法,統(tǒng)統(tǒng)可以通過(guò)Lombok注解來(lái)實(shí)現(xiàn)同樣的功能
使用步驟:
- 安裝插件:setting—>plugin中搜索Lombok進(jìn)行安裝
- 引入依賴:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> <scope>provided</scope> </dependency>
使用注解,下面介紹一點(diǎn)常用的
@Data:get/set 無(wú)參構(gòu)造 tostring hascode equals
@AllArgsConstructor:有參構(gòu)造,使用之后,無(wú)參構(gòu)造需要顯示定義
@NoArgsConstructor:無(wú)參構(gòu)造
局限性:
- 只支持所有參數(shù)類型的有參構(gòu)造
- 降低了源碼的可讀性和完整性
2、多對(duì)一處理
假設(shè)我和我的朋友們都喜歡高代課,我們四個(gè)的老師叫趙哥
對(duì)于趙哥來(lái)說(shuō),他是一個(gè)教我們四個(gè),一對(duì)多稱為集合
對(duì)于我們來(lái)說(shuō),我們四個(gè)都是趙哥小弟,多對(duì)一稱為關(guān)聯(lián)
1)需求
現(xiàn)在,我們的家長(zhǎng)想知道,為什么我們四個(gè)人的高代成績(jī)?yōu)槭裁从械娜诉^(guò)了有的人沒(méi)過(guò)
到底是不是一個(gè)老師教的,所以需要從我們?nèi)胧?,查出我們各自的高代老?/p>
2)實(shí)現(xiàn)
首先我們先在數(shù)據(jù)庫(kù)中創(chuàng)建學(xué)生表和教師表,插入一下我們和趙哥的信息
create table t_decade_teacher ( `id` INT(10) NOT NUll, `name` VARCHAR(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB CHARACTER SET = utf8; insert into t_decade_teacher(`id`,`name`)values(1,'趙哥'); create table t_decade_student ( `id` INT(10) NOT NULL, `name` VARCHAR(50) DEFAULT null, `tid` INT(10) DEFAULT null, PRIMARY KEY (`id`), FOREIGN key (`tid`) REFERENCES `t_decade_teacher` (`id`) ) ENGINE=INNODB CHARACTER SET = utf8; insert into t_decade_student(`id`,`name`,`tid`)VALUES(1,'十年',1); insert into t_decade_student(`id`,`name`,`tid`)VALUES(2,'石少爺',1); insert into t_decade_student(`id`,`name`,`tid`)VALUES(3,'天宇',1); insert into t_decade_student(`id`,`name`,`tid`)VALUES(4,'明哥',1);
然后我們新建對(duì)應(yīng)的實(shí)體類
package com.decade.pojo; import lombok.Data; @Data public class Teacher { private int id; private String name; }
package com.decade.pojo; import lombok.Data; @Data public class Student { private int id; private String name; private Teacher teacher; }
新建我們學(xué)生的接口類
// 學(xué)生接口類 package com.decade.mapper; public interface StudentMapper { List<Student> getStudentInfo(); List<Student> getStudentInfo2(); }
然后是對(duì)應(yīng)的SQL映射文件(我放在了resource文件夾下,注意映射文件所在的包路徑需要和Java文件夾下的接口類的路徑保持一致,因?yàn)槲矣昧?種映射器的注冊(cè)方式)
StudentMapper.xml
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.decade.mapper.StudentMapper"> <resultMap id="studentInfoMap" type="student"> <result column="id" property="id"/> <result column="name" property="name"/> <!-- 對(duì)于實(shí)體類中復(fù)雜的屬性,我們需要進(jìn)行單獨(dú)處理 字段對(duì)應(yīng)實(shí)體類中的屬性是對(duì)象時(shí),使用association,javaType是指定屬性的類型,這里就是Teacher類 --> <association column="tid" property="teacher" javaType="teacher" select="selectTeacherInfo"/> </resultMap> <!-- 我們查詢多對(duì)一的方式時(shí),有2種思路 第一種:按查詢嵌套處理,類似子查詢 --> <select id="getStudentInfo" resultMap="studentInfoMap"> select * from t_decade_student </select> <!-- 子查詢語(yǔ)句,需要使用外鍵作為查詢條件 比如這里學(xué)生和老師就是用tid關(guān)聯(lián)起來(lái)的 --> <select id="selectTeacherInfo" resultType="teacher"> select * from t_decade_teacher where id = #{id} </select> <resultMap id="studentInfoMap2" type="student"> <result column="sid" property="id"/> <result column="sname" property="name"/> <!-- 這里我們直接把Teacher類和查詢語(yǔ)句中輸出的字段關(guān)聯(lián)起來(lái) --> <association property="teacher" javaType="teacher"> <result column="tid" property="id"/> <result column="tname" property="name"/> </association> </resultMap> <!-- 第二種:按結(jié)果嵌套處理,類似聯(lián)表查詢 --> <select id="getStudentInfo2" resultMap="studentInfoMap2"> select s.id as sid, s.name as sname,t.id as tid, t.name as tname from t_decade_student s left join t_decade_teacher t on s.tid = t.id </select> </mapper>
并在核心配置文件中進(jìn)行注冊(cè)
我這里使用映射器接口和相對(duì)于類路徑的資源引用兩種方式進(jìn)行注冊(cè)
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"> <property name="username" value="decade"/> <property name="password" value="11111"/> </properties> <settings> <!-- 標(biāo)準(zhǔn)的日志工廠 --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <typeAliases> <package name="com.decade.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--驅(qū)動(dòng)配置,com.mysql.jdbc.driver --> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--每一個(gè)mapper.xml文件都需要在核心配置文件中注冊(cè)--> <mappers> <mapper resource="com/decade/mapper/TeacherMapper.xml"/> <mapper class="com.decade.mapper.StudentMapper"/> <!-- <package name="com.decade.mapper"/>--> </mappers> </configuration>
最后我們寫(xiě)一個(gè)測(cè)試類進(jìn)行測(cè)試
import com.decade.mapper.StudentMapper; import com.decade.pojo.Student; import com.decade.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class MyTest { @Test public void test2() { SqlSession sqlSession = MybatisUtils.getSqlSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> student = mapper.getStudentInfo(); student.forEach(System.out::println); System.out.println("========================="); List<Student> studentInfo = mapper.getStudentInfo2(); studentInfo.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } }
運(yùn)行結(jié)果如下,我靠,居然都是趙哥教的,看來(lái)他針對(duì)我!
3、一對(duì)多
現(xiàn)在,我們換一個(gè)角度,我們想從趙哥下手,查出他所有學(xué)生的信息
我們?cè)谏厦胬拥幕A(chǔ)上調(diào)整一下學(xué)生和老師的實(shí)體類
package com.decade.pojo; import lombok.Data; @Data public class Student2 { private int id; private String name; private int tid; }
package com.decade.pojo; import lombok.Data; import java.util.List; @Data public class Teacher2 { private int id; private String name; // 一個(gè)老師有多名學(xué)生 private List<Student2> studentList; }
新建趙哥他們老師的接口類和對(duì)應(yīng)的SQL映射文件
// 教師接口類 package com.decade.mapper; import com.decade.pojo.Teacher2; import org.apache.ibatis.annotations.Param; public interface TeacherMapper { Teacher2 selectTeacherInfo(@Param("id") int id); Teacher2 selectTeacherInfo2(@Param("id") int id); }
TeacherMapper.xml
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.decade.mapper.TeacherMapper"> <resultMap id="teacherInfoMap" type="com.decade.pojo.Teacher2"> <result column="id" property="id"/> <result column="name" property="name"/> <!-- 因?yàn)槲覀冞@里需要用到teacher的id作為嵌套查詢的條件,所以我們這里的column字段使用id --> <collection property="studentList" javaType="ArrayList" ofType="student2" select="selectStudentByTeacher" column="id"/> </resultMap> <!-- 第一種:按查詢嵌套處理,類似子查詢 --> <select id="selectTeacherInfo" resultMap="teacherInfoMap"> select * from t_decade_teacher where id = #{id} </select> <select id="selectStudentByTeacher" resultType="student2"> select * from t_decade_student where tid = #{id} </select> <resultMap id="teacherInfoMap2" type="teacher2"> <result column="tid" property="id"/> <result column="tname" property="name"/> <collection property="studentList" ofType="student2"> <result column="sid" property="id"/> <result column="sname" property="name"/> <result column="stid" property="tid"/> </collection> </resultMap> <!-- 第二種:按結(jié)果嵌套處理,類似關(guān)聯(lián)查詢 --> <select id="selectTeacherInfo2" resultMap="teacherInfoMap2"> select t.id as tid, t.name as tname, s.id as sid, s.name as sname, s.tid as stid from t_decade_teacher t left join t_decade_student s on t.id = s.tid where t.id = #{id} </select> </mapper>
最后我們寫(xiě)一個(gè)測(cè)試方法進(jìn)行測(cè)試
import com.decade.mapper.TeacherMapper; import com.decade.pojo.Teacher2; import com.decade.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class MyTest { @Test public void test() { SqlSession sqlSession = MybatisUtils.getSqlSession(); try { TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); Teacher2 teacherInfo = mapper.selectTeacherInfo(1); System.out.println(teacherInfo); System.out.println("================================="); Teacher2 teacherInfo2 = mapper.selectTeacherInfo2(1); System.out.println(teacherInfo2); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } }
運(yùn)行結(jié)果如下
結(jié)果集映射resultMap中涉及到一對(duì)多就用集合collection,涉及到多對(duì)一就用關(guān)聯(lián)association
javaType:用來(lái)指定實(shí)體類中屬性的類型
ofType:如果屬性是集合,那么用這個(gè)來(lái)指定泛型的約束類型
到此這篇關(guān)于Mybatis Lombok使用方法與復(fù)雜查詢介紹的文章就介紹到這了,更多相關(guān)Mybatis Lombok內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一篇文章帶你Java Spring開(kāi)發(fā)入門(mén)
這篇文章主要為大家詳細(xì)介紹了Java Spring開(kāi)發(fā)入門(mén)學(xué)習(xí)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-09-09java.lang.IncompatibleClassChangeError異常的問(wèn)題解決
本文主要介紹了java.lang.IncompatibleClassChangeError異常的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06淺談在springboot中使用定時(shí)任務(wù)的方式
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著在springboot中使用定時(shí)任務(wù)的方式展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06mybatis動(dòng)態(tài)SQL?if的test寫(xiě)法及規(guī)則詳解
這篇文章主要介紹了mybatis動(dòng)態(tài)SQL?if的test寫(xiě)法及規(guī)則詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01java實(shí)現(xiàn)任意矩陣Strassen算法
這篇文章主要介紹了java實(shí)現(xiàn)任意矩陣Strassen算法的相關(guān)資料,需要的朋友可以參考下2016-02-02關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理)
這篇文章主要介紹了關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-03-03Java使用策略模式實(shí)現(xiàn)聚石塔接口調(diào)用的問(wèn)題
這篇文章主要介紹了Java使用策略模式實(shí)現(xiàn)聚石塔接口調(diào)用,為了避免多重判斷,而且有更好的擴(kuò)展性,首選了策略模式來(lái)實(shí)現(xiàn),具體解決方法跟隨小編一起看看吧2021-12-12