SM整合 -(Spring框架结合Mybatis框架)

目录

1、引入依赖(spring依赖)

2、mybatis相关

3、整合配置文件

4.启动工厂测试Dao

5.在Service层控制事务


1、引入依赖(spring依赖)

<dependency><!--spring核心-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--spring容器支持-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--spring容器支持-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--主要实现ioc模块-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--对web环境的支持和工具-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--aop相关-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--aop相关-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--aop相关-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--数据库资源管理和错误处理-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>

 (mybatis依赖 )

<dependency><!--用来控制事务-->
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--mybatis-->
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.2.8</version>
</dependency>
<dependency><!--mybatis结合spring使用的依赖-->
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.1</version>
</dependency>
<dependency><!--mysql数据库驱动-->
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.40</version>
</dependency>
<dependency><!--阿里巴巴德鲁伊连接池-->
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
</dependency>

2、mybatis相关

建表、实体类(实现序列化接口)、dao接口、mapper

mybatis-spring官方整合中不再需要mybatis主配置文件

3、整合配置文件

4.启动工厂测试Dao

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
UserDAO userDao = (UserDAO) ctx.getBean("userDao");
List<User> users = userDao.findAll();
System.out.println(users);

5.在Service层控制事务

1.Service接口

2.Service实现类

public class UserServiceImpl implements UserService {
    private UserDAO userDAO;
​
    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
​
    @Override
    public List<User> findAll() {
        return userDAO.findAll();
    }
    
    @Override
    public void save(User user) {
        userDao.save(user);
    }
}

3.在配置文件中添加

事务属性特别说明:

增删改使用默认事务属性、查询使用propagation="SUPPORTS"、日志相关使用propagation="REQUIRES_NEW"是常见的实现,这并不一定符合所有的业务需要。

4.启动工厂测试

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) ctx.getBean("userService");
User user = new User();
user.setName("test1");
userService.save(user);

事务属性

name 方法名(重要) 可以使用*通配(*代表0~多个任意字符)

<tx:method name="save*"/>
<tx:method name="*add"/>
<tx:method name="foo"/>
<tx:method name="bar"/>
<tx:method name="*edit*"/>
<tx:method name="test1"/>
<tx:method name="*remove*"/>
<tx:method name="*select*" propagation="SUPPORTS"/>

propagation 传播属性(重要):发生在多个业务层之间事务的传递过程

# 外层事务的概念解释:
一个比较复杂的业务,往往会出现在一个service方法中,调用其他的service方法(可能是同一类,也可能是其他类的service方法)

REQUIRED 需要事务:如果外层存在事务,则使用;不存在事务,则开启。(默认值)

SUPPORTS 支持事务:如果外层存在事务,则使用;不存在事务,也不开启。(常用于查询)

MANDATORY 强制事务:不存在外层事务就报错(了解)。

NEVER 无事务:存在外层事务就报错(了解)。

NOT_SUPPORTED 不支持事务:如果外层存在事务,就暂停事务来执行当前方法,但在内层出现异常时仍然会回滚外层事务。

REQUIRES_NEW 需要新事务:如果外层存在事务,就暂停事务并开启新事务;外层的异常不会导致这个新事务回滚(而是正常提交),但内层异常会导致外层事务回滚。(常用于日志记录

isolation 隔离级别(面试常问)

隔离级别越高、业务的安全性越高、但性能越低。

DEFAULT: 采用数据库默认隔离级别(默认值)。

READ_UNCOMMITTED: 读未提交 一个事务读到了另一个事务未提交的数据,这本身称为脏读。

READ_COMMITTED: 读提交 是用来避免脏读现象出现的 oracle默认隔离级别。

REPEATABLE_READ: 可重复读 主要是用来避免不可重复读现象出现的 (在一次事务中一方更新,导致两次查询结果不一致这种情况叫不可重复读) mysql默认隔离级别。(单行)

- user表中某一行的name字段为zhang3
- 事务A需要查询这一行两次
- 事务B会把name变成li4
​
不可重复读:当事务B的提交正好发生在A的两次查询之间时,A的第一次查询结果为name=zhang3而第二次查询结果为name=li4。
​
解决方式:设置隔离级别为可重复读,可重复读会在A事务第一次查询这行时加入行级锁,不允许这行修改,B事务需要等待A事务结束(提交和回滚都称为结束)才能提交。

SERIALIZABLE: 序列化读 用来避免幻影读现象出现 (在一次事务中一方插入,导致两次查询结果不一致这种情况叫幻影读)。

整表

- user表中符合某个查询条件(比如查所有就可以认为是查询条件是无)的行数共有3行
- 事务A需要对user表进行两次查所有
- 事务B会往user表中插入一行数据
​
幻影读:当事务B的提交正好发生在A的两次查询之间时,A的第一次查询结果条数为3条,而第二次查询结果条数为4条。
​
解决方式:设置隔离级别为序列化读,序列化读会在A事务第一次查询这行时加入表级锁,不允许这个表修改,B事务需要等待A事务结束(提交和回滚都称为结束)才能提交。

两者级别不一样

readonly 只读

true: 本次事务只读

false: 本次事务非只读(默认值)

rollback-for: 遇到哪类异常回滚(默认值为所有RuntimeException包括子类)

no-rollback-for: 遇到哪类异常不回滚

timeout 超时性(单位毫秒,默认-1永不超时)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值