spring整合mybatis
1、引入依赖***
<dependencies>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!-- spring+mybatis集成依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
2、引入jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/happy_start?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=qianning
jdbc.init=3
jdbc.minIdle=3
jdbc.maxActive=5
3、spring-mybatis.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" >
<!--基本配置-->
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${jdbc.init}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000"/>
</bean>
<!-- 工厂bean:生成SqlSessionFactory 扫描包生成实现类-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 注入dao-mapper文件信息 ,如果映射文件和dao接口 同包且同名,则此配置可省略-->
<property name="mapperLocations">
<list>
<value>classpath:com/qf/dao/*.xml</value>
</list>
</property>
<!-- 为 dao-mapper文件中的实体 定义缺省包路径
如:<select id="queryAll" resultType="User"> 中 User类可以不定义包
<property name="typeAliasesPackage" value="com.qf.entity"></property>
-->
</bean>
<!--管理dao实现类的创建,并创建dao对象,存入工厂管理-->
<bean id="mapperScannerConfigurer9" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qf.dao"></property>
<!-- 如果工厂中只有一个SqlSessionFactory的bean,此配置可省略 -->
<!--<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>-->
</bean>
<!--<bean id="userService" class="com.qf.service.impl.UserServiceImpl">-->
<!--<property name="userDao" ref="userDao"></property>-->
<!--</bean>-->
<!-- 1. 引入一个事务管理器,其中依赖DataSource,借以获得连接,进而控制事务逻辑 -->
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--<tx:advice id="txManager" transaction-manager="tx">-->
<!--<tx:attributes>-->
<!--<!–<tx:method name="insertUser" rollback-for="Exception" isolation="DEFAULT"-->
<!--propagation="REQUIRED" read-only="false"/>–>-->
<!--<!– 以User结尾的方法,切入此方法时,采用对应事务实行–>-->
<!--<tx:method name="*User" rollback-for="Exception" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>-->
<!--<!– 以query开头的方法,切入此方法时,采用对应事务实行 –>-->
<!--<tx:method name="query*" propagation="SUPPORTS"/>-->
<!--<!– 剩余所有方法 –>-->
<!--<tx:method name="*"/>-->
<!--</tx:attributes>-->
<!--</tx:advice>-->
<!--<aop:config>-->
<!--<aop:pointcut id="myPointCut" expression="execution(* com.qf.service.impl.UserServiceImpl.*(..))"/>-->
<!--<aop:advisor advice-ref="txManager" pointcut-ref="myPointCut"/>-->
<!--</aop:config>-->
<!--告知spring,那些包中 有被注解的类、方法、属性-->
<context:component-scan base-package="com.qf"></context:component-scan>
<!--告知spring @Transactional在定制事务时,基于DataSourceTransactionManager 事务管理器-->
<tx:annotation-driven transaction-manager="tx"/>
<!--添加如下配置,启用aop注解-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
4、spring事务
4.1 配置DataSourceTransaxtionManager 事务管理器
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
4.2配置事务属性
<tx:advice id="txManager" transaction-manager="tx">
<tx:attributes>
<!--<tx:method name="insertUser" rollback-for="Exception" isolation="DEFAULT"
propagation="REQUIRED" read-only="false"/>-->
<!-- 以User结尾的方法,切入此方法时,采用对应事务实行-->
<tx:method name="*User" rollback-for="Exception"/>
<!-- 以query开头的方法,切入此方法时,采用对应事务实行 -->
<tx:method name="query*" propagation="SUPPORTS"/>
<!-- 剩余所有方法 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
4.3、事务属性
isolatioh 隔离级别:
default 默认值 采用数据库的默认设置
read-uncommited 读未提交
read-commited 读提交(Oracle数据库默认隔离级别)
repeatable-read可重复读 (mysql数据库默认隔离级别)
serialized-read 序列化读(最高级别)
propagation传播行为(涉及service调用service)
supports = 不存在外部事务,不开启新事务,存在外部事物合并(适合查询)
required = 不存在外部事物开启新事务,存在合并
readonly 读写性
true:只读,可提高查询效率(适合查询)
false:可读可写(默认值 适合增删改)
timeout事务超时时间
当前事务所需操作的数据被其他事务占用,则等待
100:自定义等待时间
-1:由数据库指定等待时间 默认值 (建议)
rollback-for回滚属性
如果事务中抛出RuntimeException,则自动回滚
如果事务中抛出CheckException(非运行时异常) 不会回滚,默认提交事务
处理:将CheckException转化成RuntimeException 抛出 2、将rollback-for=“Exception”
4.4 将事务管理的advice切入
<aop:config>
<aop:pointcut expression="execution(* com.qf.spring.service.UserServiceImpl.*(..))" id="pc"/>
<!-- 组织切面 -->
<aop:advisor advice-ref="txManager" pointcut-ref="pc"/>
</aop:config>
5、注解开发
(1)用于替换组件的 将组建加入工厂,默认为类名的首字母大写
@Service业务类专用
@Repositort dao实现类专用
@Controller web层专用
@Component 通用
四个注释作用一样
(2)@Autowired 基于类型注入
@Qualifier(“userDao”) 按照名字注入和autowired联合使用
@Resource(“userDao”) 按类型注入 单独使用
@value 注入简单类型数据
<!-- 告知spring,哪些包中 有被注解的类、方法、属性 -->
<!-- <context:component-scan base-package="com.qf.a,com.xx.b"></context:component-scan> -->
<context:component-scan base-package="com.qf"></context:component-scan>
(3)`@Transactional(isolation=Isolation.READ_COMMITTED,propagation=Propagation.REQUIRED,readOnly=false,rollbackFor=Exception.class,timeout = -1) 事务注解
注在类上,对整个类作用 在方法上,对当前方法作用
<!-- 告知spring,@Transactional在定制事务时,基于txManager=DataSourceTransactionManager -->
<tx:annotation-driven transaction-manager="txManager"/>
(4)aop注解
@Aspect 声明此类事一个切面类
@Component 组件 被扫描进入工厂
@Pointcut(“execution(* com.qf.spring.service.UserServiceImpl.*(…))”)定义切入点
@before前置通知
@AfterReturning(value=“pc()”,returning=“ret”) // 后置通知
@Around(“pc()”) // 环绕通知
@AfterThrowing(value=“pc()”,throwing=“ex”) // 异常通知
<!-- 添加如下配置,启用aop注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>