通过示例讲解MyBatis和Spring整合的流程。前言这个MyBatis和Spring整合示例是我今年3月份刚转岗时需要熟悉MyBatis时写的主要是想知道项目是如何从0到1在Spring中用到MyBatis。这个示例是参考“C语言中文网”但是里面的示例不能直接运行可能是因为版本等原因当时为了集成MyBatis和Spring倒腾了好几天现在回过来看如果你完全不了解MyBatis的基础知识直接照葫芦画瓢虽然也能解决问题但是排查问题的过程其实是非常痛苦的下面我将给一个两者集成的完整示例让大家少走弯路。项目准备DB使用的是Mysqlpom.xml需要添加的依赖包dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.4.6/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.0/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version6.0.6/version /dependencyDB结构CREATE TABLE user_test ( uid tinyint(2) NOT NULL, uname varchar(20) DEFAULT NULL, usex varchar(10) DEFAULT NULL, PRIMARY KEY (uid) ) ENGINEInnoDB DEFAULT CHARSETutf8DB初始数据uidunameusex1张三女2陈恒男3楼仔男集成示例第1步创建持久化类Data public class MyUser { private Integer uid; // 主键 private String uname; private String usex; }第2步创建映射文件?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.mybatis.dao.UserDao !-- 根据uid查询一个用户信息 -- select idselectUserById parameterTypeInteger resultTypecom.mybatis.entity.MyUser select * from user_test where uid #{uid} /select !-- 查询所有用户信息 -- select idselectAllUser resultTypecom.mybatis.entity.MyUser select * from user_test /select !-- 添加一个用户#{uname}为 com.mybatis.po.MyUser 的属性值 -- insert idaddUser parameterTypecom.mybatis.entity.MyUser insert into user_test (uid,uname,usex) values(#{uid},#{uname},#{usex}) /insert !--修改一个用户 -- update idupdateUser parameterTypecom.mybatis.entity.MyUser update user_test set uname #{uname},usex #{usex} where uid #{uid} /update !-- 删除一个用户 -- delete iddeleteUser parameterTypeInteger delete from user_test where uid #{uid} /delete /mapper第3步创建映射文件对应的接口Repository(userDao) Mapper /* * 使用Spring自动扫描MyBatis的接口并装配 Spring将指定包中所有被Mapper注解标注的接口自动装配为MyBatis的映射接口 */ public interface UserDao { /** * 接口方法对应的SQL映射文件中的id */ public MyUser selectUserById(Integer uid); public ListMyUser selectAllUser(); public int addUser(MyUser user); public int updateUser(MyUser user); public int deleteUser(Integer uid); }之前直接使用MyBatis时是没有这个接口文件的添加这个文件是为了能让Spring和Mybatis的操作通过该文件关联起来即通过上述提供的接口实现对DB的操作。第4步新建mybatis配置?xml version1.0 encodingutf-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration settings setting namelogImpl valueLOG4J / setting namecacheEnabled valuefalse/ setting namedefaultExecutorType valueREUSE/ setting nameuseGeneratedKeys valuetrue/ /settings /configuration由于后面会将两者整合所以关于MyBatis中environments和mappers的配置将会全部移到applicationContext.xml中这个是直接用MyBatis中一个很大的区别。第5步新增DB配置文件新增DB配置文件jdbc.properties用于保存DB配置信息jdbc.shop.urljdbc:mysql://xxx:3104/xm_jointly?characterEncodingutf8 jdbc.shop.usernamejointly_xx jdbc.shop.passwordG-uTlU-xxx第6步增加配置信息需要在applicationContext.xml中新增配置信息这里就是整个集成的关键所在!-- 用于加载配置文件 -- bean classorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer property namelocation valueclasspath:com/mybatis/config/datasources/jdbc.properties/value /property /bean !-- 定义数据源 -- bean iddataSource classorg.springframework.jdbc.datasource.DriverManagerDataSource property nameurl value${jdbc.shop.url}/property property nameusername value${jdbc.shop.username}/property property namepassword value${jdbc.shop.password}/property /bean !-- 添加事务支持 -- bean idtxManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource / /bean !-- 注册事务管理驱动 -- tx:annotation-driven transaction-managertxManager / !-- 配置SqlSessionFactoryBean -- bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean !-- 引用数据源组件 -- property namedataSource refdataSource / !-- 引用DB XML配置文件 -- property namemapperLocations valueclasspath*:com/mybatis/mapper/UserMapper.xml / !-- 引用MyBatis配置文件中的配置 -- property nameconfigLocation valueclasspath:com/mybatis/config/datasources/mybatis-config.xml / /bean !-- Mapper代理开发使用Spring自动扫描MyBatis的接口并装配 Spring将指定包中的所有被Mapper注解标注的接口自动装配为MyBatis的映射接口 -- bean classorg.mybatis.spring.mapper.MapperScannerConfigurer !-- mybatis-spring组件的扫描器com.dao只需要接口接口方法与SQL映射文件中的相同 -- property namebasePackage valuecom.mybatis.dao / property namesqlSessionFactoryBeanName valuesqlSessionFactory / /bean这个配置需要解读一下用于加载配置文件用于存放DB的配置信息就是上文中提到的jdbc.properties配置文件这样的好处就是不需要将DB配置信息在XML中写死。定义数据源这个就是DB的账户和密码了jdbc.shop.url和jdbc.shop.username等就是DB的配置信息保存在jdbc.properties配置文件中。添加事务支持之前这个事务支持的配置是在MyBatis中的environments中现在给挪到了这里还是采用JDBC的方式。注意一下添加事务一定需要注册事务管理驱动。配置SqlSessionFactoryBean这个其实还是MyBatis中之前的配置dataSource是数据源、mapperLocations是XML映射文件、configLocation是MyBatis的原始配置相当于把之前未集成的MyBatis配置拆分了一下把里面的environments和mappers给挪到这里来了。这个其实就是用来构建sqlSessionFactory会话工厂我们可以再回顾一下MyBatis的调用流程这个建议大家看看文章《【MyBatis系列1】基础知识下》应该就能很明显看出他们的区别所以为什么需要大家掌握MyBatis未集成的实现方式这样可以知道它的原貌包括后面继承Spring Boost原理都一样只是换了一种展示方式。Spring自动扫描MyBatis的接口并装配这里就是两者结合的核心怎么结合呢通过com.mybatis.dao.UserDao接口就是我们“第3步创建映射文件对应的接口”所以这个才是两者集成的核心里面的basePackage指定接口路径sqlSessionFactoryBeanName是用到的sqlSessionFactory会话工厂。到这里是不是就很清晰了呢我可是结合MyBatis未集成的方式进行对比讲解这样就知道Spring对于两者的集成都做了哪些事情。第7步测试示例我们先常见一个测试类Controller(userController) public class UserController { Autowired private UserDao userDao; public void test() { // 查询一个用户 MyUser auser userDao.selectUserById(1); System.out.println(auser); System.out.println(); // 查询所有用户 ListMyUser list userDao.selectAllUser(); for (MyUser myUser : list) { System.out.println(myUser); } } }测试示例// 用于测试MyBatis和Spring的集成 public class SpringMyBatisTest { public static void main(String[] args) { String xmlPath applicationContext.xml; ApplicationContext applicationContext new ClassPathXmlApplicationContext(xmlPath); UserController uc (UserController) applicationContext.getBean(userController); uc.test(); } }输出结果MyUser(uid1, uname张三, usex女) MyUser(uid2, uname陈恒, usex男) MyUser(uid3, uname楼仔, usex男)项目框架如果只根据上面的示例想让项目跑起来对于小白来说还是有点困难的因为你不知道哪个文件放哪里这里我直接给出项目视图是不是感觉楼哥超级暖呢。
企业数字化 ERP 产品动态
相关推荐
生猪运输流向智能分析系统:让每一车猪都“来路可查、去向可追” 生猪调运是养猪产业链的“大动脉”——全国每年跨省调运生猪数亿头次,一辆9.6米高栏车就能装150头猪,一趟行程连接的是养殖场、贩运商、屠宰场三个环节。可这条动脉的“血流方向”,长期处于“看不清、管不住”的状态:猪从哪里来、… · 2026/9/25 18:28:05
【Maven系列3】坐标与依赖 主要讲解Maven的依赖管理相关知识。前言Maven确实比较简单,估计大家在工作期间,每天抽出一点时间,基础部分几天就可以学完,所以这块感觉真没有啥好讲的。这篇文章先讲解依赖管理的基础知识,然后再结合一个简单的示例消… · 2026/9/25 18:27:59
【MyBatis系列1】基础知识(上) 主要讲解 MyBatis 的基础知识前言上个月完成了“Java 并发编程系列”和“Spring 基础系列”知识的学习,这个月我们主要学习 MyBatis。MyBatis 网上的资料真的非常多,整个知识体系也非常系统,如果要整体学完,需要花很多时间&#x… · 2026/9/25 18:27:59
HTTP POST不被支持?405错误的原理与实战排查指南 1. 这不是你的错,是HTTP协议在“按规矩办事”“HTTP method POST is not supported by this URL”——这行报错,我第一次在Unity项目里看到时,正对着一个灰蒙蒙的登录界面发呆。点击“登录”按钮,控制台瞬间炸出这串英文ÿ… · 2026/9/25 18:57:41
Tailwind css 学习备忘 flex布局,加在父元素上,这个父元素变成 flex 容器,它的直接子元素变成 flex 项目,且只影响直接子元素,默认直接子元素横向排列,从左到右。默认主轴水平方向,交叉轴垂直方向。justify-* 控制主轴… · 2026/9/25 18:57:35
书签劫持+WebSocket:验证连接与资源指令下发链路解析 1. 一说到书签劫持,很多人第一反应就偏了提到“书签劫持”这四个字,大多数人的第一反应是浏览器收藏夹被篡改、主页被锁死、打开浏览器就跳到导航站这类问题。确实,这是最常见的用户侧感知,但如果你只停留在“收藏夹被塞了几个网址… · 2026/9/25 18:57:35
WorkBuddy Tools:基于SQLite分片与Tauri IPC的多账号状态同步引擎 1. WorkBuddy Tools 的真实定位:不是账号切换器,而是跨身份工作流的“状态同步引擎”很多人第一次看到“WorkBuddy Tools:在不同账号间,无缝衔接你的 WorkBuddy 工作”这个标题,下意识会理解成一个类似浏览器多开账号记… · 2026/9/25 18:57:35
RK3566 AIoT 网关适合什么轻量边缘智能场景 一台 RK3566 盒子能启动 Linux、接入设备并跑通一个识别模型,并不等于它已经适合作为项目里的边缘节点。真正的问题不是“能不能跑”,而是业务高峰出现时,采集、推理、规则、存储和上报同时发生,关键任务还能否在规定时间内完成&a… · 2026/9/25 18:57:22
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37