当前位置: 首页 > news >正文

Spring集成MyBatis(自定义类和xml配置文件两种形式)

将mybatis与spring进行整合,主要解决的问题就是讲SqlSessionFactory对象交由spring来管理,所以,该整合,只需要将SqlSessionFactory的对象生成器SqlSessionFactoryBean注册在spring容器中,再将其注入给Dao的实现类即可完成整合,实现spring与mybatis的整合常用的方式:扫描的Mapper动态代理.


spring就像插线板一样,mybatis框架是插头,可以很容易的组合到一起。mybatis插头插入spring插线板就是一个整体。

我们需要spring创建以下对象
1.独立的连接池对象
2.SqlSessionFactory对象
3.创建出dao对象
上面三个对象的创建,使用xml的bean标签

1.Maven配置

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.0</version>
</dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.0</version>
</dependency>
将mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己创建SqlSessionFactory 、打开SqlSession等操作。其中最重要的配置就是定义好SqlSessionFactoryBean。mybatis通过SqlSessionFactoryBean将SqlSessionFactory对象集成到spring中,它实现了InitializingBean接口,在SqlSessionFactoryBean初始化时解析配置并创建DefaultSqlSessionFactory对象。它还实现了FactoryBean,在getObject时返回我们创建好的DefaultSqlSessionFactory,使得DefaultSqlSessionFactory也被spring管理起来。
很多框架集成到spring的方法基本都是靠InitializingBean和FactoryBean这两个接口来实现的,很好的设计

2.集成到spring中

有两种方式

