通过Spring整合MyBatis实现持久层操作

文章目录

    • 为什么要整合Spring和MyBatis?
    • 步骤一:添加依赖
    • 步骤二:配置数据源
    • 步骤三:配置MyBatis
    • 步骤四:创建Mapper接口和XML文件
    • 步骤五:使用Mapper接口
    • 拓展:事务管理

在这里插入图片描述

🎉通过Spring整合MyBatis实现持久层操作


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

Spring和MyBatis是Java开发中两个非常重要的框架,它们分别负责实现轻量级的控制反转(IoC)和面向切面(AOP)的Spring,以及数据持久化的MyBatis。通过整合Spring和MyBatis,我们可以充分发挥它们的优势,实现更加灵活和高效的应用程序。本文将介绍如何通过Spring整合MyBatis,以及在整合过程中常见的配置和使用方法。

在这里插入图片描述

为什么要整合Spring和MyBatis?

在传统的Java EE开发中,数据访问层和业务逻辑层往往需要通过独立的框架进行处理。Spring框架提供了IoC容器和AOP机制,使得应用程序更加模块化和可维护。而MyBatis是一个优秀的持久化框架,通过SQL映射文件将Java对象映射到数据库表,提供了便捷的数据库访问方式。整合Spring和MyBatis可以充分利用两者的优势,提高开发效率,降低维护成本。

步骤一:添加依赖

首先,我们需要在项目中添加Spring和MyBatis的相关依赖。如果使用Maven进行项目管理,可以在pom.xml文件中添加如下依赖:

<!-- Spring -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.10.RELEASE</version>
</dependency>

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

这里使用了Spring 5.3.10版本和MyBatis Spring Boot Starter 2.2.0版本,你可以根据需要选择合适的版本。

步骤二:配置数据源

在Spring整合MyBatis时,我们需要配置数据源。可以使用Spring提供的DataSource接口,也可以使用第三方库(如Druid)提供的数据源。以下是一个使用Spring Boot配置数据源的例子:

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

这里使用了@ConfigurationProperties注解,将spring.datasource前缀的配置属性注入到DataSource中,实现了数据源的配置。

在这里插入图片描述

步骤三:配置MyBatis

在整合过程中,我们还需要配置MyBatis的SqlSessionFactorySqlSessionTemplateSqlSessionFactory是MyBatis的核心接口,负责创建SqlSession对象;SqlSessionTemplate是MyBatis-Spring的核心类,提供了SqlSession的模板化方法。

@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class MyBatisConfig {

    @Autowired
    private DataSource dataSource;

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

在这里,使用@MapperScan注解指定了MyBatis的Mapper接口扫描路径,并注入了DataSource,配置了SqlSessionFactorySqlSessionTemplate

步骤四:创建Mapper接口和XML文件

在整合Spring和MyBatis后,我们可以创建Mapper接口和对应的XML文件,定义SQL语句和数据库操作。以下是一个简单的例子:

// Mapper接口
public interface UserMapper {

    User getUserById(int userId);
}
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.example.entity.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="password" property="password" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="getUserById" resultMap="BaseResultMap">
        SELECT * FROM user WHERE id = #{userId}
    </select>
</mapper>

步骤五:使用Mapper接口

最后,在Service或Controller中注入Mapper接口,并调用其中的方法:

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(int userId) {
        return userMapper.getUserById(userId);
    }
}

通过以上步骤,我们完成了Spring和MyBatis的整合。在实际开发中,可以根据项目的需求进行更灵活的配置和扩展。

拓展:事务管理

在实际项目中,为了保证数据的一致性和完整性,通常会涉及到事务管理。Spring提供了声明式事务管理的方式,通过@Transactional注解可以实现方法级别的事务控制。在整合Spring和MyBatis时,我们可以借助Spring的事务管理,确保数据库操作的原子性。

@Service
@Transactional
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(int userId) {
        return userMapper.getUserById(userId);
    }

    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        // 更新用户信息
        userMapper.updateUser(user);

        // 模拟异常,触发事务回滚
        if (user.getUsername().equals("rollback")) {
            throw new RuntimeException("Rollback!");
        }
    }
}

在上面的例子中,通过@Transactional注解修饰Service类,表示该类的所有方法都将启用事务管理。在updateUser方法中,通过@Transactional(rollbackFor = Exception.class)注解指定了异常回滚的条件,当用户名为"rollback"时,会触发事务回滚。

在这里插入图片描述

通过整合Spring和MyBatis,我们不仅可以充分发挥两者的优势,提高开发效率,还能通过Spring的事务管理确保数据的一致性。希望本文能够对你理解和应用Spring整合MyBatis有所帮助。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机数字电流表数码管显示( proteus仿真+程序+设计报告+讲解视频)

电流表 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 基于51单片机数字电流表数码管显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器…

java游戏制作-王者荣耀游戏

一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”&#xff0c;并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt;import javax.sw…

【陈老板赠书活动 - 18期】-如何成为架构师这几本书推荐给你

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f468;‍&am…

【CCF-PTA】第03届Scratch第02题 -- 计算天数

计算天数 【题目描述】 一年有 365 天还是有 366 天呢&#xff1f;要看这一年是不是闰年。有个计算方法可以帮助我们判断&#xff0c;那就是闰年能够除尽 4 但不能除尽 100 或者能够除尽 400 的年份。如果这一年是闰年&#xff0c;2 月份的天数就是 29 天。小明决定编写一个程…

【神印王座】龙皓晨美妆胜过月夜,魔神皇识破无视,撮合月夜阿宝

