前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【SpringBoot Mybatis系列】MapperMapper接口与Sql绑定几种姿势

【SpringBoot Mybatis系列】MapperMapper接口与Sql绑定几种姿势

作者头像
一灰灰blog
发布于 2022-11-28 12:48:12
发布于 2022-11-28 12:48:12
99200
代码可运行
举报
文章被收录于专栏:小灰灰小灰灰
运行总次数:0
代码可运行

【DB系列】SpringBoot系列Mybatis之Mapper接口与Sql绑定几种姿势

通常我们在使用Mybatis进行开发时,会选择xml文件来写对应的sql,然后将Mapper接口与sql的xml文件建立绑定关系,然后在项目中调用mapper接口就可以执行对应的sql

那么如何将Mapper接口与sql进行绑定呢?本文将介绍四种常见的姿势

  • 默认策略
  • SpringBoot配置参数mybatis.mapper-locations
  • <mapper>指定
  • SqlSessionFactory指定

<!-- more -->

I. 环境准备

1. 数据库准备

使用mysql作为本文的实例数据库,新增一张表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `money` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
  `money` int(26) NOT NULL DEFAULT '0' COMMENT '钱',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

2. 项目环境

本文借助 SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

pom依赖如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

db配置信息 application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password:

II. 实例演示

环境搭建完毕,准备对应的实体类,Mapper接口

1. 实体类,Mapper接口

数据库实体类: MoneyPo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MoneyPo {
    private Integer id;

    private String name;

    private Long money;

    private Integer isDeleted;

    private Timestamp createAt;

    private Timestamp updateAt;
}

一个基础的Mapper接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
public interface MoneyMapper {
	int savePo(@Param("po") MoneyPo po);
}

一个demo service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Repository
public class MoneyRepository {
    private Random random = new Random();

    public void testMapper() {
        MoneyPo po = new MoneyPo();
        po.setName("mybatis user");
        po.setMoney((long) random.nextInt(12343));
        po.setIsDeleted(0);

        moneyMapper.savePo(po);
        System.out.println("add record: " + po);
}

2. sql文件

写sql的xml文件内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.git.hui.boot.mybatis.mapper.MoneyMapper">

