技术标签: MyBatis-Plus精讲
良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架
了解并掌握MyBatis-Plus代码生成器的实现
代码生成器,顾名思义就是通过程序生成想要的代码。其原理非常简单,可以简单理解为:模板 + 数据 = 输出。
比如:
模板--Mapper.ftl
package ${basepackage}.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import ${basepackage}.${domain};
public interface ${domain}Mapper extends BaseMapper<${domain}> {
}
数据
{
basepackage:"com.langfeiyes.mp",
domain:"Department"
}
输入:数据 + 模板
将模板中${占位符} 替换成数据,并将渲染好的结果输出到DepartmentMapper.java文件中
package com.langfeiyes.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.langfeiyes.mp.domain.Department;
public interface DepartmentMapper extends BaseMapper<Department> {
}
那么此时的DepartmentMapper.java类就编写好了,后续如果将Department替换成Employee,那么EmployeeMapper.xml也就能快速编写成功。
package com.langfeiyes.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.langfeiyes.mp.domainEmployee;
public interface EmployeeMapper extends BaseMapper<Employee> {
}
MyBatis-Plus 也提供一套代码生成器-AutoGenerator,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
旧版代码生成器指的是mybatis-plus-generator 3.5.1 以下版本
以User用户为例子
步骤1:创建User数据表
CREATE TABLE `mybatis-plus`.`user` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`username` varchar(255) NULL COMMENT '用户名',
`password` varchar(255) NULL COMMENT '密码',
PRIMARY KEY (`id`)
);
步骤2:导入相关依赖
<!--代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.0</version>
</dependency>
<!--模板依赖-freemarker-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!--模板依赖-Beetl-->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.9.3.RELEASE</version>
</dependency>
<!--模板依赖-Velocity-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
注意上面3个模板只需要导入一个即可,默认是Velocity
步骤3:编写代码生成器
package com.langfeiyes.mp.generator;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
@Component
public class MyCodeGenerator {
@Autowired
private DataSource dataSource;
//获取数据源-如果没有springboot环境,可以直接调用
private DataSource getDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8");
druidDataSource.setUsername("root");
druidDataSource.setPassword("admin");
return druidDataSource;
}
//获取全局配置
private GlobalConfig getGlobalConfig(){
String projectPath = System.getProperty("user.dir");
GlobalConfig gc = new GlobalConfig.Builder()
.outputDir(projectPath + "/src/main/java") //输出目录
.author("dafei") //作者
.openDir(true) //是否打开目录
//.enableSwagger() //是否开启swagger模式
//.fileOverride() //如果文件已经存在则覆盖
.build();
return gc;
}
//获取包配置
private PackageConfig getPageConfig(){
PackageConfig packageConfig = new PackageConfig.Builder()
.parent("com.langfeiyes") //父包名,根包
.moduleName("mp") //模块名
.entity("entity") //指定实体对象包名,默认:entity
.service("service") //指定服务接口包名,默认:service
.serviceImpl("service.impl") //指定服务接口实现类包名,默认:service.impl
.mapper("mapper") //指定映射接口包名,默认:mapper
.xml("xml") //指定映射xml文件包名,默认:mapper.xml
.controller("controller") //指定controller包名,默认:controller
.build(); //构建
return packageConfig;
}
//获取模板配置
private TemplateConfig getTemplateConfig(){
TemplateConfig templateConfig = new TemplateConfig.Builder()
//.entity("entity") //指定实体对象模板路径
//.service("service", //指定服务接口模板路径
// "serviceImpl") //指定服务接口模板路径
//.mapper("mapper") //指定映射接口模板路径
//.mapperXml("xml") //指定映射xml文件模板路径
//.controller("controller") //指定controller模板路径
.build();
//注意,处理自定义模板,一般使用默认的
return templateConfig;
}
//策略配置
//配置数据库与数据表相关的
public StrategyConfig getStrategy(){
StrategyConfig config = new StrategyConfig.Builder()
//.addFieldPrefix("字段前缀")
//.addExclude("排除哪些表")
//.addInclude("指定哪些表")
.addInclude("user")
//.addTablePrefix("添加表前缀")
.build();
return config;
}
public void excute() {
// 代码生成器
AutoGenerator mpg = new AutoGenerator(new DataSourceConfig.Builder(dataSource).build())
// 全局配置
.global(getGlobalConfig())
// 包配置
.packageInfo(getPageConfig())
//模板配置
.template(getTemplateConfig())
//策略配置
.strategy(getStrategy())
//注入配置
.injection(null);
//mpg.execute(new BeetlTemplateEngine());
mpg.execute(new FreemarkerTemplateEngine());
//mpg.execute(new VelocityTemplateEngine());
}
}
步骤4:测试
@SpringBootTest
public class CodeBuilderTest {
@Autowired
MyCodeGenerator myCodeGenerator;
@Test
public void testCode() throws SQLException {
myCodeGenerator.excute();
}
}
注意:如果是低版本的druid,会包错误:SQLFeatureNotSupportedException
主要是druid数据源中dataSource.getConnection().getSchema() 没有实现,直接丢异常,换新版本即可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
新版代码生成器指的是mybatis-plus-generator 3.5.1 以上版本,操作最大的变化是使用了lambda语法
以User用户为例子
前面操作操作步骤都一样
步骤1:创建user用户表
步骤2:导入相关依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
步骤3:编写代码生成器代码
package com.langfeiyes.mp.generator;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
@Component
public class MyCodeGenerator {
@Autowired
private DataSource dataSource;
public void excute() {
FastAutoGenerator.create(new DataSourceConfig.Builder(dataSource))
.globalConfig(builder -> builder
.outputDir(System.getProperty("user.dir") + "/src/main/java") //输出目录
.author("dafei") //作者
//.enableSwagger() //是否开启swagger模式
//.fileOverride() //如果文件已经存在则覆盖
)
.packageConfig(builder -> builder
.parent("com.langfeiyes") //父包名,根包
.moduleName("mp") //模块名
.entity("domain") //指定实体对象包名,默认:entity
.service("service") //指定服务接口包名,默认:service
.serviceImpl("service.impl") //指定服务接口实现类包名,默认:service.impl
.mapper("mapper") //指定映射接口包名,默认:mapper
.xml("xml") //指定映射xml文件包名,默认:mapper.xml
.controller("controller") //指定controller包名,默认:controller
)
/*.templateConfig(builder -> builder
//.entity("entity") //指定实体对象模板路径
//.service("service", //指定服务接口模板路径
// "serviceImpl") //指定服务接口模板路径
//.mapper("mapper") //指定映射接口模板路径
//.mapperXml("xml") //指定映射xml文件模板路径
//.controller("controller") //指定controller模板路径
)*/
.strategyConfig(builder -> builder
//.addFieldPrefix("字段前缀")
//.addExclude("排除哪些表")
//.addInclude("指定哪些表")
.addInclude("user")
//.addTablePrefix("添加表前缀")
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
步骤4:测试
@SpringBootTest
public class CodeBuilderTest {
@Autowired
MyCodeGenerator myCodeGenerator;
@Test
public void testCode() throws SQLException {
myCodeGenerator.excute();
}
}
最终结果
从代码简化程度来说还可以,如果有可能,更建议大家手写一个
文章浏览阅读74次。问题:cdh集成kylin之后,对kylin的cube进行build操作的时候,在Convert Cuboid Data to HFile步骤报错:Class org..._implementation class missing org.apache.kylin.storage.istor
文章浏览阅读433次。500 Server Error for HTTP GET "/?url=baidu"_500 server error for http get
文章浏览阅读717次。拷贝到typescript代码目录下的build_package目录。默认编译的工程为compiler目录下sample工程。_arkts 编译
文章浏览阅读1.6k次。参考链接:1、http://forum.ubuntu.org.cn/viewtopic.php?t=297486全部代码下载链接:测试环境:Ubuntu18.04编译之前安装gcc:sudo apt-get install gcc(有问题请搜索百度)make编译虽然可能有错误但是可以生成库暂时不管:当我们下载了CLAPCAK库编译好之后,使用test.c测试出现一下问题:dgesv..._lapack函数库怎么用
文章浏览阅读1k次。def generate_csv_source(data_file):#判断文件是否存在if not os.path.exists(data_file):# 拉取hive表数据cmd_sql = 'hive -e "set hive.cli.print.header=true; \select * from dw.full_d_usr_channel_sum_v3 where ds<>..._python 执行hivesql 修改系统参数
文章浏览阅读107次。当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。输入格式:输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤1..._7-4 帅到没朋友 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有
文章浏览阅读91次。这道题大暴力就行了我们枚举每一个空,并判断是不是满足题目的条件x i,j=Ai and Aj,就行了,如果是的话,就把他加入数组,如果不是就继续下一个#include<bits/stdc++.h>using namespace std;int n,x[1001][1001];int a[1001][1001];int ans[1001];int main(){ sc...
文章浏览阅读3.6k次。1. 普通动画 由Animation、Animator Controller以及Animator三部分构成,通过选中游戏物体点击Window->Animation(Ctrl+6)创建,或逐步创建Animation和Animator,Animator创建在物体身上,在Controller中添加相应的Animator Controller,Animation可独立创建在一个文件夹中,然后拖..._unity3d timeline 同时播放几个
文章浏览阅读1.6w次,点赞14次,收藏133次。方法比较有用,记录下来,自己以后还会用到;不然又要四处寻找方法。模拟数据进行算法仿真可行后,需要用到大量的真实试验数据评测算法的可信度;如何将Excel数据导入到simulink中,在此介绍一下自己找到的方法,简单可行。一个用From workspace模块;另一个用Constant模块。情况一:如果需要导入一个随时间变化的变量【From workspace】Excel中第一列为时..._matlab simulink in端口导入excel
文章浏览阅读12次。JavaScript中的函数和数组是实现复杂逻辑和操作数据的重要工具。通过深入理解函数和数组的概念,并熟练掌握相关的语法和操作方法,我们可以更高效地开发JavaScript应用程序。匿名函数是没有名字的函数,可以直接赋值给变量或作为其他函数的参数传递。JavaScript是一种广泛使用的脚本语言,它提供了丰富的功能和数据结构,其中函数和数组是两个非常重要的概念。在本文中,我们将详细介绍JavaScript中的函数和数组,并提供相应的源代码示例。的数组,并使用索引访问和修改其中的元素。表示数组的第一个元素。
文章浏览阅读2.3k次,点赞4次,收藏27次。返回百度文库,我们仔细看看源代码,其实我们可以发现,随着页面的变化,源代码是不断改变的,每次都只有3张图片的url。并且这个页码数也有一定的规律,如果在第二页,那么图片就是1,2,3,如果在第三页,图片就是2,3,4。但是,从常识来讲,如果网页的内容是异步加载的,那么直接通过百度搜索,是搜索不到网页内部的内容的,但是很显然,我们每次通过百度搜索都是可以直接找到文库中的文本内容的。对待异步加载的数据,我们通常采取的策略有两种,第一个就是直接找到发起异步请求的接口,自己构造请求头,发起请求,第二个就是通过。_python爬取百度文库代码
文章浏览阅读98次。五大常用算法分治动态规划贪婪回溯分支界限_数据结构与算法和机器学习的算法