spring整合mybatis

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>-->
            <!--&lt;!&ndash;<tx:method name="insertUser" rollback-for="Exception" isolation="DEFAULT"-->
                      <!--propagation="REQUIRED" read-only="false"/>&ndash;&gt;-->
            <!--&lt;!&ndash; 以User结尾的方法,切入此方法时,采用对应事务实行&ndash;&gt;-->
            <!--<tx:method name="*User" rollback-for="Exception" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>-->
            <!--&lt;!&ndash; 以query开头的方法,切入此方法时,采用对应事务实行 &ndash;&gt;-->
            <!--<tx:method name="query*" propagation="SUPPORTS"/>-->
            <!--&lt;!&ndash; 剩余所有方法 &ndash;&gt;-->
            <!--<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值