深入解析Spring Boot集成MyBatis的多种方式

文章目录

    • 1. 引言
    • 2. 传统的XML配置方式
      • 2.1 引入依赖
      • 2.2 配置数据源和MyBatis
      • 2.3 编写Mapper接口和XML映射文件
      • 2.4 使用Mapper
    • 3. 注解配置方式
      • 3.1 引入依赖
      • 3.2 配置数据源和MyBatis
      • 3.3 编写Mapper接口
      • 3.4 使用Mapper
    • 4. MyBatis动态SQL
      • 4.1 使用XML配置方式
      • 4.2 使用注解配置方式
    • 5. MyBatis的插件机制
    • 6. 性能优化与拓展
      • 6.1 缓存机制
      • 6.2 批量操作
      • 6.3 多数据源配置
    • 7. 总结

在这里插入图片描述

🎉欢迎来到架构设计专栏~深入解析Spring Boot集成MyBatis的多种方式


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

1. 引言

Spring Boot作为一款快速开发、简化配置的框架,与MyBatis的结合使用是开发中常见的组合。本文将深入探讨Spring Boot集成MyBatis的多种方式,包括XML配置、注解配置以及MyBatis的动态SQL等,通过实例代码和详细解释,帮助读者选择适合自己项目的集成方式。
在这里插入图片描述

2. 传统的XML配置方式

2.1 引入依赖

首先,在pom.xml文件中添加MyBatis和数据库驱动的依赖:

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

    <!-- 数据库驱动 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2.2 配置数据源和MyBatis

