MyBatis:使用MyBatis Generator快速完成Springboot项目数据层开发

2023-05-16

使用场景

当我们使用Springboot整合Mybatis时,我们就需要为数据库中的每一个表分别写出:

  • 实体类
  • Mapper.xml文件
  • Mapper接口

如果数据库中有很多表,这个过程就会非常的繁琐。而MyBatis官方为我们提供了MyBatis Generator插件,我们只需要以下介绍的三个步骤就可以快速地生成以上三个文件,极大的简化了数据层的开发。

官网:MyBatis Generator

项目准备

以下用一个例子来演示如何在项目中使用MyBatis Generator,项目使用的环境为:

  • ubuntu 18.04
  • maven 3.6.3
  • JDK 11

项目中使用的表如图所示

使用方法

1. 引入mybatis的依赖和MyBatis Generator插件

在pom.xml文件中加入以下两个部分

mybatis的依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>

MyBatis Generator插件:

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.0</version>
    <configuration>
        <overwrite>true</overwrite>
    </configuration>
</plugin>

2. MyBatis Generator 的配置文件

MyBatis Generator配置文件默认的路径为

${basedir}/src/main/resources/generatorConfig.xml

所以我们在 recources 文件夹下新建 generatorConfig.xml 文件(如果希望保存在其他路径可以在导入插件时使用 configurationFile 标签来更改),配置文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- JDBC 驱动的路径,需要自己配置 -->
    <classPathEntry location="/home/XXX/.m2/repository/mysql/mysql-connector-java/8.0.21/mysql-connector-java-8.0.21.jar" />

    <context id="table" targetRuntime="MyBatis3">

        <!-- 不加注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/db?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"
                        userId="root"
                        password="1">
            <!-- mysql8.x需要这一行 -->
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>

        <!-- 实体类 -->
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- Mapper.xml文件 -->
        <sqlMapGenerator targetPackage="com.example.mapper"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- Mapper接口文件 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <table schema="db" tableName="student" domainObjectName="Student" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false" />

    </context>
</generatorConfiguration>

配置文件需要注意的地方有以下几点:

  1. 通过 targetPackage 和 targetProject 配置生产成的实体类、Mapper.xml文件、Mapper接口的位置。
  2. 通过table标签可以用来指定数据库、表以及表对应的实体类名称

3. 运行 Mybatis Generator

在 Maven 标签下双击 generate 就可以生成对应的文件

 可以看到相应的目录之下出现了生成的文件

文件细节

打开 StudentMapper 接口,里面一共自动生成了六种方法

public interface StudentMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Student record);

    int insertSelective(Student record);

    Student selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Student record);

    int updateByPrimaryKey(Student record);
}

insert 方法和 insertSelective 方法有什么区别呢?

打开 StudentMapper.xml 文件可以看到 insertSelective 方法下用了动态SQL

(如果不记得动态SQL可以看一下这篇博客 MyBatis:使用动态SQL简化代码)

<insert id="insert" parameterType="com.example.model.Student">
    insert into student (id, name, score, 
      birthday)
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{score,jdbcType=REAL}, 
      #{birthday,jdbcType=DATE})
  </insert>
  <insert id="insertSelective" parameterType="com.example.model.Student">
    insert into student
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="name != null">
        name,
      </if>
      <if test="score != null">
        score,
      </if>
      <if test="birthday != null">
        birthday,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="score != null">
        #{score,jdbcType=REAL},
      </if>
      <if test="birthday != null">
        #{birthday,jdbcType=DATE},
      </if>
    </trim>
  </insert>

从以上代码中可以看出 insertSelective 方法只添加传入了参数的字段,而 insert 添加所有的字段,如果字段有默认值,使用insert 方法就会出错。

这种使用动态SQL的方式我们平时在写代码的时候也可以使用起来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis:使用MyBatis Generator快速完成Springboot项目数据层开发 的相关文章

