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&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&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映射