MyBatis:MyBatis3 Dynamic Sql入门学习

Posted ABin-阿斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis:MyBatis3 Dynamic Sql入门学习相关的知识,希望对你有一定的参考价值。

我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。 如果小伙伴们觉得文章有点 feel ,那就点个赞再走哦。

  • 声明:
    • 原作者:CSDN:https://blog.csdn.net/a19870822cp?type=blog
    • 原文链接:https://blog.csdn.net/a19870822cp/article/details/119889509

文章目录

一、前言

  • mybatis官方推出了一种新的动态sql的编程方式MyBatis3 Dynamic Sql。官方觉得xml已经过时了,不建议大家在使用了。

  • 而注解的方式也不是很优雅,功能比较少,很多sql不好实现,代码不好调试等,所以推荐正确的mybatis食用方式给大家。

  • MyBatis3 Dynamic Sql使用了 java8的生成器来生成代码,使用流式以及 lambda表达式来构建sql,看起来更简化、优雅,完全使用java代码编程,更加的流畅。

二、编程风格:

@Test
void testGeneralSelect() 
    try (SqlSession session = sqlSessionFactory.openSession()) 
        PersonMapper mapper = session.getMapper(PersonMapper.class);

        SelectStatementProvider selectStatement = select(id.as("A_ID"), firstName, lastName, birthDate, employed,
            occupation, addressId)
        .from(person)
        .where(id, isEqualTo(1))
        .or(occupation, isNull())
        .build()
        .render(RenderingStrategies.MYBATIS3);

        List<PersonRecord> rows = mapper.selectMany(selectStatement);
        assertThat(rows).hasSize(3);
    

三、SpringBoot 整合 MyBatis3 Dynamic Sql

1、创建数据库

这里使用用户、角色、菜单表来描述:

# 用户表
CREATE TABLE `sys_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(50) NOT NULL COMMENT '账号',
  `describe` varchar(100) DEFAULT NULL COMMENT '描述',
  `nick_name` varchar(50) DEFAULT NULL COMMENT '昵称',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `state` int(4) NOT NULL DEFAULT 0 COMMENT '状态0正常',
  `avatar_url` varchar(200) DEFAULT NULL COMMENT '头像url',
  `created_time` datetime NOT NULL COMMENT '创建时间',
  `modified_time` datetime DEFAULT NULL COMMENT '修改时间',
  `del_flag` int(4) NOT NULL DEFAULT 0 COMMENT '删除标记',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_sys_user_account` (`account`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

# 用户角色表
CREATE TABLE `sys_user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(50) NOT NULL COMMENT '用户账号',
  `role_name` varchar(50) NOT NULL COMMENT '角色名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

# 角色表
CREATE TABLE `sys_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '角色名称',
  `display_name` varchar(50) NOT NULL COMMENT '角色名称中文',
  `state` int(4) DEFAULT 0 COMMENT '状态',
  `describe` varchar(100) DEFAULT NULL COMMENT '描述',
  `platform_code` varchar(50) DEFAULT NULL COMMENT '平台code',
  `created_time` datetime NOT NULL,
  `modified_time` datetime DEFAULT NULL,
  `del_flag` int(2) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_sys_role_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

# 菜单表
CREATE TABLE `sys_menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '菜单名称',
  `display_name` varchar(50) NOT NULL COMMENT '菜单显示名称',
  `url` varchar(255) DEFAULT NULL COMMENT '菜单url',
  `menu_index` int(4) DEFAULT 0 COMMENT '菜单排序',
  `state` int(4) DEFAULT 0 COMMENT '状态0正常1禁用',
  `pid` int(11) NOT NULL COMMENT '上一级菜单id',
  `icon` varchar(50) DEFAULT NULL COMMENT '图标',
  `display` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否显示',
  `platform_code` varchar(50) DEFAULT NULL COMMENT '平台code',
  `del_flag` int(4) DEFAULT 0,
  `created_time` datetime DEFAULT NULL,
  `modified_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_sys_menu` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

# 角色菜单表
CREATE TABLE `sys_role_menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) NOT NULL COMMENT '角色名称',
  `menu_name` varchar(50) NOT NULL COMMENT '菜单名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;`` 


2、创建springboot项目

2.1、引入对应的包

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

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<!-- MyBatis 生成器 -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.4.0</version>
</dependency>

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- MyBatis 动态SQL支持 -->
<dependency>
    <groupId>org.mybatis.dynamic-sql</groupId>
    <artifactId>mybatis-dynamic-sql</artifactId>
    <version>1.3.0</version>
</dependency>


2.2、自动生成表的对象

在resources下创建generatorConfig.xml配置文件

<?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>
    <!--Mybatis Generator目前有5种运行模式,分别为:MyBatis3DynamicSql、MyBatis3Kotlin、MyBatis3、MyBatis3Simple、MyBatis3DynamicSqlV1。-->
    <context id="springboot-base" targetRuntime="MyBatis3DynamicSql">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection
                connectionURL="jdbc:mysql://127.0.0.1:3306/test?tinyInt1isBit=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                driverClass="com.mysql.jdbc.Driver"
                userId="root"
                password="123456"/>

        <javaTypeResolver>
            <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer, 为 true时把JDBC DECIMAL
            和 NUMERIC 类型解析为java.math.BigDecimal -->
            <property name="forceBigDecimals" value="false" />
            <!--是否试用jdk8时间类-->
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator
                targetPackage="com.example.dynamic.entity"
                targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator
                targetPackage="com.example.dynamic.mapper"
                targetProject="src/main/java" type="ANNOTATEDMAPPER">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!--生成全部表tableName设为%-->
        <!-- 指定数据库表 -->
        <table tableName="sys_%" >
            <domainObjectRenamingRule searchString="^Sys_" replaceString="Sys_"/>
        </table>

        <!-- 指定数据库表
          schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。
          domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
          -->
        <!--<table schema="" tableName="" domainObjectName=""/>-->
    </context>
</generatorConfiguration>


  • Mybatis Generator目前有5种运行模式,分别为:MyBatis3DynamicSql、MyBatis3Kotlin、MyBatis3、MyBatis3Simple、MyBatis3DynamicSqlV1。
  • 这里使用的是 MyBatis3DynamicSql,只生成 pojo 和一个 mapper 类,不会生成xml。

在java下创建generator包和MybatisGenerator.java文件

public class MybatisGenerator 
    public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException 
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<>();
        //读取我们的 MBG 配置文件
        InputStream is = MybatisGenerator.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();
        //当生成的代码重复时,覆盖原代码
        DefaultShellCallback callback = new DefaultShellCallback(true);
        //创建 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for (String warning : warnings) 
            System.out.println(warning);
        
    



直接运行此java类,会生成对应的文件:

实体类就是表字段下划线转驼峰

mapper就是注解形式的mapper接口,包含一些常用的方法:

package com.example.dynamic.mapper;

import static com.example.dynamic.mapper.SysUserDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.*;

import com.example.dynamic.entity.SysUser;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import javax.annotation.Generated;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.BasicColumn;
import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter;
import MyBatis3:SQL映射

MyBatis3入门

MyBatis3教程

mybatis3 配置文件解析

《MyBatis3源码深度解析》图书简介

《MyBatis3源码深度解析》图书简介