MyBatis 多表操作的實現(xiàn)
1.1 一對一查詢
1.1.1 概述
關(guān)系數(shù)據(jù)庫中第一個表中的單個行只可以與第二個表中的一個行相關(guān),且第二個表中的一個行也只可以與第一個表中的一個行相關(guān)。
1.1.2 創(chuàng)建實體類
public class Student { private Integer id; private String name; private Boolean age; private String sex; private StudentStatus studentStatus; // set and get }
public class StudentStatus { private Integer id; private String num; private String major; // set and get }
1.1.3 創(chuàng)建 DAO 接口
public class StudentStatus { private Integer id; private String num; private String major; // set and get }
1.1.4 結(jié)果映射
resultMap 元素是 MyBatis 中最重要最強大的元素。它可以從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來,并在一些情形下允許進(jìn)行一些 JDBC 不支持的操作。實際上,在為一些比如連接的復(fù)雜語句編寫映射代碼的時候,一份 resultMap 能夠代替實現(xiàn)同等功能的長達(dá)數(shù)千行的代碼。resultMap 的設(shè)計思想是,對于簡單的語句根本不需要配置顯式的結(jié)果映射,而對于復(fù)雜一點的語句只需要描述它們的關(guān)系就行了。之前已經(jīng)使用過簡單映射語句了,但并沒有顯式指定 resultMap。只是簡單的使用 resultType 將所有的列映射到對象的屬性上,需要注意的是列名與屬性名一致才能映射,解決列名不匹配還是需要使用 resultMap。
<resultMap id="userResultMap" type="User"> <result property="id" column="user_id" /> <result property="username" column="user_name"/> <result property="password" column="hashed_password"/> </resultMap> <select id="selectUsers" resultMap="userResultMap"> select user_id, user_name, hashed_password from some_table where id = #{id} </select>
1.1.5 配置 mapper
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.software.mybatis.dao.StudentDao"> <resultMap id="resMap" type="student"> <result property="studentStatus.id" column="st_id"/> <result property="studentStatus.major" column="major"/> <result property="studentStatus.num" column="num"/> </resultMap> <select id="findAll" resultMap="resMap"> select * from student s, student_status st where s.st_id = st.st_id </select> </mapper>
上面這種配置會將自動將列名一致的映射到 type 指定的實體類中,該實體類中屬性類型為對象的則需要單獨拿出來映射。還可以使用 association 進(jìn)行復(fù)雜的映射,我們發(fā)現(xiàn)未配置的屬性無法進(jìn)行映射。產(chǎn)生這個問題的原因是 resultMap 的自動映射未打開,使用 autoMapping 設(shè)置這個屬性為 true/false,MyBatis 將會為本結(jié)果映射開啟/關(guān)閉自動映射。
<mapper namespace="com.software.mybatis.dao.StudentDao"> <resultMap id="resMap" type="com.software.mybatis.entity.Student"> <result property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <association property="studentStatus" javaType="com.software.mybatis.entity.StudentStatus"> <result property="id" column="st_id"/> <result property="major" column="major"/> <result property="num" column="num"/> </association> </resultMap> <select id="findAll" resultMap="resMap"> select * from student s, student_status st where s.st_id = st.st_id </select> </mapper>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.software.mybatis.dao.StudentDao"> <resultMap id="resMap" type="student" autoMapping="true"> <association property="studentStatus" resultMap="stMap" /> </resultMap> <resultMap id="stMap" type="StudentStatus" autoMapping="true"/> <select id="findAll" resultMap="resMap"> select * from student s, student_status st where s.st_id = st.st_id </select> </mapper>
1.1.6 核心配置
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <typeAliases> <package name="com.software.mybatis.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="student-mapper.xml"/> </mappers> </configuration>
1.1.7 測試
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/9/3 * @description 測試類 */ public class MybatisDemo { @Test public void TestA() throws IOException { // 加載核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); // 獲得 sqlSession 工廠對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 獲得 sqlSession 對象 SqlSession sqlSession = sqlSessionFactory.openSession(); List<Student> list = sqlSession.selectList("com.software.mybatis.dao.StudentDao.findAll"); System.out.println(list); } }
1.2 一對多查詢
1.2.1 概述
一對多關(guān)系是關(guān)系數(shù)據(jù)庫中兩個表之間的一種關(guān)系,該關(guān)系中第一個表中的單個行可以與第二個表中的一個或多個行相關(guān),但第二個表中的一個行只可以與第一個表中的一個行相關(guān)。
1.2.2 創(chuàng)建實體類
public class Student { private Integer sId; private String sName; private Long sAge; private String sSex; private Integer cId; // set and get }
public class Class { private Integer cId; private String cName; private String cAddr; private List<Student> students; // set and get }
1.1.3 創(chuàng)建 DAO 接口
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/9/3 * @description DAO 接口 */ public interface ClassDao { public List<Class> findAll(); }
1.1.4 配置 mapper
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.software.mybatis.dao.ClassDao"> <resultMap id="resMap" type="Class"> <result property="cId" column="c_id"/> <result property="cName" column="c_name"/> <result property="cAddr" column="c_addr"/> <collection property="students" ofType="Student"> <result property="sId" column="s_id" /> <result property="sName" column="s_name"/> <result property="sAge" column="s_age"/> <result property="sSex" column="s_sex"/> <result property="cId" column="c_id"/> </collection> </resultMap> <select id="findAll" resultMap="resMap"> select * from student s, class c where s.c_id = c.c_id </select> </mapper>
1.1.5 測試
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/9/3 * @description 測試類 */ public class MybatisDemo { @Test public void TestA() throws IOException { // 加載核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); // 獲得 sqlSession 工廠對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 獲得 sqlSession 對象 SqlSession sqlSession = sqlSessionFactory.openSession(); List<Class> list = sqlSession.selectList("com.software.mybatis.dao.ClassDao.findAll"); for (Class aClass : list) { System.out.println(aClass); } } }
1.3 多對多查詢
1.3.1 概述
多對多關(guān)系是關(guān)系數(shù)據(jù)庫中兩個表之間的一種關(guān)系, 該關(guān)系中第一個表中的一個行可以與第二個表中的一個或多個行相關(guān)。第二個表中的一個行也可以與第一個表中的一個或多個行相關(guān)。該關(guān)系一般會借助第三方表實現(xiàn)。
1.3.2 創(chuàng)建實體類
public class Course { private Integer cId; private String cName; private List<Student> students; // set and get }
public class Student { private Integer sId; private String sName; private Long sAge; private String sSex; private List<Course> courses; // set and get }
1.3.3 創(chuàng)建 DAO 接口
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/9/3 * @description course DAO 接口 */ public interface CourseDao { public List<Course> findAll(); }
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/9/3 * @description student DAO 接口 */ public interface StudentDao { public List<Student> findAll(); }
1.3.4 配置 mapper
☞ student-mapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.software.mybatis.dao.StudentDao"> <resultMap id="resMap" type="Student"> <result property="sId" column="s_id" /> <result property="sName" column="s_name"/> <result property="sAge" column="s_age"/> <result property="sSex" column="s_sex"/> <collection property="courses" ofType="Course"> <result property="cId" column="c_id"/> <result property="cName" column="c_name"/> </collection> </resultMap> <select id="findAll" resultMap="resMap"> select * from course c, student s, s_c sc where c.c_id = sc.c_id and s.s_id = sc.s_id </select> </mapper>
☞ course-mapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.software.mybatis.dao.CourseDao"> <resultMap id="resMap" type="Course"> <result property="cId" column="c_id"/> <result property="cName" column="c_name"/> <collection property="students" ofType="Student"> <result property="sId" column="s_id" /> <result property="sName" column="s_name"/> <result property="sAge" column="s_age"/> <result property="sSex" column="s_sex"/> </collection> </resultMap> <select id="findAll" resultMap="resMap"> select * from course c, student s, s_c sc where c.c_id = sc.c_id and s.s_id = sc.s_id </select> </mapper>
1.3.5 測試
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/9/3 * @description 測試類 */ public class MybatisDemo { @Test public void TestA() throws IOException { // 加載核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); // 獲得 sqlSession 工廠對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 獲得 sqlSession 對象 SqlSession sqlSession = sqlSessionFactory.openSession(); List<Course> courseList = sqlSession.selectList("com.software.mybatis.dao.CourseDao.findAll"); List<Student> studentList = sqlSession.selectList("com.software.mybatis.dao.StudentDao.findAll"); System.out.println("### 課程 ###"); for (Course course : courseList) { System.out.println(course); } System.out.println("### 學(xué)生 ###"); for (Student student : studentList) { System.out.println(student); } } }
到此這篇關(guān)于MyBatis 多表操作的實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis 多表操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合達(dá)夢數(shù)據(jù)庫的教程詳解
這篇文章主要給大家介紹了SpringBoot整合達(dá)夢數(shù)據(jù)庫的詳細(xì)教程,文章中有詳細(xì)的圖片介紹和代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下2023-08-08SpringBoot啟動執(zhí)行sql腳本的3種方法實例
在應(yīng)用程序啟動后,可以自動執(zhí)行建庫、建表等SQL腳本,下面這篇文章主要給大家介紹了關(guān)于SpringBoot啟動執(zhí)行sql腳本的3種方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法
二叉搜索樹是一種常用的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹,且每個節(jié)點的值都大于其左子樹中任何節(jié)點的值,而小于其右子樹中任何節(jié)點的值,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法,需要的朋友可以參考下2023-12-12