第一种方式:自定义类

	/*** Mybatis会话工厂* Mybatis Session Factory* 声明mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory*/@Beanpublic SqlSessionFactoryBean mybatisSqlSessionFactoryBean(DataSource dataSource) throws IOException {//dataSourceSqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);//resolverPathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();bean.setMapperLocations(resolver.getResources("classpath*:mapper/**/*Mapper.xml"));//configuration配置类相当于mybatis的主配置文件configuration.xmlorg.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configuration.setCacheEnabled(true);configuration.setLazyLoadingEnabled(false);//懒加载:关闭configuration.setMapUnderscoreToCamelCase(true);//mybatis驼峰映射configuration.setLogImpl(Log4jImpl.class);bean.setConfiguration(configuration);//自定义别名,mybatis会自动扫描这个包下的所有类,给所有的类生成别名,生成的别名就是这个类的简单类名(首字母可以是大写/小写)bean.setTypeAliasesPackage("org.techwebsite.domain");//自定义别名/***pagehelper分页插件*****/Interceptor interceptor = new PageInterceptor();Properties properties = new Properties();properties.setProperty("helperDialect", "mysql");//数据库properties.setProperty("offsetAsPageNum", "true");//是否将参数offset作为PageNum使用properties.setProperty("rowBoundsWithCount", "true");//是否进行count查询properties.setProperty("reasonable", "false");//是否分页合理化interceptor.setProperties(properties);//添加插件bean.setPlugins(new Interceptor[]{interceptor});return bean;}/***  MapperScannerConfigurer:在内部调用SqlSession的getMapper()生成每个dao接口的代理对象*  或者使用注解@MapperScan(basePackages = "org.techwebsite.logic.mapper")//扫描mybatis的mapper文件*/@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("org.techwebsite.logic.mapper");return msc;}

pagehelper官方:

Releases · pagehelper/Mybatis-PageHelper (github.com)

PageHelper分页使用详解_笔记大全_设计学院

用的当时的最新版6.0.0

第二种方式:xml配置文件

mybatis主配置文件

configuration.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--settings:控制mybatis全局行为--><settings><!-- 懒加载:开启--><setting name="lazyLoadingEnabled" value="true"/><!-- 积极加载:关闭 --><setting name="aggressiveLazyLoading" value="false"/><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--类别名--><typeAliases><!-- 批量定义别名,告诉mybatis要扫描的包  --><!-- mybatis会自动扫描这个包下的所有类,给所有的类生成别名,生成的别名就是这个类的简单类名(首字母可以是大写/小写) --><package name="com.example.eshop_manager.entity"/></typeAliases>
</configuration>

applicationContext.xml (Spring核心配置文件)

 
<!--  开启包扫描 -->
<!-- 扫描这个包下所有的相关注解,需要被bean容器池管理的会自动帮你创建对象 -->
<context:component-scan base-package="com.example.eshop_manager"></context:component-scan><!-- 读取属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><!-- 定义数据源,使用c3p0 -->
<bean id="dbSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property>
</bean><!-- 声明mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 数据源:set注入,把数据库连接池赋给了dataSource属性 --><property name="dataSource" ref="dbSource"></property><!-- 加载mybatis主配置文件的位置,因为是在spring中指定mybatis主配置文件,所以要用classpath:configLocation:属性是Resource类型的,负责读取配置文件赋值使用 value 指定文件的路径 --><property name="configLocation" value="classpath:mybatis/configuration.xml" /><!-- 自动扫描XxxMapping.xml文件,**任意路径 --><property name="mapperLocations" value="classpath*:com/tgq/**/mapper/*.xml"/><!--配置pagehelper插件--><!-- PageHelper 配置pagehelper.helperDialect=mysqlpagehelper.reasonable=truepagehelper.supportMethodsArguments=truepagehelper.params=count=countSql--><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><value>helperDialect=mysql</value></property></bean></array></property>
</bean><!-- mapper扫描,从mapper包中扫描出mapper接口,
自动创建代理对象并且在spring的bean容器池中管理,遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中,自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
MapperScannerConfigurer:在内部调用SqlSession的getMapper()生成每个dao接口的代理对象
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 指定扫描的包名,如果扫描多个包,每个包中间使用半角逗号分隔
MapperScannerConfigurer会扫描这个包中所有的接口,把每个接口都执行一次getMapper()方法,
得到每个接口的dao对象,创建好的dao对象放入spring容器中,创建好的dao对象名称就是接口名首字母小写,例如studentDao--><property name="basePackage" value="com.example.eshop_manager.dao"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

参考:

分页配置:org.mybatis.spring.SqlSessionFactoryBean.setPlugins()方法的使用及代码示例_其他_大数据知识库

【MyBatis】spring整合mybatis教程(详细易懂)_无法自律的人的博客-CSDN博客

相关文章:

Spring集成MyBatis(自定义类和xml配置文件两种形式)

将mybatis与spring进行整合&#xff0c;主要解决的问题就是讲SqlSessionFactory对象交由spring来管理&#xff0c;所以&#xff0c;该整合&#xff0c;只需要将SqlSessionFactory的对象生成器SqlSessionFactoryBean注册在spring容器中&#xff0c;再将其注入给Dao的实现类即可完…...

Git系列之Git入门级(带你走进Git的世界)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…...

GPU架构与计算入门指南

1比较CPU与GPU 首先&#xff0c;我们会比较CPU和GPU&#xff0c;这能帮助我们更好地了解GPU的发展状况&#xff0c;但这应该作为一个独立的主题&#xff0c;因为我们难以在一节中涵盖其所有的内容。因此&#xff0c;我们将着重介绍一些关键点。 CPU和GPU的主要区别在于它们的…...

功能测试转自动化测试好不好转型?

手工测试做了好多年&#xff0c;点点点成了每天必须做的事情。但是随着自动化测试趋势的日渐明显&#xff0c;以及受到薪资、技能的双重考验&#xff0c;掌握自动化测试成为了必备技能。 手工转自动化测试&#xff0c;不是一蹴而就的。“预先善其事&#xff0c;必先利其器”&a…...

微软surface laptop禁用触摸屏(win10、设备管理器)

参考链接&#xff1a; 在屏幕中启用和禁用触摸屏Windows 设置如下...

冒泡排序算法原理和代码实现,就是这么简单!

冒泡排序&#xff0c;是比较简单的一种排序算法。 它的命名源于它的算法原理&#xff1a;重复的从前往后&#xff08;或者从后往前&#xff09;&#xff0c;依次比较记录中相邻的两个元素&#xff0c;如果他们顺序错误就把它们交换过来&#xff0c;直到没有再需要交换的元素&am…...

[工业自动化-6]:西门子S7-15xxx编程 - PLC系统硬件组成与架构

目录 一、PLC系统组成 1.1 PLC 单机系统组成 1.2 PLC 分布式系统 二、PLC各个组件 2.1 PLC上位机 2.2 PLC主站&#xff1a;PLC CPU控制中心 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;主站组成 2.3 PLC分布式从站: IO模块的拉远 &#xff08;1&am…...

pinpoint监控tomcat应用,页面显示No data collected

pinpoint安装部署教程大家都可以搜到。这里就不说了。单说一下 页面没有数据的情况。 部署环境&#xff0c;pinpoint安装部署在A服务器上。现在是在C、D、E、F……linux机器上安装pinpoint-agnet 1. 将文件 pinpoint-agent-1.8.5.tar.gz 上传到 服务器C、D、E、F…… 2. 解压…...

【左程云算法全讲4】前缀树、非比较排序

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…...

微头条项目实战:新增RequestHeader注解

1、RequestHeader package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.PARAMETER) Retention(RetentionPolicy.RUNTIME) Inherited public interface RequestHeader { }2、DispatcherServlet package com.csdn.mymvc.core; import com.csd…...