application.propertiesapplication.yml中配置数据源和MyBatis:

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  h2:
    console:
      enabled: true
  mybatis:
    mapper-locations: classpath:/mapper/*.xml

在上述配置中,spring.datasource用于配置数据源,mybatis.mapper-locations指定了MyBatis的XML映射文件的位置。

2.3 编写Mapper接口和XML映射文件

创建一个User实体类:

public class User {
    private Long id;
    private String username;
    private String password;
    // 省略getter和setter
}

创建一个UserMapper接口:

public interface UserMapper {
    User selectUserById(Long id);
    void insertUser(User user);
}

编写UserMapper的XML映射文件UserMapper.xml

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

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

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

    <insert id="insertUser">
        INSERT INTO user (username, password) VALUES (#{username}, #{password})
    </insert>

</mapper>

2.4 使用Mapper

在Service或Controller中使用UserMapper:

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.selectUserById(id);
    }

    public void createUser(User user) {
        userMapper.insertUser(user);
    }
}

这样,通过XML配置方式,我们完成了Spring Boot与MyBatis的集成。

3. 注解配置方式

3.1 引入依赖

同样,在pom.xml文件中添加MyBatis和数据库驱动的依赖:

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

    <!-- 数据库驱动 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

3.2 配置数据源和MyBatis

application.propertiesapplication.yml中配置数据源和MyBatis:

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  h2:
    console:
      enabled: true
  mybatis:
    mapper-locations: classpath:/mapper/*.xml

3.3 编写Mapper接口

创建一个UserMapper接口,并使用注解配置SQL语句:

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectUserById(Long id);

    @Insert("INSERT INTO user (username, password) VALUES (#{username}, #{password})")
    void insertUser(User user);
}

3.4 使用Mapper

在Service或Controller中使用UserMapper:

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.selectUserById(id);
    }

    public void createUser(User user) {
        userMapper.insertUser(user);
    }
}

通过注解配置方式,我们实现了Spring Boot与MyBatis的集成,使得Mapper接口的SQL语句更加直观。

4. MyBatis动态SQL

4.1 使用XML配置方式

动态SQL是MyBatis的一个强大特性,可以根据不同条件拼接SQL语句,从而实现更加灵活的查询。下面是一个简单的例子,使用MyBatis的动态SQL:

<!-- UserMapper.xml -->

<mapper namespace="com.example.mapper.UserMapper">

    <select id="selectUsersByCondition" parameterType="java.util.Map" resultType="com.example.entity.User">
        SELECT * FROM user
        <where>
            <if test="username != null">
                AND username = #{username}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>

</mapper>

在上述代码中,我们使用<where>标签包裹条件判断,通过<if>标签判断是否需要拼接对应的条件语句。

4.2 使用注解配置方式

通过注解配置方式使用动态SQL:

// UserMapper.java

@Mapper
public interface UserMapper {

    @SelectProvider(type = UserSqlProvider.class, method = "selectUsersByCondition")
    List<User> selectUsersByCondition(Map<String, Object> condition);
}
// UserSqlProvider.java

public class UserSqlProvider {

    public String selectUsersByCondition(Map<String, Object> condition) {
        return new SQL() {{
            SELECT("*");
            FROM("user");
            if (condition.get("username") != null) {
                WHERE("username = #{username}");
            }
            if (condition.get("age") != null) {
                WHERE("age = #{age}");
            }
        }}.toString();
    }
}

在上述代码中,通过@SelectProvider注解指定了使用的Provider类和方法,Provider类中动态生成SQL语句。

5. MyBatis的插件机制

MyBatis提供了插件机制,可以通过插件对SQL的执行过程进行干预和增强。以下是一个简单的插件示例:

// MyPlugin.java

@Intercepts({
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class MyPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 在原方法执行前进行处理
        System.out.println("Before update...");

        // 调用原方法
        Object result = invocation.proceed();

        // 在原方法执行后进行处理
        System.out.println("After update...");

        return result;
    }

    @Override
    public Object plugin(Object target) {
        // 将插件应用到Executor对象上
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 设置插件属性
    }
}

在上述代码中,通过@Intercepts@Signature注解指定了拦截的方法和参数类型,实现了Interceptor接口。在intercept方法中可以对原方法进行干预,plugin方法将插件应用到目标对象上。

6. 性能优化与拓展

6.1 缓存机制

MyBatis提供了一级缓存和二级缓存两种缓存机制。一级缓存是SqlSession级别的缓存,而二级缓存是Mapper级别的缓存。在需要优化查询性能时,可以考虑使用MyBatis的缓存机制。

6.2 批量操作

MyBatis支持批量插入、更新和删除操作,通过批量操作可以减少数据库交互次数,提高性能。

6.3 多数据源配置

在实际项目中,可能会遇到需要连接多个数据源的情况。Spring Boot和MyBatis提供了多数据源的支持,可以通过配置多个DataSourceSqlSessionFactory来实现。

7. 总结

本文深入解析了Spring Boot集成MyBatis的多种方式,包括XML配置、注解配置以及MyBatis的动态SQL等。通过实例代码和详细解释,读者能够更好地理解这些集成方式的使用场景和优劣。同时,了解了MyBatis的插件机制、缓存机制以及一些性能优化的方法。在实际项目中,根据具体需求选择合适的集成方式和优化策略,能够更好地发挥Spring Boot和MyBatis的优势,提升开发效率和系统性能。


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

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

在这里插入图片描述

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

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

相关文章

KaiwuDB 获评信通院 2023 大数据“星河”标杆案例

12月6日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601) 共同组织的 2023 大数据“星河(Galaxy)”案例评选结果正式公示&#xff0c;“基于 KaiwuDB 的台区云储能示范项目”历经多环节严苛评审&#xff0c;从累计 706 份申报项目中…

sql宽字节注入

magic_quotes_gpc&#xff08;魔术引号开关&#xff09; https://www.cnblogs.com/timelesszhuang/p/3726736.html magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据&#xff0c;如包括有&#xff1a;post、get、cookie过来的数据增加转义字符“\”&#xff0c;以…

HarmonyOS4.0从零开始的开发教程15HTTP数据请求

HarmonyOS&#xff08;十三&#xff09;HTTP数据请求 1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富…

谈谈spring中AOP

概述 在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方 式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中…

基于SSM的影视企业全渠道会员管理系统(有报告)。Javaee项目

演示视频&#xff1a; 基于SSM的影视企业全渠道会员管理系统&#xff08;有报告&#xff09;。Javaee项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring S…

MAMOS蓝图: 打造自己的质量工程

针对团队中存在的问题&#xff0c;构造MAMOS蓝图&#xff0c;从而以系统化的方式识别并解决问题。本文将针对减少等待时间这一问题举例说明MAMOS蓝图的组成和使用方式。原文: MAMOS Blueprint: Build your own for Quality at Speed 很难完全摆脱等待时间。 我认为没有必要争论…

【人工智能革命】:AIGC时代的到来 | 探索AI生成内容的未来

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. AIGC 技术的概述和发展趋势1.1 AIGC 技术的概述1.2 AIGC 技术的发展趋势 二. AIGC 与元宇…

养娃难可求助亲戚的UML建模-UMLChina建模知识竞赛第4赛季第26轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者…

指针运算笔试题解析

题目一 #include <stdio.h>int main(){int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0;}// 程序的结果是什么&#xff1f; 答案中显示第一个是2&#xff0c;第二个是5 咱们先来解释一下第一个答…

【Linux】信号--信号的捕捉/可重入函数/volatile/SIGCHLD信号

文章目录 一、信号的捕捉1.用户态和内核态2.内核如何实现信号的捕捉3.sigaction 二、可重入函数三、volatile四、SIGCHLD信号 一、信号的捕捉 1.用户态和内核态 用户态的的时候&#xff0c;进行以下操作&#xff1a;1.操作系统自身的资源(getpid,waitpid…)2.硬件资源(printf…

YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)

一、本文介绍 本文给大家带来的CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法&#xff08;就是我们的Upsample&#xff09;的性能。CARAFE的核心思想是&#xff1a;使用…

低代码优缺点的那些事

什么是低代码 低代码是一种软件开发方法,旨在通过使用可视化工具和组件库来简化应用程序开发。低代码平台提供了一种快速开发应用程序的方式,无需编写大量的代码。开发人员可以使用拖放界面和预构建组件来构建应用程序,从而加快开发速度和降低开发成本。低代码平台通常也提…

【LeetCode刷题笔记】155.最小栈

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

震惊,PDF文件转换已不再不是问题?

你是否曾经因为PDF文件的格式问题而感到困扰&#xff1f;是否曾经因为无法快速转换PDF文件而感到烦恼&#xff1f; 现在&#xff0c;这些问题都可以迎刃而解了&#xff01;下面这个在线PDF转换网站&#xff0c;就是你的解决方案。 目前5M以下文件免费转换&#xff0c;赶紧来看…

linux笔记--VSCode利用交换机跳转服务器

目录 1--前言 2--VSCode设置 3--ssh连接 1--前言 博主学校的服务器有两个&#xff0c;其中一个服务器&#xff08;14&#xff09;可以通过挂内网VPN来进行连接&#xff0c;但另一个服务器&#xff08;15&#xff09;即使挂了VPN也不能连接&#xff0c;只能通过内网进行连接。…

【机器学习】应用KNN实现鸢尾花种类预测

目录 前言 一、K最近邻&#xff08;KNN&#xff09;介绍 二、鸢尾花数据集介绍 三、鸢尾花数据集可视化 四、鸢尾花数据分析 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Fil…

MySQL 系列:注意 ORDER 和 LIMIT 联合使用的陷阱

文章目录 前言背后的原因ORDER BY 排序列存在相同值时返回顺序是不固定的LIMIT 和 ORDER BY 联合使用时的行为ORDER BY 或 GROUP BY 和 LIMIT 联合使用优化器默认使用有序索引 如何解决其它说明个人简介 前言 不知道大家在在分页查询中有没有遇到过这个问题&#xff0c;分页查…

三、JS逆向

一、JS逆向 解释&#xff1a;在我们爬虫的过程中经常会遇到参数被加密的情况&#xff0c;这样只有先在前端搞清楚加密参数是怎么生成的才能继续我们的爬虫&#xff0c;而且此时我们还需要用python去执行这个加密的过程。本文主要讲怎么在浏览器调试JS&#xff0c;以及Python执…

【数据结构和算法】--队列的特殊结构-循环队列

目录 循环队列的结构循环队列的实现循环队列的创建循环队列为空判断循环队列为满判断入队出队返回循环队列首元素返回循环队列尾元素释放循环队列 循环队列的结构 循环队列是队列的一种特殊结构&#xff0c;它的长度是固定的k&#xff0c;同样是先进先出&#xff0c;理论结构是…

PHP是世界上最好的语言-PolarDN XXF无参数RCE QUERY_STRING 特性

这个靶场我之前看到过打广告&#xff0c;而且感觉比较新 来坐坐 <?php //flag in $flag highlight_file(__FILE__); include("flag.php"); $c$_POST[sys]; $key1 0; $key2 0; if(isset($_GET[flag1]) || isset($_GET[flag2]) || isset($_POST[flag1]) || isset…