    <insert id="savePo" parameterType="com.git.hui.boot.mybatis.entity.MoneyPo" useGeneratedKeys="true"
            keyProperty="po.id">
      INSERT INTO `money` (`name`, `money`, `is_deleted`)
      VALUES
	  (#{po.name}, #{po.money}, #{po.isDeleted});
    </insert>
</mapper>

3. Mapper与Sql绑定

以上为代码层面实现CURD的基础知识,基本上就是mybatis操作的那些套路,没有什么需要特殊注意的;接下来我们进入本文主题

如何告诉mybatis,将上面的MoenyMapper接口与xml文件关联起来

3.1 默认方式

采用默认的绑定方式,不需要我们做额外的操作,重点是需要遵循规则

  • xml的目录结构,与Mapper接口的包路径完全一致
  • xml文件名与Mapper接口名完全一致(注意大小写都要完全一致)

请注意上面的另个完全一致

使用默认的方式进行绑定时,一个示例如上图;特别需要注意的是文件名的大小写,xml文件的目录层级都需要完全一致

如果使用上面这种方式,在执行时,依然提示有问题,排查的思路就是查看 target目录下生成的class文件与xml文件是否在一起,如下图就是正常的case

再次说明

  • 基于上面的case,我们可以直接将xml文件,与mapper接口写在一起,不放在资源路径resources下面
3.2 SpringBoot配置

SpringBoot提供了一个简单的配置,来指定Mapper接口与sql的绑定,一行配置即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mybatis:
  mapper-locations: classpath:sqlmapper/*.xml

使用这种方式就比较简单了,不要求xml文件与Mapper接口文件名一致;也没有指定路径层级一致

3.3 Mapper标签

mapper标签,需要放在mybatis的配置文件中,因此我们首先通过SpringBoot的配置参数指定文件路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mybatis:
  configuration:
    config-location: classpath:mybatis-config.xml

在资源文件下,新建文件 mybatis-config.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//ibatis.apache.org//DTD Config 3.1//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <mappers>
        <mapper resource="sqlmapper/money-mapper.xml"/>
    </mappers>
</configuration>

通过上面的mapper标签来指定注册关系,也是可行的,详情可参考官方文档 !

https://mybatis.org/mybatis-3/configuration.html#mappers

3.4 SqlSessionFactory

在前面一篇介绍Mapper接口注册的博文中,就介绍了通过qlSessionFactory+ MapperScannerConfigurer来注册

这里也是可以通过SqlSessionFactory来指定xml文件的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    bean.setMapperLocations(
            // 设置mybatis的xml所在位置,这里使用mybatis注解方式,没有配置xml文件
            new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/*.xml"));
    // 注册typehandler,供全局使用
    bean.setTypeHandlers(new Timestamp2LongHandler());
    bean.setPlugins(new SqlStatInterceptor());
    return bean.getObject();
}

4. 小结

本文主要介绍了四种Mapper接口与sql文件关系绑定的姿势,了解几种不同的姿势的特点,在实际的项目开发中,选择一个即可

  • 默认:在resource资源目录下,xml文件的目录层级与Mapper接口的包层级完全一致,且xml文件名与mapper接口文件名也完全一致
    • 如mapper接口: com.git.hui.boot.mybatis.mapper.MoneyMapper
    • 对应的xml文件: com/git/hui/boot/mybatis/mapper/MoneyMapper.xml
  • springboot配置参数:
    • application.yml配置文件中,指定 mybatis.mapper-locations=classpath:sqlmapper/*.xml
  • mybatis-config配置文件
    • 这种姿势常见于非SpringBoot项目集成mybatis,通常将mybatis的相关配置放在 mybatis-config.xml 文件中
    • 首先在配置文件中,指定加载参数 mybatis.config-location=classpath:mybatis-config.xml
    • 然后指定映射器 <mappers><mapper resource="sqlmapper/money-mapper.xml"/></mappers>
  • SqlSessionFactory指定
    • 直接在SqlSessionFactory中指定即可Mapper文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置mybatis的xml所在位置,这里使用mybatis注解方式,没有配置xml文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/*.xml"));

除了上面几种方式之外,mybatis还支持无xml的方式,完全依靠注解来实现sql的拼装,因此也就不存在映射关系绑定了,关于注解的case,可以参考博文 【DB系列】Mybatis+注解整合篇

III. 不能错过的源码和相关知识点

0. 项目

mybatis系列博文

1. 一灰灰Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
SpringBoot项目中借助Mybatis来操作数据库,对大部分java技术栈的小伙伴来说,并不会陌生;我们知道,使用mybatis,一般会有下面几个
一灰灰blog
2021/07/29
7020
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
SpringBoot项目中借助Mybatis来操作数据库,对大部分java技术栈的小伙伴来说,并不会陌生;我们知道,使用mybatis,一般会有下面几个
一灰灰blog
2021/07/26
1K0
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
SpringBoot 系列教程 Mybatis+xml 整合篇
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
一灰灰blog
2020/02/11
9820
SpringBoot 系列教程 Mybatis+xml 整合篇
【SpringBoot DB 系列】Mybatis 基于 AbstractRoutingDataSource 与 AOP 实现多数据源切换
前面一篇博文介绍了 Mybatis 多数据源的配置,简单来讲就是一个数据源一个配置指定,不同数据源的 Mapper 分开指定;本文将介绍另外一种方式,借助AbstractRoutingDataSource来实现动态切换数据源,并通过自定义注解方式 + AOP 来实现数据源的指定
一灰灰blog
2021/01/20
9760
【SpringBoot DB 系列】Mybatis 基于 AbstractRoutingDataSource 与 AOP 实现多数据源切换
SpringBoot系列Mybatis之参数传递的几种姿势
在 mybatis 的日常开发中,mapper 接口中定义的参数如何与 xml 中的参数进行映射呢?除了我们常用的@Param注解之外,其他的方式是怎样的呢?
一灰灰blog
2021/09/25
1.9K0
SpringBoot + Mybatis系列之插件机制 Interceptor
在 Mybatis 中,插件机制提供了非常强大的扩展能力,在 sql 最终执行之前,提供了四个拦截点,支持不同场景的功能扩展
一灰灰blog
2021/08/09
5.5K0
SpringBoot + Mybatis系列之插件机制 Interceptor
史上最详细mybatis与spring整合教程
mybatis本身使用比较灵活,和spring整合也有多种方式。本文一网打尽mybatis与spring整合所有方式,让你彻底掌握mybatis与spring整合原理,堪称史上最全面的mybatis与spring整合教程。内容较多,可以先收藏,耐心看完,必定有所收获。
田守枝
2019/05/21
3.6K0
史上最详细mybatis与spring整合教程
【SpringBoot DB系列】Mybatis多数据源配置与使用
上一篇博文介绍 JdbcTemplate 配置多数据源的使用姿势,在我们实际的项目开发中,使用 mybatis 来操作数据库的可能还是非常多的,本文简单的介绍一下 mybatis 中,多数据源的使用姿势
一灰灰blog
2021/01/20
4010
【SpringBoot DB系列】Mybatis多数据源配置与使用
SpringBoot 系列教程 Mybatis+注解整合篇
上一篇博文介绍了 SpringBoot 整合 mybatis 的过程,但是 xml 的方式,总感觉让人有点蛋疼;本文将介绍一种 noxml 的使用姿势,纯用注解的方式来支持 CURD
一灰灰blog
2020/01/15
4690
SpringBoot 系列教程 Mybatis+注解整合篇
MyBatis快速入门
这部分内容不是很多,主要在于具体的应用,之后会针对痛点持续更新。 概念 相对于全自动映射框架Hibernate,MyBatis是一个半自动映射框架,其需要提供的映射文件需要三部分:SQL、映射规则
用户1216676
2018/01/24
8560
SpringBoot系列 Mybatis 之自定义类型转换 TypeHandler
在使用 mybatis 进行 db 操作的时候,我们经常会干的一件事情就是将 db 中字段映射到 java bean,通常我们使用ResultMap来实现映射,通过这个标签可以指定两者的绑定关系,那么如果 java bean 中的字段类型与 db 中的不一样,应该怎么处理呢?
一灰灰blog
2021/08/09
2.9K0
SpringBoot系列 Mybatis 之自定义类型转换 TypeHandler
【SpringBoot DB 系列】Mybatis-Plus 多数据源配置
前面介绍了两种 Mybatis 的数据源配置,当然也少不了 mybatis-plus
一灰灰blog
2021/01/17
8.2K0
【SpringBoot DB 系列】Mybatis-Plus 多数据源配置
【SpringBoot DB 系列】Mybatis基于AbstractRoutingDataSource与AOP实现多数据源切换
前面一篇博文介绍了 Mybatis 多数据源的配置,简单来讲就是一个数据源一个配置指定,不同数据源的 Mapper 分开指定;本文将介绍另外一种方式,借助AbstractRoutingDataSource来实现动态切换数据源,并通过自定义注解方式 + AOP 来实现数据源的指定
一灰灰blog
2021/01/17
9790
【SpringBoot DB 系列】Mybatis基于AbstractRoutingDataSource与AOP实现多数据源切换
SpringBoot系列教程JPA之指定id保存
原文链接: 191119-SpringBoot系列教程JPA之指定id保存 前几天有位小伙伴问了一个很有意思的问题,使用 JPA 保存数据时,即便我指定了主键 id,但是新插入的数据主键却是 mysq
一灰灰blog
2019/11/21
3.1K0
SpringBoot系列教程JPA之update使用姿势
原文: 190623-SpringBoot系列教程JPA之update使用姿势 上面两篇博文拉开了jpa使用姿势的面纱一角,接下来我们继续往下扯,数据插入db之后,并不是说就一层不变了,就好比我在
一灰灰blog
2019/07/02
2.3K0
SpringBoot系列教程JPA之update使用姿势
SpringBoot Starter 作用及原理
本文会以 mybatis 为例,通过对比 mybatis-spring 和 mybatis-spring-boot-starter 代码示例,了解 Starter 的作用。并对 mybatis-spring-boot-starter 进行简单剖析,了解 Starter 原理。
王二蛋
2024/04/29
2130
mybatis 详解(十一)------ mybatis和spring整合
IT可乐
2018/01/04
9780
mybatis 详解(十一)------ mybatis和spring整合
浅谈Mybatis持久化框架在Spring、SSM、SpringBoot整合的演进及简化过程
最近开始了SpringBoot相关知识的学习,作为为目前比较流行、用的比较广的Spring框架,是每一个Java学习者及从业者都会接触到一个知识点。作为Spring框架项目,肯定少不了与数据库持久层的整合。我们在学习Java初始就被灌输SSM框架(Spring、SpringMVC、Mybatis),我们大概也只是知道Mybatis是与数据库打交道的,但这也只是名词上的理解。
Java_老男孩
2020/08/11
5690
SpringBoot 系列教程 MybatisPlus 整合篇
前面介绍了 SpringBoot 整合 Mybatis 实现 db 的增删改查操作,分别给出了 xml 和注解两种实现 mapper 接口的方式;虽然注解方式干掉了 xml 文件,但是使用起来并不优雅,本文将介绍 mybats-plus 的使用 case,简化常规的 CRUD 操作
一灰灰blog
2020/01/15
6350
SpringBoot 系列教程 MybatisPlus 整合篇
【SpringBoot DB系列】Mybatis多数据源配置与使用
上一篇博文介绍 JdbcTemplate 配置多数据源的使用姿势,在我们实际的项目开发中,使用 mybatis 来操作数据库的可能还是非常多的,本文简单的介绍一下 mybatis 中,多数据源的使用姿势
一灰灰blog
2021/01/17
1.5K0
【SpringBoot DB系列】Mybatis多数据源配置与使用
推荐阅读
相关推荐
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验