技术标签: spring JavaEE框架 java mybatis 后端 java-ee
哈喽~大家好呀,我们接着上篇(这篇来看看 Mybatis 与Spring的整合)的讲解。
个人主页:个人主页
系列专栏:【Java框架】
与这篇相关的文章:
【JAVAEE框架】MyBatis与Spring的整合(上) 【JAVAEE框架】MyBatis与Spring的整合(上)_程序猿追的博客-程序员秘密 【JAVAEE框架】浅谈 AOP 及代码实现 【JAVAEE框架】浅谈 AOP 及代码实现_程序猿追的博客-程序员秘密 【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP 【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP_程序猿追的博客-程序员秘密
目录
五、DataSourceTransactionManager
上篇当中我们使用 SqlSessionFactoryBean 来创建bean,以及使用了 SqlSessionTemplate。
在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的,而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建。要创建工厂 bean,将下面的代码放到 Spring 的 XML 配置文件中:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
SqlSessionTemplate 简介
通俗地讲,SqlSessionTemplate是Mybatis—Spring的核心,是用来代替默认Mybatis实现的DefaultSqlSessionFactory,也可以说是DefaultSqlSessionFactory的优化版,主要负责管理Mybatis的SqlSession,调用Mybatis的sql方法,SqlSessionTemplate是线程安全的,通过TransactionSynchronizationManager中的ThreadLocal保存线程对应的SqlSession,可以被多个Dao共享使用。
这里采用mapper的形式来创建dao的实现类, 编写user的dao层的mapper映射对象,这里可以直接使用factory为mapper对象赋值,也可以用 SqlSessionTemplate 为 mapper 赋值, 可以理解为 省去创建 SqlSessionTemplate 对象这一步
去掉 SqlSessionFactoryBean 与 sqlSessionTemplate 换上 MapperFactoryBean
测试类来测试一下
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService userService = context.getBean(IUserService.class);
UserCondition conn = new UserCondition();
List<SmbmsUser> userList = userService.getUserListByCondition(conn);
for (SmbmsUser user : userList) {
System.out.println(user);
}
}
@Service的作用
spring中有很多注解帮助我们开发,@Repository、@Service 、@Controller 和@Component注解在类上面即可以使spring自动向Bean容器中创建该类的Bean,而在我们需要用到该Bean来创建对象时,在变量声明上方添加@AutoWired或者@Qualifier即可。
@Autowired作用
Autowired 注解进行装配,只能是根据类型进行匹配。@Autowired 注解可以用于 Setter 方法、构造函数、字段,甚至普通方法,前提是方法必须有至少一个参数。@Autowired 可以用于数组和使用泛型的集合类型。然后 Spring 会将容器中所有类型符合的 Bean 注入进来。@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。
Service加上注解
测试跑一下数据
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService userService = context.getBean(IUserService.class);
UserCondition conn = new UserCondition();
List<SmbmsUser> userList = userService.getUserListByCondition(conn);
for (SmbmsUser user : userList) {
System.out.println(user);
}
}
事务(Transaction)是基于关系型数据库(RDBMS)的企业应用的重要组成部分。在软件开发领域,事务扮演者十分重要的角色,用来确保应用程序数据的完整性和一致性。
事务具有 4 个特性:原子性、一致性、隔离性和持久性,简称为 ACID 特性。
原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的动作要么都做要么都不做。
一致性(Consistency):事务必须保证数据库从一个一致性状态变到另一个一致性状态,一致性和原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相打扰。
持久性(Durability):持久性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就是永久性的,后面的其它操作和故障都不应该对其有任何影响。
事务允许我们将几个或一组操作组合成一个要么全部成功、要么全部失败的工作单元。如果事务中的所有的操作都执行成功,那自然万事大吉。但如果事务中的任何一个操作失败,那么事务中所有的操作都会被回滚,已经执行成功操作也会被完全清除干净,就好像什么事都没有发生一样。
在现实世界中,最常见的与事务相关的例子可能就是银行转账了。假设我们需要将 1000 元从 A 账户中转到 B 账户中,这个转账操作共涉及了以下两个操作。
从 A 账户中扣除 1000 元;
往 B 账户中存入 1000 元。如果 A 账户成功地扣除了 1000 元,但向 B 账户存入时失败的话,那么我们将凭空损失 1000 元;如果 A 账户扣款时失败,但却成功地向 B 账户存入 1000 元的话,我们的账户就凭空多出了 1000 元,那么银行就会遭受损失。因此我们必须保证事务中的所有操作要么全部成功,要么全部失败,理解了这一点,我们也就抓住了事务的核心。
配置步骤
导入tx和aop命名空间
定义事务管理器Bean,并为其注入数据源Bean
通过 <tx:advice> 配置事务增强,绑定事务管理器并针对不同方法定义事务规则
配置切面,将事务增强与方法切入点组合
<!-- 配置事务-->
<!-- 配置事务管理器 Bean,类似于切面 Bean -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- isolation隔离级别,propagation 传播行为-->
<tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面,将事务增强与方法切入点结合-->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(public * com.itxzw.*.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
propagation:事务传播机制
REQUIRED(默认值)
REQUIRES_NEW 、MANDATORY、NESTED
SUPPORTS
NOT_SUPPORTED、NEVER
isolation:事务隔离等级
DEFAULT(默认值)
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
注:REQUIRED能够满足大多数的事务需求可以作为首选的事务传播行为。
timeout:事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时
read-only:事务是否为只读,默认值为false
rollback-for:设定能够触发回滚的异常类型
Spring默认只在抛出runtime exception时才标识事务回滚
可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开
no-rollback-for:设定不触发回滚的异常类型
Spring 默认checked Exception不会触发事务回滚
可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开
测试类跑一下
在使用spring进行web开发时,虽然spring提供的注解方式可以方便的处理很多原来需要手动提交或回滚的事务,但是注解方式有自己使用的局限,比如在类的内部调用方法时,注解方式处理的事务就无法被触发,此时可能需要手动处理相关数据库的事务。本文记录在spring开发时使用Spring提供的DataSourceTransactionManager进行事务提交或回滚处理。
测试类跑一下
生成 log 文件
总结一句话:手动处理相关数据库的事务
不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!
前言Mixin 也就是混入的意思,就是说通过某种方式将一个对象的一些属性,混入到目标对象身上。对于我个人来说,其实并不太喜欢 Mixin 这是方式的,因为它对开发者来说是透明的,我们不知道什么时候同事去绑定了一个全局的 Mixin,当然用的好那肯定是不方便的,也无奈 Vue 的 Mixin 机制那么强大,所以就驱使我来深入了解它。startmixin 方法在src/core/global-api下...
一、http仓库编译无法通过的问题我们使用阿里镜像去下载库,升级到7.0时会出现以下错误:opt-in, is unsupported. Switch Maven repository 'maven(http://maven.aliyun.com/nexus/content/groups/public/)' to redirect to a secure protocol (like HTTPS) or allow insecure protocols.解决办法:在项目的build.gradle
本地系统启动报以下异常:log4j:WARN [SYSTEM_OUT] should be System.out or System.err.log4j:WARN Using previously set target, System.out by default.log4j:ERROR Could not find value for key log4j.appender.FileInfolog4j:ERROR Could not instantiate appender named "F
毕设中我使用了奇耘的4.2寸墨水屏,官方的范例代码给出了一些局部刷新的例子,但是我认为官方给的代码太过于简单实现的功能也不是我想要的,所以对先有的官方的代码进行了一些改进,让这一套代码更适合于我自己的毕业设计。以下的只有程序思路, 程序还没有完全的完善,就不放出来 误导别人了(代码太烂了)。而且作为毕业设计的一部分 至少要等我毕业了再开源 首先先分享一下这块屏幕的特性这款屏幕的分辨率是...
有两种方案,一种是在settings.xml中添加对应的仓库,另外一种就是在pom.xml中直接添加额外的仓库,我个人推荐第二种(在之前添加)我们上面所修改的Setting.xml 我默认你在IDEA中的Maven使用的是自己下载的Maven,如下图。那么这样,你去修改自己的Maven,但是IDEA中使用的却是IDEA自带的Maven,那肯定不能解决问题啊。但是我发现他的Maven使用的并不是自己的Maven,而是IDEA自带的Maven,如下图。(推荐)然后在文件中引入 阿里云镜像。
本系列主要讲利用微信小程序完整实现狼人杀游戏,慢慢跟进关于狼人杀的游戏规则,就懒得赘述了,请自行百度。以下正文开始创建房间以及加入房间 创建房间逻辑 加入房间逻辑后续更改界面什么创建房间效果图以下实现逻辑,首先具有一个初始参数,然后根据用户选择来进行调节Page({ /** * 页面的初始数据 */ data: { person_s...
数据库系统数据库模式数据库系统是指在计算机信息系统中引入数据库后的系统,一般由数据库、数据库管理系统(DataBase ManagementSystem,DBMS)、应用系统、数据库管理员(DataBase Administrator,DBA)和用户构成。数据库系统的结构典型的是三级划分法,其中包括三级模式和两级映射。1.三级模式数据库系统由外模式、概念模式和内模式三级构成。(1)外模式也称为子模式或用户模式,对应于用户级数据库,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。一个数
import pygalfrom die import Die#创建一的D6die = Die()#扔几次骰子并将它们储存在一个列表中results = []for roll_num in range(1000): result = die.roll() results.append(result)#分析结果看看每一个骰子点数出现的次数frequencies =...
一、问题回顾线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题。2018-05-14 20:01:32.810 ERROR [hystrix-UpgradeResultReportController-49][DruidDataSource.java:1297] - recyle errorja...
系统:win10 专业版安装程序:mysql-installer-community-8.0.16.0.msi提取码:w1g0安装教程:mysql installer community 8.0.16.0安装配置图文教程前提条件:A. 如果是重装的话,请先运行mysql-installer-community-8.0.16.0.msi 将所有的mysql 程序卸载(或在 控制面板>...
软件即服务,基础架构即服务,平台即服务,通信平台即服务,视频会议即服务,那么,游戏即服务(Game as a Service)如何呢?已经有不少科技公司试水云游戏,最著名的要数Googl...
在BS的项目中,完成之后,都需要发布自己的网站。这个时候就要安装IIS了。 我也是最近才打算使用IIS来进行发布的。刚把IIS安装上,就遇到了问题。 出现问题就想办法解决问题呗。遇到的问题和视频里面的类似,他也讲了一下是如何解决的。不过,他的只是不显示图片。而我的是 图片和CSS样式都显示。错误的原因:路径与发布不一致。 检查了一下自己的代码,路径写错?