跳至主要內容
Javassm - 数据库框架整合2

数据库框架整合2

整合Mybatis框架

通过了解数据源,我们已经清楚,Mybatis实际上是在使用自己编写的数据源(数据源实现其实有很多)默认使用的是池化数据源,它预先存储了很多的连接对象。

如何将Mybatis与Spring更好的结合

使用例子

比如我们现在希望将SqlSessionFactory交给IoC容器进行管理,而不是我们自己创建工具类来管理(我们之前一直都在使用工具类管理和创建会话)

<!-- 这两个依赖不用我说了吧 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <!-- 注意,对于Spring 6.0来说,版本需要在3.5以上 -->
    <version>3.5.13</version>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.31</version>
</dependency>
<!-- Mybatis针对于Spring专门编写的支持框架 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>3.0.2</version>
</dependency>
<!-- Spring的JDBC支持框架 -->
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>6.0.10</version>
</dependency>

codejavassmSpringSpringEL大约 6 分钟
Javassm - 数据库框架整合2

数据库框架整合3

Mybatis事务管理

通过将对应的Bean类型注册到容器中,就能更加方便的去使用Mapper

接着来看Spring的事务控制。

事务机制回顾

回顾一下事务机制。首先事务遵循一个ACID原则:

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。类比银行转账,从一个账号扣款,另一个账号增款,必须保证总金额不变。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。类比多个人同时编辑同一文档,每个人看到的结果都是独立的,不会受其他人的影响,不过难免会存在冲突。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。类比写入硬盘的文件,即使关机重启,文件仍然存在。

codejavassmSpringSpringEL大约 13 分钟
Javassm - JUnit整合

JUnit整合

集成JUnit测试

既然使用了Spring,那么怎么集成到JUnit中进行测试呢,首先大家能够想到的肯定是:

public class TestMain {

    @Test
    public void test(){
        ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
        TestService service = context.getBean(TestService.class);
        service.test();
    }
}

codejavassmSpringSpringEL大约 1 分钟
Javassm - 数据库框架整合1

数据库框架整合1

学习了Spring之后,我们已经了解如何将一个类作为Bean交由IoC容器管理,这样,我们就可以通过更方便的方式来使用Mybatis框架,我们可以直接把SqlSessionFactory、Mapper交给Spring进行管理,并且可以通过注入的方式快速地使用它们。

数据源 DataSource接口

在之前,我们如果需要创建一个JDBC的连接,那么必须使用DriverManager.getConnection()来创建连接,连接建立后,通过创建Statement对象,就可以进行数据库操作。


codejavassmSpringSpringEL大约 12 分钟
Javassm - AOP1

AOP面向切片

AOP(Aspect Oriented Programming)思想实际上就是:在运行时,动态地将代码切入到类的指定方法、指定位置上。

也就是说,我们可以使用AOP来帮助我们在方法执行前或执行之后,做一些额外的操作,实际上,它就是代理!

通过AOP我们可以在保证原有业务不变的情况下,添加额外的动作

比如我们的某些方法执行完成之后,需要打印日志,那么这个时候,我们就可以使用AOP来帮助我们完成,它可以批量地为这些方法添加动作。可以说,它相当于将我们原有的方法,在不改变源代码的基础上进行了增强处理


codejavassmSpringSpringEL大约 12 分钟
Javassm - AOP2

AOP面向切片2

使用接口实现AOP

我们来看看如何使用Advice接口实现AOP。

它与我们之前学习的动态代理更接近一些,比如在方法开始执行之前或是执行之后会去调用我们实现的接口,首先我们需要将一个类实现Advice接口,只有实现此接口,才可以被通知

比如我们这里使用MethodBeforeAdvice表示是一个在方法执行之前的动作:

public class StudentAOP implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("通过Advice实现AOP");
    }
}

codejavassmSpringSpringEL大约 4 分钟
Javassm - SpringEL表达式1

SpringEL表达式

SpEL 是一种强大,简洁的装配 Bean 的方式,它可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用 JDK 中提供的静态常量,获取外部 Properties 文件中的的配置。

外部属性注入

我们可以将一些外部配置文件中的配置进行读取,并完成注入。

创建以.properties结尾的配置文件,这种配置文件格式很简单,类似于Map,需要一个Key和一个Value,中间使用等号进行连接

这里我们在resource目录下创建一个test.properties文件:


codejavassmSpringSpringEL大约 7 分钟