Spring如何整合MyBatis框架?使用XML及java类的配置方式
前言
Spring文章链接: 从头到尾Spring概念,家族,核心技术使用,事务这一篇就够了!!!_千小半的博客-CSDN博客_spring最新技术
mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小半的博客-CSDN博客
一、Spring整合Mybatis框架思路
用过Mybatis的伙伴们因该知道当我们去使用Mybatis去进行数据访问时,不仅有三个重要步骤,还有三个核心对象,这里简单重温一下Spring和Mybatis:
MyBatis使用步骤:
1.创建MybatisConfig 配置文件
2.创建SQL映射文件
3.读取配置文件,获取映射器调用方法测试
MyBatis的三个核心对象:
1.SqlSessionFactoryBuider :创建SqlSessionFactory
2.SqlSessionFactory : 创建SqlSession
3. SqlSession :获取mapper映射器并调用方法
Spring IOC容器和AOP:
spring 将所有的对象都交由spring/IOC容器管理,被管理的对象都称为bean。这些bean都在spring配置文件中进行配置。
好了,小半列出上面的温习及步骤,友友们是不是想起来了Mybatis呢?那么我们最终要让spring和mybatis进行一个整合,这两个框架都有配置文件,我们该怎么把他们合二为一呢,请看下图:
IOC容器也就是spring配置文件需要配置的属性和扫描的信息:
1.SqlSessionFactoryBean : 在mybtais-spring的整合包中,可以生成一个SqlSessionFactory,而前者可以创建出SqlSession,也就自然通过mapper映射器可以调用指定方法,通过该类还可以对Mybtais进行配置别名等。
2.数据源: 通过dbcp包提供的BasicDataSource类进行数据源的一个配置.
3.数据映射器类:使用XML配置文件时,需要扫描mapper映射器,反之,使用注解扫描。
4. 事务管理器 : 在spring容器中,开启事务控制需要先通过springFramework.jdbc包下的DataSourceTransactionManager类配置事务管理器,它控制着事务的开关。
以上的4个类就是需要我们在spring整合mybatis配置的bean,关于整合的配置,以下有XML和java类配置的方式。
二、XML整合Mybatis
1.数据源的外部引入
数据源我们都要配置url,username等连接信息,要想达到数据源的复用性,不想每回都重新配置一遍,就可以通过properties属性文件外部引入数据源。
- db.properties文件
注意:使用spring引入外部属性文件时,前缀必须用jdbc标记。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
- spring配置XML文件
注意: 要想识别数据源,需要先使用以下标签扫描该数据源文件的路径
<context:property-placeholder location="db.properties"/>
开始配置!!!!
MapperFactoryBean类:能够以配置的方式生成映射器的实现类,并注入给业务组件(类型只能是接口类型)
<!--创建bean--><bean id="studentService" class="service.StudentServiceImpl"/><!--利用MapperFactoryBean类扫描mapper接口--><bean id="factoryBean" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="dao.StudentMapper"/></bean><!--扫描properties外部属性文件--><context:property-placeholder location="db.properties"/><!--1.配置数据源--><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"p:driverClassName="${jdbc.driver}"p:username="${jdbc.username}"p:password="${jdbc.username}"p:url="${jdbc.url}"></bean><!--2.创建SqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--引用数据源--><property name="dataSource" ref="dataSource"/><!--设置实体类别名--><property name="typeAliasesPackage" value="entity"/><!--设置映射--><property name="mapperLocations" value="dao/*.xml"/><!--设置映射文件路径--><property name="configLocation" value="mybatis-config.xml"/></bean><!--3.设置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--引入数据源--><property name="dataSource" ref="dataSource"/></bean>
- 启动Spring容器
//测试类public class Test{public static void main(String[] args) {//读取spring配置文件ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");StudentService service=context.getBean("bean名称",StudentService.class);service.方法();}}
三、java类整合Mybatis
使用XML不仅可以配置整合文件,java类也同理。
@Configuration //描述该类是一个配置类
@Component //注册bean
@ComponentScan(basePackages = {"dao", "service"}) //扫描bean
@MapperScan(value = "dao") //扫描mapper接口注入映射器
public class ApplicationConfig {/*** 配置数据源*/@Beanpublic BasicDataSource getDataSource() {BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("root");dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC");return dataSource;}/*** 创建SqlSessioinFactory*/@Beanpublic SqlSessionFactory sqlSessionFactory(){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(getDataSource());PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();try {Resource[] resources = patternResolver.getResources("dao/*.xml");factoryBean.setMapperLocations(resources);ClassPathResource classPathResource = new ClassPathResource("mybatisConfig.xml");factoryBean.setConfigLocation(classPathResource);//设置别名factoryBean.setTypeAliasesPackage("entity");} catch (IOException e) {throw new RuntimeException(e);}try {return factoryBean.getObject();} catch (Exception e) {throw new RuntimeException(e);}}/*** 配置事务管理器*/@Beanpublic DataSourceTransactionManager transactionManager(){DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(getDataSource());return transactionManager;}
相关文章:

Spring如何整合MyBatis框架?使用XML及java类的配置方式
前言 Spring文章链接: 从头到尾Spring概念,家族,核心技术使用,事务这一篇就够了!!!_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…...

第七届蓝桥杯省赛——8冰雹数(递归)
题目:任意给定一个正整数N,如果是偶数,执行: N / 2如果是奇数,执行: N * 3 1生成的新的数字再执行同样的动作,循环往复。通过观察发现,这个数字会一会儿上升到很高,一会…...
Android 10.0 设置静态ip重启后获取不到ip的修复
1.概述 在定制化开发中,对于设置静态ip以后可以正常使用,但是遇到一个新问题 就是开机以后,获取不到ip 地址,这就有点不正常了,获取不到ip 就自然连不上网了,所以要分析问题所在解决问题 2.设置静态ip重启后获取不到ip的修复的核心代码 frameworks/opt/net/ethernet/java…...

mysql笔记
基础 概念 数据库体系结构的三级模式为:外模式、概念模式和内模式。 内模式:存储模式,对数据的物理结构和存储方式的描述。提供数据定义语言定义的。如顺序还是索引存储(将概念模式定义的数据进行组织存储,达到较好…...
华为OD机试 - 最多等和不相交连续子序列(Python)| 真题+思路+考点+代码+岗位
最多等和不相交连续子序列 题目 给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。 数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。 求一组连续子序列,组内子序列的数目最多。输出这个数目。 输入 第一行输入为…...

第四届宁波网安市赛训练题
Crypto 散乱的密文 8fd4a4c94gf15{50}l72d3提示了2 1 6 5 3 4,我们直接横向排列 2165348fd4a4c94gf15{50}l72d3 按顺序竖着抄下来fc1l84f}a45dg034{2d957,然后栅栏解密,注意这里是W型栅栏解密,行数6 flag:flag{52048c453d794df1} 综合解密…...

Windows中MySQL 8.x版本忘记密码如何重设
Windows中MySQL 8.x版本忘记密码如何重置 文章目录Windows中MySQL 8.x版本忘记密码如何重置一、前言二、重置密码操作1、停止MySQL服务2、以安全模式启动MySQL服务3、无密码登录mysql4、重置登录密码5、验证密码是否重置成功三、最后我想说一、前言 好久之前在电脑下载的MySQL…...

【信管12.1】信息文档管理与配置管理
信息文档管理与配置管理对于项目管理来说,文档非常重要,如果是传统的工程行业项目的话,仅仅标书就是几百上千页的。相对来说,其实信息系统开发项目已经好很多了。另外就是配置项,它是比文档更大的一个概念,…...
一文搞懂Linux的标准输出/错误重定向
前言 今天在写一个脚本时,需要将shell命令和可执行程序的输出重定向在某一个log文件中,但是遇到了点小问题,索性就研究下输出重定向到底怎么回事。 Linux系统,有一个非常重要概念,就是一切皆文件。在使用shell脚本时&a…...

【OJ】计数的梦
📚Description: Bessie 处于半梦半醒的状态。过了一会儿,她意识到她好像在数羊,不能入睡。Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码:每一个数码在计数的过程中出现过多少次…...

【项目实战】MySQL使用CONCAT字符串拼接函数实现与特殊字符的拼接
一、需求说明 因为有新功能需要上生产环境,总有一些乱七八糟的兼容历史数据的活要去做,比如以下。 需要批量的更新数据库中某个字段(如id列中原来是ABCDEFG,需要改成[“ABCDEFG”]), 没错,就是…...

OpenCV实战(11)——形态学变换详解
OpenCV实战(11)——形态学变换详解0. 前言1. 腐蚀和膨胀运算1.1 腐蚀和膨胀基础1.2 使用形态学滤波器执行图像腐蚀和膨胀运算2. 开运算和闭运算2.1 使用形态学滤波器执行图像开运算和闭运算3. 形态学变换应用3.1 使用形态学滤波器检测边缘3.2 使用形态学…...

SPI协议详解(Standard SPI、Dual SPI和Queued SPI)
1、标准SPI 1.1、SPI接口的引脚 (1)SCLK:时钟线; (2)MOSI(master output slave input):主设备输出,从设备输入,单向传输; (3)MISO(master input slave output):主设备输入,从设备输…...
【代码随想录二刷】Day15-二叉树-C++
代码随想录二刷Day15 今日任务 层序遍历 226.翻转二叉树 101.对称二叉树 语言:C 层序遍历 102.二叉树的层序遍历 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if(root NULL) …...

C++为什么能重夺年度语言?
目录一、爷青回1、年初依旧很多大新闻,其中一条就是TIOBE把年度编程语言颁给了C。2、这是什么概念?那一年Java的流行指数是14%。二、C为什么衰落三、C为什么重新流行1、C为什么重新流行起来了呢?2、C究竟做对了什么呢?3、根本原因…...

视频监控实时接入——以海康威视为例(2023.2.16)
海康威视实时视频监控接入学习 2023.2.16引言1、视频协议简介1.1 RTSP——Real Time Streaming Protocol(实时流传输协议)1.2 RTMP——Real Time Messaging Protocol(实时消息传输协议)1.3 HLS——HTTP Live Streaming(…...
推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统是什么。
1. 推荐算法的初步理解 如果说互联网的目标就是连接一切,那么推荐系统的作用就是建立更加有效率的连接,推荐系统可以更有效率的连接用户与内容和服务,节约了大量的时间和成本。 1.1 推荐系统主要解决问题 任务一:挖掘长尾:帮助用户找到想要的物品(音乐、商品、新闻),…...

新手小白入门必看!如何批量注册Twitter账号?
Twitter是目前海外比较流行的社媒营销平台,所以很多从事跨境电商行业的朋友都需要利用多个Twitter账号来推广营销,但是注册和管理多个Twitter账号其实并不是简单的事情。龙哥将会在这里详细讲讲该如何批量注册并且让这些账号不会因为关联被封号ÿ…...

虚拟环境的创建以及labelme的使用教程
本来打算是将这两部分分开的,但写完虚拟环境的创建似乎字数太少了,不过二者有关联,所以就放一起了。简单介绍一下,虚拟环境的创建有win11系统已经Ubuntu系统,labelme教程包括了下载及其使用的全部流程,以及…...

CSS中的BFC详细讲解(易懂)
带你用最简单的方式理解最全面的BFC~~~1.先了解最常见定位方案普通流元素按照其在 HTML 中的先后位置至上而下布局行内元素水平排列,直到当行被占满然后换行,块级元素则会被渲染为完整的一个新行所有元素默认都是普通流定位浮动元素首先按照普通流的位置…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...