随机推荐

  • ATM管理者操作界面

    ATM界面 import java util Scanner public class AccountView private AccountManger am 61 new AccountManger public void regist
  • Java类的操作

    银行账户类 package com github Mrtiang public class Account 创建账户属性 private int id private double balance private double annual
  • javase类的简单应用圆与圆柱类

    圆类 package com github MrtianSuper public class Circle private double radius 61 1 设置圆的半径 无参数构造方法 public Circle this radiu
  • Java银行账户可透支类

    账户类 java package com github Mrtiang public class Account 创建账户属性 private int id private double balance private double ann
  • java继承的概念与相关应用

    继承 1 继承概述 需求说明 xff1a 设计两个类 xff1a Dog和Penguin 问题 xff1a 其中属性和方法有大量的重复 xff0c 可以优化 xff0c 使用继承 继承使用的关键字 xff1a extends xff1a 扩
  • Java类与继承

    继承二 1 static关键字 使用场景 xff1a 当某些场景下不需要创建多个 内容 xff0c 每个类的实例对象共享一个 内容 时就可以使用static关键字来修饰 含义 xff1a static表示静态内容 xff0c 使用stati
  • 继承,static关键字,abstract,单例模式

    1 为什么要有类的继承性 类的继承性可以减少代码冗余度 xff0c 提高代码复用性 xff0c 提高代码操作效率 2 继承的格式 xff08 语法 xff09 子类 extends 父类 3 子类继承父类后有哪些不同 子类范围大于父类 xf
  • KVM详解(一)——KVM基础知识

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是KVM的基础知识 一 虚拟化简介 xff08 一 xff09 虚拟化概述 在计算机中 xff0c 虚拟化技术是一种资源管理技术 xff0c 可以将计算机的各硬件资源 xff
  • Linux桌面图形化安装详解

    今天继续给大家介绍Linux相关知识 xff0c 本文主要内容是Linux xff08 CentOS7 xff09 图形化GUI页面安装详解 一 Linux GUI图形化页面简介 尽管在运维工作中 xff0c 我们很少在Linux上安装图形
  • 【MediaSoup c#】 worker的创建

    js rust 不太熟 c 似乎还好懂一些 学习media soup 的各个组件及大体使用方式 学习其设计理念 MediasoupServer 管理worker列表 worker的表达是通过 IWorker 抽象类 拥有一个observer
  • KVM详解(三)——KVM创建虚拟机

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是在KVM上创建虚拟机 一 安装准备 在前文KVM详解 xff08 二 xff09 KVM安装部署中 xff0c 我们安装了KVM 今天 xff0c 我们就来创建一个KVM的
  • KVM详解(九)——CentOS6虚拟机关机失败问题解决

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是CentOS6虚拟机关机失败问题解决 一 问题描述 当我们使用KVM安装CentOS6系统后 xff0c 会发现一个问题 xff0c 即无法通过virsh shutdown
  • Python循环结构详解

    今天继续给大家介绍Python相关知识 xff0c 本文主要内容是Python循环结构 循环是一种编程语言的重要结构 xff0c 在Python中 xff0c 存在着两种循环 xff0c 一种是遍历循环 xff0c 一种是while循环 一
  • Ubuntu配置sudo命令不需要输入密码

    执行以下命令 xff1a span class token function sudo span visudo span class token comment sudo visudo默认使用的编辑器是nano xff0c 使用上下键移动
  • 智慧社区信息管理系统的设计与实现(论文打包下载)

    摘 要 近几年来 xff0c 随着网上支付方式的普及 xff0c 越来越多的人选择使用网上支付 xff0c 但由于网上支付的方式还未普及到生活的各方面 xff0c 因此本系统的完成将为物业小区提供合理的线上管理模式 xff0c 代替传统的线
  • vsftp配置详解篇

    在配置安装vsftpd过程中 xff0c 我遇到了很多坑 xff1f 查了上百篇博客 xff0c 才把这些坑一一填满 这里记录是为了方便后来者查阅 xff0c 我也是个小白 有问题请不要客气 xff0c 直接喷就是了 xff01 vsftp
  • RNN构建语言模型(用前一个单词预测下一个单词)

    训练RNN的时候 xff0c 根据反向传播 xff0c 梯度会不断相乘 xff0c 很容易出现梯度消失和梯度爆炸 通常的解决方法 xff1a 对于梯度爆炸 xff1a Gradient Clipping xff1a 如果梯度太大就把它往下卡
  • pytorch中使用tensorboard绘制Accuracy/Loss曲线(train和test显示在同一幅图中)

    因为tensorboard可以在同一幅图中显示不同文件夹下的曲线 xff0c 所以将train和test分别存到不同的文件夹里就可以在同一副图中展示 xff0c 简要记录代码 from torch utils tensorboard imp
  • Android Studio 查看当前显示的 activity

    在修复bug时 xff0c 首先需要定位到是哪个activity出现的问题 xff0c 这时可以使用adb工具 abd工具在SDK目录下的platform tools文件夹下 1 打开Android Studio的Terminal xff0
  • MyBatis:使用MyBatis Generator快速完成Springboot项目数据层开发

    使用场景 当我们使用Springboot整合Mybatis时 xff0c 我们就需要为数据库中的每一个表分别写出 xff1a 实体类Mapper xml文件Mapper接口 如果数据库中有很多表 xff0c 这个过程就会非常的繁琐 而MyB