Mybatis详解(2)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 你好看官,里面请!今天笔者讲的是 Mybatis详解(2)。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。

Mybatis详解(2)

如果觉得写的还可以,点个赞支持一下笔者呗!你的点赞和关注会让我更快更新哦。笔者会持续更新关于Java和大数据有关的文章。目前集中精力在更新java框架的内容。

1.1 整合 MyBatis

我们想要使用 MyBatis 首先需要添加对 MyBatis 的依赖。Spring Boot 向来以简单快速的特点行走江湖,在整合 MyBatis 的时候也依然遵循着这一原则,只需引入 MyBatis 相关的 starter 即可,具体如下:

添加依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>

当然,我们使用的数据库为 MySQL ,我们也需要引入 MySQL 的相关依赖(在 JPA 那一小节就已经接触过了)。

数据库配置

接下来,我们需要配置一下数据库的相关信息。在 application.yml 文件中添加如下配置:

#数据源配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456

配置项:

  • url:连接数据库的地址
  • driver-class-name:连接数据库的驱动
  • username:数据库的用户名
  • password:数据库的密码

简单介绍一下 url 中的几个参数:

  • characterEncoding:字符集,指的是程序与 MySQL 交互时所使用的字符集,我们使用 utf8
  • useSSL:用来指定是否启用 SSL ,我们这里设置为不启用
  • serverTimezone:时区,如果不指定,在使用 6.x 以后版本的驱动时会出现一些问题,我们设置为 Asia/Shanghai

交给国家(Spring)

我们知道,MyBatis 是用 Mapper 接口将我们的程序与一系列持久化操作串联起来的。对 Spring 有了解的同学都知道,如果想要把工作交给 Spring 来进行统一管理,那么就需要让 Spring 知道它的存在,也就是让 Spring 扫描到它。因此,我们需要在我们的项目的主类中加上一个注解 —— @MapperScan ,用来扫描 MyBatis 的 Mapper。括号中填入 Mapper 所在的包路径,具体如下:

....
@MapperScan("com.imooc.springboot.mybatis.mapper")
public class SpringbootApplication {
    ....
}

PS:如果我们不使用 @MapperScan 这个注解,那么就需要在每个 Mapper 接口上加上 @Mapper,这样显然比较麻烦。

1.2 使用 MyBatis

我们了解到 JPA 是以 Java Entity 为原点,通过实体类来映射表之间的关系(可以通过 Java 实体类来生成对应的表结构和表关系);而 MyBatis 则是以数据库(表)为原点,它跟 JPA 是一种互逆的关系,这样看来 MyBatis 应该具备通过数据库(表)生成实体类的能力。没错,MyBatis 为我们提供了一个很好用的工具 —— MyBatis Generator,简称 MBG(总觉得这个缩写怪怪的)。

创建表结构

我们可以通过下面的建表语句来创建我们的 User 表,当然你也可以直接将 JPA 那一节根据实体类生成的 User 表直接拿来用。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `birth_day` timestamp NULL DEFAULT NULL COMMENT '生日',
  `email` varchar(255) DEFAULT NULL COMMENT '邮件',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息';

配置 MBG

有了表,我们还需要对 MBG 进行一下简单的配置。MBG 有多种使用方式 —— 命令行、Ant、Java、Eclipse plugin 和 Maven plugin。我们选择 Maven plugin 的方式,因为简单且直观。

首先我们在 pom.xml 文件中添加对于 MBG 的依赖,将如下代码放到 标签下即可。

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.7</version>
    <configuration>
        <configurationFile>
            ${basedir}/src/main/resources/generatorConfig.xml
        </configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
    </dependencies>
</plugin>

然后,我们在 src/main/resources 目录下创建一个名为 generatorConfig.xml 的配置文件,在该文件中填写相应的配置即可(代码就不帖出来了,可以到源码中去看,里面有详细的注释)。

到此,MBG 就配置完成了,接下来我们就可以根据我们刚刚创建的 User 表来生成我们的实体以及 dao 层的方法了。

在 IDEA 的右侧有一个 Maven Projects 的选项卡(如果没有,可以在菜单中的 view ==》Tool Windows 中找到),点击会弹出如下视图:

网络异常,图片无法展示
|

找到 mybatis-generator 展开后,双击 mybatis-generator:generate 运行即可。看到类似如下信息,则代表成功生成了我们的实体以及 dao 。

[INFO] --- mybatis-generator-maven-plugin:1.3.7:generate (default-cli) @ mybatis ---
[INFO] Connecting to the Database
[INFO] Introspecting table user
[INFO] Generating Example class for table user
[INFO] Generating Record class for table user
[INFO] Generating Mapper Interface for table user
[INFO] Generating SQL Map for table user
[INFO] Saving file UserMapper.xml
[INFO] Saving file UserExample.java
[INFO] Saving file User.java
[INFO] Saving file UserMapper.java

运行完成以后,可以在 Project 视图下看到生成的文件 ——UserMapper、User、UserExample 和 UserMapper.xml

网络异常,图片无法展示
|

打开 UserMapper 接口,可以看到 MBG 帮我们生成了我们常用的增删改查以及统计接口:

网络异常,图片无法展示
|

接口对应的实现在 UserMapper.xml 中,代码就不贴了,可以去源码中查看。

