1. 程式人生 > >【mybatis xml】資料層框架應用--Mybatis(三)關係對映之一對一關係對映

【mybatis xml】資料層框架應用--Mybatis(三)關係對映之一對一關係對映

實際的開發中,對資料庫的操作常常會涉及到多張表,這在面向物件中就涉及到了物件與物件之間的關聯關係。 針對多表之間的操作,MyBatis提供了關聯對映,通過關聯對映就可以很好的處理物件與物件之間的關聯關係。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200503123059516.png) [TOC] ## 你需要了解的知識點 ### 1、關聯關係種類 #### 資料庫: 在關係型資料庫中,多表之間存在著三種關聯關係,分別為**一對一**、**一對多**和**多對多** ![](https://img-blog.csdnimg.cn/20200426182337443.png#pic_center) 1. 一對一:在任意一方引入對方主鍵作為外來鍵; 2. 一對多:在“多”的一方,新增“一”的一方的主鍵作為外來鍵; 3. 多對多:產生中間關係表,引入兩張表的主鍵作為外來鍵,兩個主鍵成為聯合主鍵或使用新的欄位作為主鍵。 #### java ![](https://img-blog.csdnimg.cn/20200426182822332.png#pic_center) 1. 一對一:在本類中定義對方型別的物件,如A類中定義B類型別的屬性b,B類中定義A類型別的屬性a;(雙向一對一) 2. 一對多:一個A類型別對應多個B類型別的情況,需要在A類中以集合的方式引入B類型別的物件,在B類中定義A類型別的屬性a; 3. 多對多:在A類中定義B類型別的集合,在B類中定義A類型別的集合。 ### 2、關聯查詢方式 MyBatis載入關聯關係物件主要通過兩種方式:**巢狀查詢**和**巢狀結果**。 ![](https://img-blog.csdnimg.cn/20200426183306517.png) ## 使用 ![](https://img-blog.csdnimg.cn/20200426190749540.png#pic_center) 專案目錄如圖,其中紅色標註的為本次所需要的,本次主要講解一對多關係對映,如果你對mybatis的xml版不熟悉的話請前往 [資料層框架應用--Mybatis(一) 基於XML對映檔案實現資料的CRUD](https://blog.csdn.net/qq_41929184/article/details/105640069) ### 1、建立實體類 建立實體類:在`com.lomtom.mybaris.entity`包中建立實體類`AdminDetail.java`和`AdminInfo.java` ```java 1、AdminDetail.java /** * @Author: LOMTOM * @Date: 2020/4/26 * @Time: 16:43 * @Email: [email protected] */ @Data public class AdminInfo { private int id; private String name; private String pwd; private AdminDetail ad; public AdminInfo() { } public AdminInfo(String name, String pwd) { this.name = name; this.pwd = pwd; } } 2、AdminInfo.java /** * @Author: LOMTOM * @Date: 2020/4/26 * @Time: 16:42 * @Email: [email protected] */ @Data public class AdminDetail { private int id; private String address; private String realName; public AdminDetail() { } public AdminDetail(String address, String realName) { this.address = address; this.realName = realName; } } ``` ### 2、建立SQL對映的XML檔案 在`com.lomtom.mybaris.mapper`包中建立SQL對映的XML檔案`adminDetailMapper.xml`及`adminInfoMapper.xml`, - 配置``元素向資料表中插入記錄。 - 配置` ``` 其中,插入`keyProperty="id" useGeneratedKeys="true"`實現自增,以上有兩種查詢方式分別為巢狀查詢與巢狀結果 ### 3、註冊SQL對映的XML檔案 在XML配置檔案`mybatis-config.xml`中註冊`adminDetailMapper.xml`和`adminInfoMapper.xml。` ```xml
``` ### 4、建立表格 建立兩個表admin_detail和admin_info,注意兩個表之間的依賴關係,可以先建立好兩個表,在關聯兩個表 ```sql 1、admin_detail SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for admin_detail -- ---------------------------- DROP TABLE IF EXISTS `admin_detail`; CREATE TABLE `admin_detail` ( `id` int(0) NOT NULL AUTO_INCREMENT, `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `realName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 2、admin_info SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for admin_info -- ---------------------------- DROP TABLE IF EXISTS `admin_info`; CREATE TABLE `admin_info` ( `id` int(0) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `pwd` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, CONSTRAINT `admin_info_ibfk_1` FOREIGN KEY (`id`) REFERENCES `admin_detail` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; ``` ### 5、測試一對一關聯對映 在測試類里加入以下,用於測試我們剛剛寫的插入與查詢 ```java @Test public void testAddAdminInfo() { SqlSession sqlSession= MybatisUtils.getSession(); //建立 AdminDetail物件 AdminDetail adminDetail = new AdminDetail("湖南長沙", "楊二蛋子"); //建立 AdminInfo物件 AdminInfo adminInfo = new AdminInfo("楊二蛋子", "123456"); //向資料表 admin_detail插入記錄 sqlSession.insert("addAdminDetail", adminDetail); //設定 AdminInfo物件關聯的 AdminDetail物件 adminInfo.setAd(adminDetail); //向資料表 admin_info插入記錄 sqlSession.insert("addAdminInfo", adminInfo); sqlSession.commit(); sqlSession.close(); } @Test public void testGetAdminInfoById(){ SqlSession sqlSession= MybatisUtils.getSession(); AdminInfo adminInfo = sqlSession.selectOne("getAdminInfo",4); System.out.println(adminInfo); sqlSession.commit(); sqlSession.close(); } @Test public void testGetAdminInfoById2(){ SqlSession sqlSession= MybatisUtils.getSession(); AdminInfo adminInfo = sqlSession.selectOne("getAdminInfo2",4); System.out.println(adminInfo); sqlSession.commit(); sqlSession.close(); } ``` ## 你可能會出現的問題 ### 問題一:提示缺少建構函式 **描述:** ```csharp Cause: org.apache.ibatis.executor.ExecutorException: No constructor found in com.lomtom.mybatis.entity.AdminInfo matching [java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String] ``` **分析**:我們明明使用了lombok,為啥還會提示缺少建構函式,那是因為我們這裡使用複雜的bean,lombok自己識別不出來 **解決:** 為`AdminDetail.java`和`AdminInfo.java`創造空的建構函式 ## 寫在最後 關注公眾號:**博奧思園** ,精彩內容不錯失 **你的支援是作者最大的動力** ![](https://img-blog.csdnimg.cn/20200405094243