# 第九章: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)