Hello,小伙伴们&#xff0c;我是拾荒君。 《神印王座》国漫第82集已更新&#xff0c;拾荒君和大多数人一样&#xff0c;更新就去看了。魔神皇枫秀&#xff0c;威严凛然&#xff0c;突然空降月魔宫&#xff0c;整个宫殿都在这股无与伦比的强大气息中颤栗。为了顺利躲避魔神皇的…

阿里入局鸿蒙!鸿蒙原生应用再添两员新丁

今日HarmonyOS微博称&#xff0c;阿里钉钉、蚂蚁集团旗下的移动开发平台mPaaS与华为达成合作&#xff0c;宣布启动鸿蒙原生应用的开发&#xff01;相关应用将以原生方式适配#HarmonyOS NEXT#系统。 #HarmonyOS#市场或迎来爆发式增长&#xff01; 阿里钉钉 阿里钉钉与华为达成合…

Vue3 响应式数据 reactive使用

ref 与 reactive 是 vue3 提供给我们用于创建响应式数据的两个方法。 reactive 常用于创建引用数据&#xff0c;例如&#xff1a;object、array 等。 reactive 则是通过 proxy 来实现的响应式数据&#xff0c;并配合 reflect 操作的源对象。 reactive 创建引用数据&#xff1…

【LeetCode二叉树进阶题目】606. 根据二叉树创建字符串,102. 二叉树的层序遍历,107. 二叉树的层序遍历 II

二叉树进阶题目 606. 根据二叉树创建字符串解题思路及实现 102. 二叉树的层序遍历解题思路及实现 107. 二叉树的层序遍历 II解题思路及实现 606. 根据二叉树创建字符串 描述 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号…

Altium Designer学习笔记8

创建原理图元件&#xff1a; 画出原理图&#xff1a; 根据规则书画出原理图&#xff1a; 根据规则书画出封装图&#xff1a; 参照&#xff1a; 确认下过孔的内径和外径的最小允许值。

【应用前沿】索托斯平台:个性化推荐变身SaaS 服务

随着互联网技术和人工智能的迅速发展&#xff0c;面对海量的数据和资源&#xff0c;如何快速准确地为每个用户提供其感兴趣的内容&#xff0c;成为我们亟待解决的问题。个性化推荐系统正是为了解决这一问题而诞生的&#xff0c;它能够通过对用户行为的分析和挖掘&#xff0c;为…

Unity地面交互效果——6、地形动态顶点置换和曲面细分

回到目录 Unity置换贴图局部距离曲面细分 大家好&#xff0c;我是阿赵。   这篇文章是我无聊的时候做了一个demo&#xff0c;觉得挺有趣&#xff0c;于是就发上来。这里面包含了4个内容&#xff1a;置换贴图、顶点偏移、局部曲面细分&#xff0c;曲面细分按距离调整强度。 …

【CCF-PTA】第03届Scratch第04题 -- 数字加密

数字加密 【题目描述】 "狼群战术"是第二次世界大战中德军对大西洋上盟军商船所使用的潜艇战术&#xff0c;一度遏制住英国的海上贸易。直到艾伦图灵成功破译了德国的英格尔码密码&#xff0c;成为二战的一个重要转折点。时至今日&#xff0c;图灵仍然是计算机的一…

JavaEE(SpringMVC)期末复习

文章目录 JavaEE期末复习一、单选题&#xff1a; JavaEE期末复习 一、单选题&#xff1a; 1.Spring的核⼼技术是&#xff08; A &#xff09;&#xff1f; A依赖注入 B.JdbcTmplate C.声明式事务 D.资源访问 Spring的核心技术包括依赖注入&#xff08;Dependency Injection&am…

字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,“tan…

Python 基础【四】--数据类型-字符串【2023.11.23】

1 .定义 字符串是 Python 的一种数据类型&#xff0c;它可以通过单引号 ‘、双引号 "、三引号 ‘’’ 或 “”"来定义。 aabcd bacsdcd c"""accsfv""" print(a) print(b) print(c)2 .基本操作 访问单个字符 注意&#xff1a;从0开始…

Python 使用tkinter复刻Windows记事本UI和菜单功能(三)

上一篇&#xff1a;Python 使用tkinter复刻Windows记事本UI和菜单功能&#xff08;二&#xff09;-CSDN博客 下一篇&#xff1a;敬请耐心等待&#xff0c;如发现BUG以及建议&#xff0c;请在评论区发表&#xff0c;谢谢&#xff01; 本文章完成了记事本的新建、保存、另存、打…

API自动化测试:如何构建高效的测试流程

一、引言 在当前的软件开发环境中&#xff0c;API&#xff08;Application Programming Interface&#xff09;扮演了极为重要的角色&#xff0c;连接着应用的各个部分。对API进行自动化测试能够提高测试效率&#xff0c;降低错误&#xff0c;确保软件产品的质量。本文将通过实…

Linux快速显示文件行号并跳转

有时候&#xff0c;想要在线上直接查看日志文件&#xff0c;搜索到关键词后&#xff0c;如果一直按n找下去&#xff0c;很麻烦&#xff0c;我们可以先显示出行号&#xff0c;确定好我们要找内容对应的行号&#xff0c;直接跳转过去。 esc进入命令模式&#xff0c;输入:set nu命…

【工具栏】热部署不生效

目录 配置热部署&#xff1a; 解决热部署不生效&#xff1a; 首先检查&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 配置热部署&#xff1a; https://blog.csdn.net/m0_67930426/article/details/133690559 解决热部署不…

【Java并发】聊聊线程池原理以及实际应用

线程其实对于操作系统来说是宝贵的资源&#xff0c;java层面的线程其实本质还是依赖于操作系统内核的线程进行处理任务&#xff0c;如果频繁的创建、使用、销毁线程&#xff0c;那么势必会非常浪费资源以及性能不高&#xff0c;所以池化技术&#xff08;数据库连接池、线程池&a…