# 第十章: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://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/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://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/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://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/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://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220427102429052.png)