8.2 KiB
8.2 KiB
第十章:Spring 和 MyBatis 的整合
基于SSM的用户管理系统的设计与实现
基于传统的DAO方式的整合
0.导包
mybatis mybatis-spring spring mysql spring-tx spring-jdbc commons-dbcp2
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
1.准备数据
mybatis 中的 t_customer
2.创建实体类
//在com.gzh.domain下创建
private int id;
private String username;
private String jobs;
private String phone;
//利用 getter , setter 和 toString 方法生成代码
3.在resources下创建CustomerMapper.xml文件
<!-- 1.根据id查找用户-->
<select id="findCustomerById" parameterType="int" resultType="com.gzh.domain.Customer">
select * from t_customer where id=#{id}
</select>
</mapper>
4.在resources下创建mybatis-config.xml文件
<!--加载Mapper文件-->
<mappers>
<mapper resource="CustomerMapper.xml"/>
</mappers>
5.创建DAO层接口和实现类
//在com.gzh.dao包下创建接口
public interface CustomerDao {
Customer findCustomerById(int id);
}
//在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文件
<!-- 1.连接数据库-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="8520"/>
</bean>
<!-- 2.加载MyBAtis的配置文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 3.创建接口对象-->
<bean id="customerDao" class="com.gzh.dao.impl.CustomerDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
7.测试
//在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);
}
基于Mapper方式的整合
基于MapperFactoryBean的整合
0.导包
与DAO方式导包数量相同
1.准备数据
同上数据
2.创建实体类
//在com.gzh.domain下创建
private int id;
private String username;
private String jobs;
private String phone;
//利用 getter , setter 和 toString 方法生成代码
3.创建com.gzh.mapper. CustomerMapper接口文件
public interface CustomerMapper {
Customer findCustomerById(int i);
}
4.在resources下创建com->gzh->mapper->CustomerMapper.Xml文件
com.gzh.mapper 文件夹要一个一个创建,才能保证是嵌套的
<mapper namespace="com.gzh.mapper.CustomerMapper">
<!--1.根据id查询客户信息-->
<select id="findCustomerById" parameterType="int" resultType="com.gzh.domain.Customer">
select * from t_customer where id=#{id}
</select>
</mapper>
5.在resources下创建mybatis-config.xml文件
<mappers>
<mapper resource="com/gzh/mapper/CustomerMapper.xml"/>
</mappers>
6.在resources下创建applicationContext.xml文件
<!-- 1.连接数据库-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="8520"/>
</bean>
<!-- 2.加载MyBAtis的配置文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 3.创建MapperFactoryBean类对象-->
<bean id="factoryBean" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.gzh.mapper.CustomerMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
7.测试
@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);
}
虽然使用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 中注释以下代码
<!-- 3.创建MapperFactoryBean类对象-->
<bean id="factoryBean" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.gzh.mapper.CustomerMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
2.在 applicationContext 中添加以下代码
<!-- 4.基于MapperScannerConfigurer的整合-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.gzh.mapper"/>
</bean>
3.创建新的测试类
@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);
}