环境准备
Spring所需要的的包
AOP开发使用的JAR
aopalliance-1.0.jar
aspectjweaver-1.8.10.jar
spring-aop-4.3.6.RELEASE.jar
spring-aspects-4.3.6.RELEASE.jar
4个核心模块JAR
spring-beans-4.3.6.RELEASE.jar
spring-context-4.3.6.RELEASE.jar
spring-core-4.3.6.RELEASE.jar
spring-expression-4.3.6.RELEASE.jar
JDBC和事务的JAR
spring-jdbc-4.3.6.RELEASE.jar
spring-tx-4.3.6.RELEASE.jar
MyBatis框架所需的JAR包
mybatis-3.4.2.jar
mybatis-spring-1.3.1.jar
MyBatis与Spring整合的中间JAR
mybatis-spring-1.3.1.jar
MyBatis与Spring整合的中间JAR
mysql-connector-java-5.1.40-bin.jar
数据源所需JAR(DBCP)
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
编写Spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--读取db.properties -->
<context:property-placeholder location="classpath:jdbc.properties"/>
配置数据源,让Spring管理数据源配置
<!--数据库配置交个Spring管理-->
<!-- 配置数据源 dbcp -->
<!-- <bean id="dataSource"
class="org.apache.commons.dbcp2.BasicDataSource">-->
<!--配置数据源ali-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--数据库驱动 -->
<property name="driverClassName" value="${jdbc.driver}" />
<!--连接数据库的url -->
<property name="url" value="${jdbc.url}" />
<!--连接数据库的用户名 -->
<property name="username" value="${jdbc.username}" />
<!--连接数据库的密码 -->
<property name="password" value="${jdbc.password}" />
<!--最大并发连接数 -->
<property name="maxActive" value="${jdbc.maxTotal}" />
<!--最小空闲连接 -->
<property name="minIdle" value="${jdbc.maxIdle}" />
<!--初始化连接数 -->
<property name="initialSize" value="${jdbc.initialSize}" />
</bean>
事务配置
<!-- 事务管理器,依赖于数据源 -->
<bean id="transactionManager" class=
"org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* ssm.service.*.*(..))" />
</aop:config>
<!--开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
业务层扫描
<!-- 扫描包加载Service实现类 -->
<context:component-scan base-package="ssm.service"></context:component-scan>
mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--Mybatis读取数据配置文件-->
<!-- <properties resource="jdbc.properties" />-->
<!--配置别名 -->
<typeAliases>
<package name="com.po" />
</typeAliases>
<!--配置Mapper的位置 -->
<mappers>
<mapper resource="com/po/CustomerMapper.xml" />
<!-- Mapper接口开发方式 -->
<mapper resource="com/mapper/CustomerMapper.xml" />
</mappers>
</configuration>
<!-- 打开延迟加载的开关 -->
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载,即延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
基于MapperFactoryBean的整合
<!-- Mapper代理的方式开发方式一,配置Mapper代理对象,生成mapper实现类的工厂 -->
<bean id="CustomerMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!-- 配置Mapper接口 -->
<property name="mapperInterface" value="ssm.mapper.CustomerMapper" />
</bean>
基于MapperScannerConfigurer整合(主要使用)
<!-- Mapper扫描开发 推荐使用(基于MapperScannerConfigurer)自动扫描包下面的所有Mapper,当出现多个Mapper时,不用多次书写bean -->
<bean id="beanMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="ssm.mapper" />
</bean>
基于Dao开发模式
采用传统DAO开发方式进行MyBatis与Spring框架的整合时,可以使用mybatis-spring包中所提供的SqlSessionTemplate类或SqlSessionDaoSupport类来实现。
SqlSessionTemplate:是mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的。它还管理SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
SqlSessionDaoSupport:是一个抽象支持类,它继承了DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqlSession。
<!-- Dao来发 后面使用注解就不需要配置了
将指定类配置给Spring,让Spring创建其对象的实例 -->
<bean id="customerDao" class="ssm.dao.imp.CustomerDaoImp" >
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
CustomerDao
/**
* @author Administrator
*/
public interface CustomerDao {
/**
* 通过 id查找顾客信息
* @param id
* @return
*/
public Customer findCustomerById(Integer id);
}
/**
* @author AdministratorC
*/
public class CustomerDaoImp extends SqlSessionDaoSupport implements CustomerDao {
@Override
public Customer findCustomerById(Integer id) {
SqlSession sqlSession =this.getSqlSession();
return sqlSession.selectOne("ssm.mapper.CustomerMapper.findCustomerWithOrders", id);
}
}
测试:
@Test
public void findCustomerByIdDaoTest(){
ApplicationContext act =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 根据容器中Bean的id来获取指定的Bean
CustomerDao customerDao =
(CustomerDao) act.getBean("customerDao");
Customer customer = customerDao.findCustomerById(1);
System.out.println(customer);
}
mapper开发测试
配置扫描Mapper
<!-- Mapper扫描开发 推荐使用(基于MapperScannerConfigurer)自动扫描包下面的所有Mapper,当出现多个Mapper时,不用多次书写bean -->
<bean id="beanMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="ssm.mapper" />
</bean>
CustomerMapper
/**
* @author Administrator
*/
public interface CustomerMapper {
/**
* 通过id查询客户
* @param id
* @return
*/
public Customer findCustomerById(Integer id);
/**
* 添加客户
* @param customer
*/
public void addCustomer(Customer customer);
/**
* 一对多查询 客户对于的订单
* @param id
* @return
*/
public Customer findCustomerWithOrders(Integer id);
}
创建对应的Mapper.xml文件
@Test
public void findCustomerByIdMapperTest(){
ApplicationContext act =
new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerMapper customerMapper = act.getBean(CustomerMapper.class);
Customer customer = customerMapper.findCustomerById(1);
System.out.println(customer);
System.out.println(customerMapper.findCustomerWithOrders(1));
}