# 第十章:Spring 和 MyBatis 的整合
基于SSM的用户管理系统的设计与实现
## 基于传统的DAO方式的整合
#### 0.导包
mybatis mybatis-spring spring mysql spring-tx spring-jdbc commons-dbcp2
```java
org.mybatis
mybatis
3.4.2
org.mybatis
mybatis-spring
1.3.1
org.springframework
spring-context
4.3.6.RELEASE
org.apache.commons
commons-dbcp2
2.1.1
mysql
mysql-connector-java
8.0.28
junit
junit
4.12
compile
org.springframework
spring-jdbc
4.3.6.RELEASE
org.springframework
spring-tx
4.3.6.RELEASE
```
#### 1.准备数据
mybatis 中的 t_customer
![image-20220426132557267](https://lsky.hhdxw.top/imghub/img/image-20220426132557267.png)
#### 2.创建实体类
```java
//在com.gzh.domain下创建
private int id;
private String username;
private String jobs;
private String phone;
//利用 getter , setter 和 toString 方法生成代码
```
#### 3.在resources下创建CustomerMapper.xml文件
```java
```
#### 4.在resources下创建mybatis-config.xml文件
```java
```
#### 5.创建DAO层接口和实现类
```java
//在com.gzh.dao包下创建接口
public interface CustomerDao {
Customer findCustomerById(int id);
}
```
```java
//在com.gzh.dao.impl包下创建实现类
public class CustomerDaoImpl extends SqlSessionDaoSupport implements CustomerDao {
@Override
public Customer findCustomerById(int id){
Customer o = getSqlSession().selectOne("CustomerMapper.findCustomerById", id);
return o;
}
}
```
#### 6.在resources下创建applicationContext.xml文件
```java
```
#### 7.测试
```java
//在com.gzh.domain包下创建测试类
@Test
public void findCustomerByIdTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerDao customerDao = (CustomerDao) applicationContext.getBean("customerDao");
Customer customerById = customerDao.findCustomerById(1);
System.out.println(customerById);
}
```
![image-20220426134717655](https://lsky.hhdxw.top/imghub/img/image-20220426134717655.png)
## 基于Mapper方式的整合
### 基于MapperFactoryBean的整合
#### 0.导包
与DAO方式导包数量相同
#### 1.准备数据
同上数据
#### 2.创建实体类
```java
//在com.gzh.domain下创建
private int id;
private String username;
private String jobs;
private String phone;
//利用 getter , setter 和 toString 方法生成代码
```
#### 3.创建com.gzh.mapper. CustomerMapper接口文件
```java
public interface CustomerMapper {
Customer findCustomerById(int i);
}
```
#### 4.在resources下创建com->gzh->mapper->CustomerMapper.Xml文件
com.gzh.mapper 文件夹要一个一个创建,才能保证是嵌套的
```java
```
#### 5.在resources下创建mybatis-config.xml文件
```java
```
#### 6.在resources下创建applicationContext.xml文件
```java
```
#### 7.测试
```java
@Test
public void findCustomerById(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerMapper factoryBean = (CustomerMapper) applicationContext.getBean("factoryBean");
Customer customerById = factoryBean.findCustomerById(1);
System.out.println(customerById);
}
```
![image-20220426135752830](https://lsky.hhdxw.top/imghub/img/image-20220426135752830.png)
虽然使用Mapper接口编程的方式很简单,但是在具体使用时还是需要遵循以下规范。
> (I)Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致。
>
> (2)Mapper,.xml文件中的namespace与Mapper接口的类路径相同(即接口文件和映射文件
> 需要放在同一个包中)。
>
> (3)Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同。
>
> (4)Mapper接口中方法的输入参数类型要和Mapper,.xml中定义的每个sql的parameterType
> 的类型相同。
>
> (5)Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个sql的resultType的
> 类型相同。
只要遵循了这些开发规范,MyBatis就可以自动生成Mapper接口实现类的代理对象,从而
简化我们的开发。
### 基于MapperScannerConfigurer的整合
在上面的基础上修改
1.在 applicationContext 中注释以下代码
```java
```
2.在 applicationContext 中添加以下代码
```java
```
3.创建新的测试类
```java
@Test
public void findCustomerById1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerMapper bean = applicationContext.getBean(CustomerMapper.class);
Customer customerById = bean.findCustomerById(1);
System.out.println(customerById);
}
```
![image-20220427102429052](https://lsky.hhdxw.top/imghub/img/image-20220427102429052.png)