Spring结合mybatis

news2024/11/29 12:50:07

目录

一、Spring结合mybatis

二、业务层添加声明式事务

1、事务的传播机制

2、事务的四大特性

3、事务的隔离级别

4、事务属性


一、Spring结合mybatis

1.创建Web工程,导入Spring和MyBatis的相关依赖

 <!-- spring+mybatis整合 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.2</version>
    </dependency>

    <!-- 阿里数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.9</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>

2.建立开发目录结构,创建实体类

 3.创建数据访问接口和SQL映射语句文件   

 4.使用Spring配置文件配置数据源

数据源的相关配置信息放到properties文件中维护

采用PropertySourcesPlaceholderConfigurer类加载properties文件

Spring配置文件中采用${xxx}方式引用properties文件中的键值对数据

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8&useSSL=false
user=root
password=root

5.使用Spring配置文件创建SqlSessionFactory

<!--数据源的相关配置db.properties-->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:db.properties"/>
    </bean>
    <!--创建数据源的bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>
   <!-- 创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
        <property name="mapperLocations">
            <list>
                <value>classpath:mybatis/mapper/*.xml</value>
            </list>
        </property>
    </bean>
    

6.配置MyBatis应用配置文件

 <typeAliases>
        <package name="cn.smbms.pojo"/>
 </typeAliases>

7.创建数据访问接口的实现类

 8.在Spring配置文件中注入SqlSessionTemplate

<!--创建sqlSessionTemplate-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    <!--创建dao对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.smbms.mapper"/>
    </bean>

    <context:component-scan base-package="cn.smbms.service"/>

9.创建业务接口和业务实现类

 10.使用单元测试类测试

MapperScannerConfigurer 与@Autowired注解或@Resource注解配合使用,自动创建映射器实现并注入给业务组件,能够最大限度地减少DAO组件与业务组件的编码和配置工作

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired  // 或 @Resource
    private UserMapper userMapper;
    //……代码省略
}
<!-- 省略数据源、 SqlSessionFactoryBean的相关配置 -->
<!-- 配置DAO -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="cn.smbms.dao" />
</bean>
<!-- 配置扫描注解定义的业务Bean -->
<context:component-scan base-package="cn.smbms.service" />

二、业务层添加声明式事务

1、事务的传播机制

1、REQUIRED(需要)(默认)

定义:如果有事务则加入事务,如果没有事务,则创建一个新的(默认值)

回滚机制:如果调用方有事务,则加入,所以是同一个事务,有异常则一起回滚,如果调用方没事务,则创建

一个新的事务

2、REQUIRES_NEW(需要新的)

定义:不管是否存在事务,都创建一个新的事务,两个事务之间没有关系

回滚机制:由于调用方和被调方都属于不同的事务,所以回滚互不影响

3、SUPPORTS(支持)

定义:调用方有事务则直接用,如果没有则不使用事务

回滚机制:调用方有事务则加入,由于是同一个事务,一旦发生异常,则整体回滚

调用方没事务,被调方也不会使用事务,则不存在回滚

4、NOT_SUPPORTED(不支持)

定义:Spring不为当前方法开启事务,相当于没有事务

回滚机制:不论调用方是否有事务,被调方都不使用事务,则不存在回滚

5、NEVER(从不)

定义:必须在一个没有的事务中执行,否则报错

回滚机制: 如果调用方开启了事务,则被调方会抛出异常,被调方回滚

6、MANDATORY(强制)

定义:必须在一个已有的事务中执行,否则报错

回滚机制:如果调用方开启事务,则加入同一个事务,不论谁异常,都会整体回滚

如果调用方没开启事务,则抛出异常,被调方回滚

7、NESTED(嵌套)

定义:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似

的操作

若调用者方法有开启事务。此时NESTED会开始一个 "嵌套的" 事务, 它是已经存在事务的一个真

正的子事务。 嵌套事务开始执行时, 它将取得一个 savepoint。 如果这个嵌套事务失败, 我们将

回滚到此 savepoint。 嵌套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。

回滚机制:主事务和嵌套事务属于同一个事务,嵌套事务出错回滚不会影响到主事务,主事务回滚

会将嵌套事务一起回滚了

2、事务的四大特性

事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性

(Isolation)、持久性(Duration),简称ACID

① 原子性(Atomicity)

事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程

中,只允许出现两种状态之一,要么都成功,要么都失败

任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有

的操作全部成功,整个事务才算是成功完成

② 一致性(Consistency)

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行

之后,数据库都必须处以一致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱

③ 隔离性(Isolation)

事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干

扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰


④ 持久性(Duration)

事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃

或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态

3、事务的隔离级别

Read uncommitted:读未提交

顾名思义,就是一个事务可以读取另一个未提交事务的数据。

Read committed:读提交

顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

Repeatable read:重复读

就是在开始读取数据(事务开启)时,不再允许修改操作

什么时候会出现幻读?

事例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描

FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即

新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),

发现花了1.2万元,似乎出现了幻觉,这就是幻读。

Serializable 序列化

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重

复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

4、事务属性

属性说明
timeout事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时
read-only事务是否为只读,默认值为false
rollback-for

设定能够触发回滚的异常类型

Spring默认只在抛出runtime exception时才标识事务回滚

可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开

no-rollback-for

设定不触发回滚的异常类型

Spring默认checked Exception不会触发事务回滚

可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开

在Spring配置文件中配置事务管理类,并添加对注解配置的事务的支持

使用@Transactional为方法添加事务支持
<bean id="txManager"  class="org.springframework.jdbc.datasource
                                                              .DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {
 	……
	@Transactional(propagation = Propagation.SUPPORTS)
    public List<User> findUsersWithConditions(User user) {
        // 省略实现代码
    }}

 使用注解实现事务处理

属性类型说明
propagation

枚举型:Propagation

可选的传播性设置。使用举例:

@Transactional(

propagation=Propagation.REQUIRES_NEW)

isolation

枚举型:Isolation

可选的隔离性级别。使用举例:

@Transactional(

isolation=Isolation.READ_COMMITTED)

readOnly

布尔型

是否为只读型事务。使用举例:@Transactional(readOnly=true)

timeout

int型(以秒为单位)

事务超时。使用举例:Transactional(timeout=10)

使用注解实现事务处理

属性类型说明
rollbackFor

一组 Class 类的实例,必须是Throwable的子类

一组异常类,遇到时 必须 回滚。使用举例:@Transactional(

rollbackFor={SQLException.class}),多个异常用逗号隔开

rollbackForClassName

一组 Class 类的名字,必须是Throwable的子类

一组异常类名,遇到时 必须 回滚。使用举例:@Transactional(

rollbackForClassName={

"SQLException"}),多个异常用逗号隔开

noRollbackFor

一组 Class 类的实例,必须是Throwable的子类

一组异常类,遇到时 必须不 回滚

noRollbackForClassName

一组 Class 类的名字,必须是Throwable的子类

一组异常类名,遇到时 必须不 回滚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web渗透安全测试(靶场搭建及常见漏洞攻防)

渗透测试 渗透测试&#xff08;Penetration test&#xff09;即安全工程师模拟黑客&#xff0c;在合法授权范围内&#xff0c;通过信息搜集、漏洞挖掘、权限提升等行为&#xff0c;对目标对象进行安全测试&#xff08;或攻击&#xff09;&#xff0c;最终找出安全风险并输出测…

Denoising Diffusion Probabilistic Models简介

目录概要前向过程nice property逆向过程参数推导简化参考资料概要 Denoising Diffusion Probabilistic Model(DDPM)是一个生成模型&#xff0c;给定一个目标分布&#xff0c;学习模型以便可以从目标分布中采样。 使用马尔科夫链建模。输入是噪声&#xff0c;通过神经网络逐步去…

“乌卡时代”下,跨境电商卖家到底在焦虑什么?

三年前新冠疫情大爆发&#xff0c;现今国家全面解封&#xff0c;但形式任然不稳定&#xff0c;加之国际形势扑朔迷离&#xff0c;各国外贸瞬息万变&#xff0c;跨境电商行业面对的复杂性也随之正变得越来越高。无论是运价&#xff0c;还是爆仓&#xff0c;亦或是港口拥堵等情况…

WPF入门 第一篇 基础布局与简单样式

基础布局与简单样式 首先&#xff0c;创建WPF项目&#xff0c;在自动打开的MainWindow.xaml里面&#xff0c;找到Grid标签&#xff0c;并将它替换为&#xff1a; <Grid><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition>&…

【案例教程】地球科学数据(ERA5、雪深、积雪覆盖、海温、植被指数、土地利用)处理实践

【查看原文】地 球 科 学 常 见 数 据 的 处 理 实 践 技 术 应 用 在地球科学中&#xff0c;不同数据根据具体学科的特色存储为多种数据格式。在科研工作中需要将多种数据进行综合使用分析&#xff0c;因此需要寻找学习通用的数据格式解决方法&#xff0c;把研究的精力聚焦到具…

芜湖~西门子低代码最新组件首发,快来围观!

热爱低代码的小伙伴们&#xff0c;我们又见面啦~ 在与大家长达1年多时间的沟通交流中&#xff0c;我们深刻感受到大家对西门子低代码的浓厚兴趣。为了不辜负大家的厚爱&#xff0c;我们潜心研制了一批前端组件。因为随着商业化的趋势&#xff0c;越来越多的企业级产品对更好的…

web前端实训作业 html+css+javascript 水果超市网页设计实例 企业网站制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

12.7、后渗透测试--python插件执行py脚本

加载python插件&#xff1a;meterpreter >load python查看指令集&#xff1a;meterpreter >helppython执行单条语句&#xff1a;meterpreter > python_execute "import os; cdos.getcwd()" -r cd # 将os.getcwd()赋值给 cd 这个变量&#xff0c;然后用 -…

中英翻译《The number thirteen数字13》

The number thirteen 数字13 一、Pre-reading activity 阅前思考 1.Do you have a lucky number? If so, what is it? 你有幸运数字吗&#xff1f;如果有&#xff0c;是什么&#xff1f; 2.What number is next? 10, 11, 12, ____? 下一个数字是什么&#xff1f; 10、11、1…

设计模式-迭代器模式

迭代器模式UML类图 实现代码如下&#xff08;这里使用的集合是list,也可以使用其他集合这里就不一一展示了&#xff09; public interface Iterator<T> {T next();boolean hasNext(); } 复制代码 public class ConcreteIterator<T> implements Iterator<T>…

商品企划VE课程大纲

课程信息 课程受众: 高中基层管理人员、储备干部&#xff0c;项目经理&#xff0c;商品企划人员&#xff0c;研发人员 课程时间: 2天 授课方式: 理论讲座&#xff0b;实战工作坊&#xff0b;录像观赏&#xff0b;角色扮演&#xff0b;提问互动&#xff0b;分组讨论&#xff0…

Java入门教程(29)——封装

封装是面向对象三大特征之一。 文章目录1.封装的特性2.封装的作用3.访问控制符4.实例1.封装的特性 高内聚、低耦合 2.封装的作用 提高代码的安全性。提高代码的复用性。高内聚&#xff1a;封装细节&#xff0c;便于修改内部代码&#xff0c;提高可维护性。低耦合”&#xff…

Linux常用目录操作及示例操作

文章目录一、常用权限操作1.1 常用权限操作1. chgrp命令2. chown命令3. chmod命令1.2 权限操作实战任务1 创建文件&#xff0c;设置其用户组任务2 修改文件的所有者任务3 修改文件操作权限二、常用目录操作2.1 常用目录操作2.2 目录操作实战任务1 获取命令帮助信息任务2 查看当…

IBM有望在2026年之前实现量子优势

&#xff08;图片来源&#xff1a;网络&#xff09; 目前&#xff0c;噪声是量子计算面临的最大挑战&#xff0c;限制了量子计算技术的快速发展。在未来几年内&#xff0c;IBM正努力通过各种类型的量子误差管理来减少噪声&#xff0c;直到实现真正的量子纠错 (QEC)。 这也是降低…

ANSYS Topology Optimization拓扑优化技术在轻量化设计应用概述

产品概念设计初期&#xff0c;单纯的凭借经验以及想象对零部件进行设计往往是不够的&#xff0c;在适当约束条件下&#xff0c;如果能充分利用“拓扑优化技术”进行分析&#xff0c;并结合丰富的产品设计经验&#xff0c;是有能力设计出更满足产品结构技术方案、工艺要求、而且…

通俗易懂的Redis数据结构基础教程

Redis有5个基本数据结构&#xff0c;string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构&#xff0c;把这5个数据结构都吃透了&#xff0c;你就掌握了Redis应用知识的一半了。 string 首先我们从string谈起。string表示的是一个可变的字节…

操作系统中的线程

我的GitHub&#xff1a;Powerveil GitHub 我的Gitee&#xff1a;Powercs12 (powercs12) - Gitee.com 皮卡丘每天学Java 进程就是 任务&#xff0c;跑起来的程序 系统使用 PCB 描述进程&#xff0c;使用双向链表来管理进程 进程存在的意义就是让操作系统可以同时执行多个任务&…

(node中)module.exports 和exports的区别

&#xff08;node中使用&#xff09;module.exports 和exports的区别是什么? 用一句话来说明就是&#xff0c;require只会去引用module.exports这个对象的导出&#xff0c;不会引用exports对象的&#xff0c;而我们在编写模块时&#xff08;初始化&#xff09;用到的exports对…

微服务框架 SpringCloud微服务架构 分布式缓存 44 Redis 分片集群 44.4 故障转移

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式缓存 文章目录微服务框架分布式缓存44 Redis 分片集群44.4 故障转移44.4.1 故障转移44.4.2 数据迁移44 Redis 分片集群 44.4 故障转移…

[附源码]Python计算机毕业设计高等数学在线学习平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…