【mybatis xml】資料層框架應用--Mybatis(三)關係對映之一對一關係對映
阿新 • • 發佈:2020-05-03
實際的開發中,對資料庫的操作常常會涉及到多張表,這在面向物件中就涉及到了物件與物件之間的關聯關係。
針對多表之間的操作,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