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

目录

1、引入依赖(spring依赖)

2、mybatis相关

3、整合配置文件

4.启动工厂测试Dao

5.在Service层控制事务


1、引入依赖(spring依赖)


    org.springframework
    spring-core
    4.3.2.RELEASE


    org.springframework
    spring-context
    4.3.2.RELEASE


    org.springframework
    spring-context-support
    4.3.2.RELEASE


    org.springframework
    spring-beans
    4.3.2.RELEASE


    org.springframework
    spring-web
    4.3.2.RELEASE


    org.springframework
    spring-aop
    4.3.2.RELEASE


    org.springframework
    spring-expression
    4.3.2.RELEASE


    org.springframework
    spring-aspects
    4.3.2.RELEASE


    org.springframework
    spring-jdbc
    4.3.2.RELEASE

 (mybatis依赖 )


  org.springframework
  spring-tx
  4.3.2.RELEASE


  org.mybatis
  mybatis
  3.2.8


  org.mybatis
  mybatis-spring
  1.3.1


  mysql
  mysql-connector-java
  5.1.40


    com.alibaba
    druid
    1.1.12

2、mybatis相关

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

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

3、整合配置文件

SM整合 -(Spring框架结合Mybatis框架)_第1张图片

4.启动工厂测试Dao

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
UserDAO userDao = (UserDAO) ctx.getBean("userDao");
List 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 findAll() {
        return userDAO.findAll();
    }
    
    @Override
    public void save(User user) {
        userDao.save(user);
    }
}

3.在配置文件中添加

SM整合 -(Spring框架结合Mybatis框架)_第2张图片

事务属性特别说明:

增删改使用默认事务属性、查询使用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~多个任意字符)








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永不超时)


你可能感兴趣的:(java,mybatis,spring,java)