下面我们就可以试一试 MBG 帮我们生成的这些代码好不好用了,我们直接在 Controller 层调用 Mapper 接口(实际开发时需要借助 Service),实现一下基本的 CRUD 方法:

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @GetMapping("/{id}")
    public User get(@PathVariable int id) {
        return userMapper.selectByPrimaryKey(id);
    }
    @PostMapping
    public int create(@RequestBody User user) {
        return userMapper.insert(user);
    }
    @PutMapping
    public int update(@RequestBody User user) {
        return userMapper.updateByPrimaryKey(user);
    }
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Integer id) {
        userMapper.deleteByPrimaryKey(id);
    }
}

写完代码,我们启动工程,然后可以去 Swagger 上面测试一下。

2. 动态 SQL

有时候,静态的 SQL 语句并不能满足应用程序的需求。我们可以根据一些条件,来动态地构建 SQL 语句。例如,在 Web 应用程序中, 比如有一些查询功能,需要根据一个或多个条件查询数据,然后根据具体传来的查询参数动态生成查询的 SQL 去数据库取数据。在实现这种类型的查询功能时,静态 SQL 就无法满足了。我们需要根据参数来构建动态的 SQL 语句,将用户提供的参数添加到 SQL 语句的 WHERE 子句中。

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC ,那么你很可能已经体会过拼接 SQL 所带来的痛苦了。经常会遇到少了空格,或者多了逗号之类的语法错误。MyBatis 的动态 SQL 将为我们彻底解决这类问题。

MyBatis 采用功能强大的基于 OGNL 的表达式来实现动态 SQL。下面介绍几个我们日常开发中经常会用到的标签:

  • if
  • choose (when, otherwise)
  • where (trim, set)
  • foreach

2.1 if

if 标签很简单,用法跟 Java 中的 if 一样,条件为 true 则执行,为 false 则跳过,看一个小例子:

<select id="findUser" resultType="User">
  SELECT * FROM USER
  WHERE 1=1
  <if test="name != null">
    AND name like #{name}
  </if>
  <if test="email != null">
    AND email = #{email}
  </if>
</select>

2.2 choose

choose 标签类似 Java 中的 switch…case…default 语法,if 是二选一,而 choose 则是多选一,如果条件都不符合则选择最后 otherwise。具体见下面的代码:

<select id="findUserByIdOrName" resultType="User">
  SELECT * FROM USER WHERE 1=1
  <choose>
    <when test="id != null">
      AND id = #{id}
    </when>
    <when test="name != null">
      AND name like #{name}
    </when>
    <otherwise>
      AND 0 = 1
    </otherwise>
  </choose>
</select>

2.3 where

细心的你可能已经发现了,在上面的例子中,where 后面都有一个 1=1 的条件,这种写法在以前我们手动拼接 SQL 的时候经常用(其实是一种无奈之举),MyBatis 中的 where 标签替我们消除了这一问题。只有当 where 中至少有一个条件符合时,MyBatis 才会为我们拼接 where 子句,并且会帮我们妥善的处理开头和结尾,如下面的例子,如果第一个条件不成立,拼接后的结果为:SELECT * FROM USER WHERE email= ?。

<select id="findUser" resultType="User">
  SELECT * FROM USER
  <where>
      <if test="name != null">
        name like #{name}
      </if>
      <if test="email != null">
        AND email = #{email}
      </if>
  </where>
</select>

2.4 foreach

看到 foreach 这个标签,我想聪明的你不用我说也想到了,它就相当于 Java 中的 for。一点没错!下面通过一个根据 id 集合查询的例子吧:

<select id="findUser" resultType="User">
  SELECT * FROM USER
  <where>
      id in
    <foreach open="(" separator="," close=")" collection="list" item="id">
      #{id}
    </foreach>
  </where>
</select>

3. 小结

OK,本小节我们一起学习了 MyBatis 的使用。包括与 Spring Boot 整合,代码生成插件 MBG 的配置及使用,还通过几个实例学习了 MyBatis 的一个强大功能 —— 动态 SQL。MyBatis 动态 SQL 的使用是非常重要的,日常开发中,我们经常会用到。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
SQL Java 数据库连接
MyBatis大全
MyBatis大全
38 0
|
10月前
|
Java 数据库连接 mybatis
|
3天前
|
SQL 算法 Java
MyBatis-Plus详解(3)
MyBatis-Plus详解(3)
10 0
|
3天前
|
SQL Java 关系型数据库
MyBatis-Plus详解(4)
MyBatis-Plus详解(4)
6 0
|
2月前
|
Java 数据库连接 数据库
mybatis的@MappedTypes
mybatis的@MappedTypes
71 1
|
2月前
|
SQL 缓存 Java
|
8月前
|
SQL Java 关系型数据库
mybatis plus很好,但是我被它坑了!
作者今天在开发一个后台发送消息的功能时,由于需要给多个用户发送消息,于是使用了 mybatis plus 提供的 saveBatch() 方法,在测试环境测试通过上预发布后,测试反应发送消息接口很慢得等 5、6 秒,于是我就登录预发布环境查看执行日志,发现是 mybatis plus 提供的 saveBatch() 方法执行很慢导致,于是也就有了本篇文章。
41 1
|
7月前
|
Java 数据库连接 测试技术
mybatis中@Many
mybatis中@Many
63 0
|
10月前
|
SQL Java 数据库连接
|
11月前
|
SQL Java 数据库连接
MyBatis(下)
MyBatis(下)

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    26
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    24
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    20
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19