E云管家个微协议框架--新版本的利器

在互联网时代&#xff0c;高效、可靠的互联网协议对于实现稳定、安全的数据传输至关重要。E云管家作为一项创新性的IPAD协议构建工具&#xff0c;基于IPAD8.0.37协议为开发者提供了强大而灵活的功能&#xff0c;使他们能够轻松构建高效的通信协议。本文将介绍E云管家的主要特点…...

百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧

原创 | 文 BFT机器人 百度不愧是我国AI技术领域的先行者&#xff0c;每年致力于人工智能领域取得技术产品的突破和创新。据爆料称&#xff0c;百度的文心一言有突破了新境界&#xff0c;开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化&#xff0c;百度都是争先走…...

代码随想录算法训练营第四十七天丨 动态规划part10

121. 买卖股票的最佳时机 思路 动态规划 动规五部曲分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 &#xff0c;这里可能有疑惑&#xff0c;本题中只能买卖一次&#xff0c;持有股票之后哪还有…...

微前端:quankun

零&#xff1a; 前言 微前端可以将大应用拆分功能独立的微应用&#xff0c;可独立开发部署&#xff0c; 每个微应用可以采用自己的技术栈&#xff0c;这样更好维护和拓展。微前端也会存在跨域 权限控制 数据共享 性能(页面加载时间) 安全 多团队协作(一个团队负责一个页面或模…...

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…...

XOR Construction

思路&#xff1a; 通过题目可以得出结论 b1^b2a1 b2^b3a2 ....... bn-1^bnan-1 所以就可以得出 (b1^b2)^(b2^b3)a1^a2 b1^b3a1^a2 有因为当确定一个数的时候就可以通过异或得到其他所有的数&#xff0c;且题目所求的是一个n-1的全排列 那么求出a的前缀异或和arr之后…...

K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)

问题 K8S上出现大量持续terminating的Pod&#xff0c;无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod&#xff1a;contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令&#xff1a; # 获取media命名空间下&#xff0c;名称带contributi…...

Spring 循环依赖

文章目录 内容总结循环依赖 内容总结 循环依赖 循环依赖只存在于 Spring 中, 是因为 Spring 创建 Bean 的流程中, 依赖注入阶段, 会先从单例池中找, 没有再从定义池中找, 针对定义池中找到的候选项会通过 getBean 创建其单例并缓存到单例池, 此机制导致了存在循环依赖的问题.…...

MySQL 8.0.13升级到8.0.35记录 .NET

1、修改表结构的字符集 utf8 修改成 utf8mb4 utf8_general_ci 修改成 utf8mb4_0900_ai_ci 注&#xff1a;所有地方都要替换。 否则会报错误提示&#xff1a;Character set utf8mb3 is not supported 下面是.NET环境升级遇到的问题 2、MySQL Connector Net 8.0.13 在程…...

flink udtaf 常年不能用

[FLINK-32807] when i use emitUpdateWithRetract of udtagg,bug error - ASF JIRA flink1.18发布的时候 他都显示未解决 但是文档上一直有udtaf...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...