# 第九章:MyBatis 的关系映射
> 实体和实体之间: 1:1 1:多 多:多
# 基于 MyBatis 的客户管理系统的设计与设计
## 功能:
### 一、根据id查询客户的所有信息(id,name,age,sex,Car_id,code)
> 进行关联查询的方式有两种:
>
> 1.嵌套查询:需要写多个Mapper文件,也就需要写多条SQL语句,但是每一条SQL语句都很简单。
>
> 2.嵌套结果:只需要写一个Mapper文件,也就是只需要写一条SQL语句,但是这一条sQL语句比较复杂
#### 1.准备数据
创建数据库 tb_idcard 和 tb_person两个表
```mysql
create table tb_idcard(
id int primary key auto_increment,
code varchar(18)
);
```
```mysql
insert into tb_idcard(code) values
('154326874565214862'),
('13254868459587852');
```
```mysql
create table tb_person(
id int primary key auto_increment,
name varchar(32),
age int,
sex varchar(8),
card_id int unique,
foreign key(card_id) references tb_idcard(id)
);
```
```mysql
insert into tb_person(name,age,sex,card_id) values
('Rose',20,'女',1),
('Tom',20,'男',2);
```
![image-20220419102233809](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220419102233809.png)
#### 2.创建项目,导入依赖:mybatis mysql
```java
org.mybatis
mybatis
3.4.2
mysql
mysql-connector-java
8.0.28
```
#### 3.创建实体类
```java
//tb_idcard
private int id;
private String Code;
利用 getter , setter 和 toString 方法生成代码
```
```java
//tb_person
private int id;
private String name;
private int age;
private String sex;
//注意,此成员变量是另一个实体类的对象,反映的是实体脚erson.和实体类红dcard,的:1的关系
private IdCard card;
利用 getter , setter 和 toString 方法生成代码
```
#### 4.创建 IdCardMapper.xml PersonMapper.xml 文件
```java
```
```java
```
#### 5.创建 mybatis-config.xml 文件
```java
```
#### 6.复制工具类 MyBatisUtils
```java
//对外提供 sqlSession 对象
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
```
#### 7.测试类
```java
public class MyBatisTest {
SqlSession sqlSession = MyBatisUtils.getSession();
@Test
public void findPersonByIdTest(){
Person o = sqlSession.selectOne("PersonMapper.findPersonById",1);
System.out.println(o);
sqlSession.close();
}
}
```
运行截图:
![image-20220419112333746](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220419112333746.png)
### 二、使用嵌套结果:根据id查询客户的所有信息(id,name,age,sex,Car_id,code)
#### 1.mybatis-config.xml 中修改:注释掉以下语句
```java
```
#### 2.PersonMapper
```java
```
#### 3.测试
```java
public class MyBatisTest {
SqlSession sqlSession = MyBatisUtils.getSession();
@Test
public void findPersonByIdTest(){
Person o = sqlSession.selectOne("PersonMapper.findPersonById2",1);
System.out.println(o);
sqlSession.close();
}
}
```
![image-20220419120201332](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220419120201332.png)