基于mybatis

网友投稿 738 2022-10-07

基于mybatis

基于mybatis

目录1.引入依赖2.简单的代码生成3.自定义模板生成代码3.1实现思路3.2定义代码生成常量3.3全局配置3.4定义生成代码模板的路径3.5定义各文件生成存储路径3.6数据源配置3.7配置策略3.8组装模板属性3.9定义对应的模板文件3.10定义启动类

1.引入依赖

com.baomidou

mybatis-plus-generator

3.5.2

org.apache.velocity

velocity-engine-core

2.3

cn.hutool

hutool-core

5.7.20

MyBatisPlus提高高度封装好的代码生成器模块,只需要简单的几行代码就能实现。同时也可以根据自己的需求灵活的通过模板话的方式生成代码。下面我们分别通过这两种方式来了解一些。

2.简单的代码生成

package com.didiplus;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;

import com.baomidou.mybatisplus.generator.config.OutputFile;

import org.junit.jupiter.api.Test;

import java.util.Collections;

/**

* Author: didiplus

* Email: 972479352@qq.com

* CreateTime: 2022/5/6

* Desc:快速生成

*/

public class FastAutoGeneratorTest {

@Test

public void fastAutoGeneratorTest(){

String url="jdbc:mysql://127.0.0.1:3306/didiadmin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true";

FastAutoGenerator.create(url,"root","123456")

.globalConfig(builder -> {

.enableSwagger() //开启 swagger 模式

.outputDir("D://autocode");// 指定输出目录

})

.packageConfig(builder -> {

builder.parent("com.didiplus.models") // 设置父包名

.moduleName("sys") // 设置父包模块名

.pathInfo(Collections.singletonMap(OutputFile.xml,"D://autocode/xml"));

})

.strategyConfig(builder -> {

builder.addInclude("sys_dict_data") // 设置需要生成的表名

.addTablePrefix("t_","c_") ; // 设置过滤表前缀

})

// .templateEngine(new FreemarkerTemplateEngine()) 使用Freemarker引擎模板,默认的是Velocity引擎模板

.execute();

}

}

运行以上代码,会自动的在D盘生成代码,但是,生成的代码只是最基本的模板。

以上生成的代码都是基于MybatisPlus代码生成默认模板去生成的。适合绝大多数场景。我们也可以根据自己的模板文件去生成代码的。

3.自定义模板生成代码

3.1实现思路

从数据库中读取表的相关信息和表的相关字段

定义相对于的模板文件

组装模板属性

3.2定义代码生成常量

这些常量主要用户后期在组装模板时,把数据库类型转换成Java数据类型需要用到的。

package com.didiplus.constant;

/**

* Author: didiplus

* Email: 972479352@qq.com

* CreateTime: 2022/5/6

* Desc: 码 生 成 通 用 常 量

*/

public class GenerateConstant {

/**

* 数据库字符串类型

*/

public static final String[] COLUMN_TYPE_STR = {"char", "varchar", "nvarchar", "varchar2", "tinytext", "text", "mediumtext", "longtext"};

/**

* 数据库时间类型

*/

public static final String[] COLUMN_TYPE_TIME = {"datetime", "time", "date", "timestamp"};

/**

* 数据库数字类型

*/

public static final String[] COLUMN_TYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", "bit"};

/**

* 数据库bigint类型

*/

public static final String[] COLUMN_TYPE_BIGINT = {"bigint"};

/**

* 数据库float类型

*/

public static final String[] COLUMN_TYPE_FLOAT = {"float"};

/**

* 数据库double类型

*/

public static final String[] COLUMN_TYPE_DOUBLE = {"double"};

/**

* 数据库decimal类型

*/

public static final String[] COLUMN_TYPE_DECIMAL = {"decimal"};

/**

* 字符串类型

*/

public static final String TYPE_STRING = "String";

/**

* 整型

*/

public static final String TYPE_INTEGER = "Integer";

/**

* 长整型

*/

public static final String TYPE_LONG = "Long";

/**

* 浮点型

*/

public static final String TYPE_DOUBLE = "Double";

/**

* 高精度计算类型

*/

public static final String TYPE_BIGDECIMAL = "BigDecimal";

/**

* 时间类型

*/

public static final String TYPE_DATE = "Date";

}

3.3全局配置

/**

* 全局配置

*/

private GlobalConfig.Builder globalConfig() {

String projectPath = System.getProperty("user.dir");

return new GlobalConfig.Builder()

.fileOverride() // 覆盖已生成文件

.disableOpenDir() // 禁止打开输出目录 默认值:true

.outputDir(projectPath+"/src/main/resources/autocode") // 指定输出目录

.enableSwagger(); // 开启 swagger 模式 默认值:false

}

3.4定义生成代码模板的路径

/**

* 模板配置

*/

private TemplateConfig.Builder templateConfig() {

return new TemplateConfig.Builder()

.entity("/templates/vm/entity.java")

.mapper("/templates/vm/mapper.java")

.service("/templates/vm/service.java")

.serviceImpl("/templates/vm/serviceimpl.java")

.controller("/templates/vm/controller.java")

.xml("/templates/vm/mapper.xml");

}

以上的函数是声明代码生成根据这些模板去生成对应的模板。

3.5定义各文件生成存储路径

/**

* 包配置

*/

private PackageConfig.Builder packageConfig() {

return new PackageConfig.Builder()

.parent(packageName)

.moduleName(moduleName)

.entity("domain.entity")

.mapper("mapper")

.service("service")

.serviceImpl("service.impl")

.xml("mapper.xml")

.controller("controller");

}

3.6数据源配置

/**

* 数据源配置

*/

private static final DataSourceConfig DATA_SOURCE_CONFIG = new DataSourceConfig

.Builder("jdbc:mysql://127.0.0.1:3306/didiadmin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true","root","123456")

.build();

3.7配置策略

/**

* 策略配置

*/

private StrategyConfig.Builder strategyConfig() {

return new StrategyConfig.Builder()

.addInclude(tableName);

}

3.8组装模板属性

/**

* 注入配置

*/

private InjectionConfig.Builder injectionConfig(){

Map map = new HashMap<>();

setAttr(tableName, DATA_SOURCE_CONFIG, map);

return new InjectionConfig.Builder().customMap(map);

}

/**

* 组装模板属性

*

* @param tableName 表名

* @param dataSourceConfig 数据源

* @param map 模板里面 自定义的属性

* @param 表前缀

*/

private void setAttr(String tableName, DataSourceConfig dataSourceConfig, Map map ){

List> columns = new ArrayList<>();

// 获取表信息sql

String tableSql = "select table_name , table_comment from information_schema.tables " +

"where table_schema = (select database()) and table_name = '" + tableName + "'";

// 获取字段信息sql

String columnSql = "select column_name , data_type , column_comment from information_schema.columns " +

"where table_name = '" + tableName + "' and table_schema = (select database()) and column_name != 'id_new'";

// 利用现有的dataSourceConfig来获取数据库连接,查询表字段及备注等信息

try(

Connection conn = dataSourceConfig.getConn();

PreparedStatement psTable = conn.prepareStatement(tableSql);

ResultSet rsTable = psTable.executeQuery();

PreparedStatement pscolumns= conn.prepareStatement(columnSql);

ResultSet rscolumns = pscolumns.executeQuery();

){

if(rsTable.next()){

String table_name = rsTable.getString("table_name");

map.put("tableName",table_name);

map.put("comment",rsTable.getString("table_comment"));

// 类名 大驼峰

map.put("upperClassName", StrUtil.upperFirst(StrUtil.toCamelCase(table_name)));

// 对象名 小驼峰

map.put("lowerClassName",StrUtil.toCamelCase(table_name));

}

while (rscolumns.next()){

Map columnMap = new HashMap<>();

// 列名字、数据类型、java属性名字、java属性类型、备注

columnMap.put("column_name",rscolumns.getString("column_name"));

columnMap.put("data_type",rscolumns.getString("data_type"));

columnMap.put("javaLowerAttrName",StrUtil.toCamelCase(rscolumns.getString("column_name")));

columnMap.put("javaAttrType",columnTypeToJavaType(rscolumns.getString("data_type")));

columnMap.put("column_comment", rscolumns.getString("column_comment"));

columns.add(columnMap);

}

} catch (Exception e) {

log.info("----------sql执bEYkZw行出错");

e.printStackTrace();

}

map.put("columns",columns);

map.put("datetime", DateUtil.now());

map.put("packageName", packageName);

map.put("moduleName", moduleName);

}

/**

* 数据库类型转换为java类型

*

* @param columnType 数据库类型

* @return java类型

*/

private String columnTypeToJavaType(String columnType) {

if(StrUtil.isNotEmpty(columnType)){

if(Arrays.asList(GenerateConstant.COLUMN_TYPE_STR).contains(columnType)){

return GenerateConstant.TYPE_STRING;

}

if(Arrays.asList(GenerateConstant.COLUMN_TYPE_TIME).contains(columnType)){

return GenerateConstant.TYPE_DATE;

}

if (Arrays.asList(GenerateConstant.COLUMN_TYPE_NUMBER).contains(columnType)) {

return GenerateConstant.TYPE_INTEGER;

}

if (Arrays.asList(GenerateConstant.COLUMN_TYPE_BIGINT).contains(columnType)) {

return GenerateConstant.TYPE_LONG;

}

if (Arrays.asList(GenerateConstant.COLUMN_TYPE_FLOAT).contains(columnType)) {

return GenerateConstant.TYPE_DOUBLE;

}

if (Arrays.asList(GenerateConstant.COLUMN_TYPE_DOUBLE).contains(columnType)) {

return GenerateConstant.TYPE_DOUBLE;

}

if (Arrays.asList(GenerateConstant.COLUMN_TYPE_DECIMAL).contains(columnType)) {

return GenerateConstant.TYPE_BIGDECIMAL;

}

}

return null;

}

3.9定义对应的模板文件

在项目的资源文件夹templats中创建vm文件夹存放模板文件

entity.java.vm

package ${packageName}.${moduleName}.domain.entity;

#set($list=["createBy","createTime","createName", "updateBy", "updateName","updateTime", "deleteFlag"])

import com.didiplus.common.base.BaseDomain;

import lombok.Data;

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableName;

/**

* @author ${author}

* @date ${datetime}

*

* @description ${comment}(${upperClassName}实体类)

*/

@Data

@TableName("${tableName}")

@ApiModel(value = "${comment}", description = "${comment}对象 ${lowerClassName}")

public class ${upperClassName}Entity extends BaseDomain {

#foreach ($column in $columns)

## 排除父类字段

#if($list.contains($column.javaLowerAttrName))

#else

/**

* $column.column_comment

*/

@ApiModelProperty(value = "$column.column_comment")

private $column.javaAttrType $column.javaLowerAttrName;

#end

#end

}

mapper.java.vm

package ${packageName}.${moduleName}.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import ${packageName}.${moduleName}.domain.entity.${upperClassName}Entity;

import org.apache.ibatis.annotations.Mapper;

/**

* @author ${author}

* @date ${datetime}

*

* @description ${comment}

*/

@Mapper

public interface ${upperClassName}Mapper extends BaseMapper<${upperClassName}Entity> {

}

mapper.xml.vm

#foreach($column in $columns)

#end

service.java.vm

package ${packageName}.${moduleName}.service;

import com.baomidou.mybatisplus.core.metadata.IPage;

import com.baomidou.mybatisplus.extension.service.IService;

import ${packageName}.${moduleName}.domain.entity.${upperClassName};

import com.didiplus.common.web.domain.PageDomain;

/**

* @author ${author}

* @date ${datetime}

*

* @description ${comment}

*/

public interface I${upperClassName}Service extends IService<${upperClassName}Entity> {

/**

* 分页查询

* @param pageDomain

* @return

*/

IPage<${upperClassName}Entity> page(PageDomain pageDomain);

}

serviceImpl.java.vm

package ${packageName}.${moduleName}.service.impl;

import com.didiplus.common.web.domain.PageDomain;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import ${packageName}.${moduleName}.domain.entity.${upperClassName}Entity;

import ${packageName}.${moduleName}.mapper.${upperClassName}Mapper;

import ${packageName}.${moduleName}.service.I${upperClassName}Service;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import com.baomidou.mybatisplus.core.metadata.IPage;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

/**

* @author ${author}

* @date ${datetime}

*

* @description ${comment}

*/

@Service

public class ${upperClassName}ServiceImpl extends ServiceImpl<${upperClassName}Mapper, ${upperClassName}Entity> implements I${upperClassName}Service {

@Resource

${upperClassName}Mapper ${lowerClassName}Mapper;

@Override

public IPage<${upperClassName}Entity> page(PageDomain pageDomain) {

IPage<${upperClassName}Entity> page = new Page<>(pageDomain.getPage(),pageDomain.getLimit());

return ${lowerClassName}Mapper.selectPage(page,null);

}

}

controller.java.vm

package ${packageName}.${moduleName}.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import ${packageName}.${moduleName}.domain.entity.${upperClassName}Entity;

import ${packageName}.${moduleName}.service.I${upperClassName}Service;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

import lombok.extern.slf4j.Slf4j;

import com.didiplus.common.web.domain.PageDomain;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

import com.didiplus.common.base.ValidGroup;

import javax.annotation.Resource;

/**

* @author ${author}

* @date ${datetime}

*

* @description ${comment}

*/

@Slf4j

@RestController

@RequestMapping("/${lowerClassName}")

@Api(value = "${lowerClassName}", tags = "${comment}管理模块")

public class ${upperClassName}Controller {

@Resource

private I${upperClassName}Service ${lowerClassName}Service;

/**

* 分页查询

* @param pageDomain 分页对象

* @param ${lowerClassName}Entity ${comment}

* @return IPage

*/

@ApiOperation(value = "分页查询", notes = "分页查询")

@GetMapping("/page")

public IPage get${upperClassName}Page(@RequestBody PageDomain pageDomain) {

return ${lowerClassName}Service.page(pageDomain);

}

/**

* 新增${comment}

* @param ${lowerClassName}Entity ${comment}

* @return Result

*/

@ApiOperation(value = "新增${comment}", notes = "新增${comment}")

@PostMapping

public String save(@Validated(ValidGroup.Crud.Create.class) @RequestBody ${upperClassName}Entity ${lowerClassName}Entity) {

return ${lowerClassName}Service.save(${lowerClassName}Entity)? "添加成功":"添加失败";

}

/**

* 修改${comment}

* @param ${lowerClassName}Entity ${comment}

* @return Result

*/

@ApiOperation(value = "修改${comment}", notes = "修改${comment}")

@PutMapping

public String updateById(@Validated(ValidGroup.Crud.Update.class) @RequestBody ${upperClassName}Entity ${lowerClassName}Entity) {

return ${lowerClassName}Service.updateById(${lowerClassName}Entity)? "修改成功":"修改失败";

}

/**

* 通过id删除${comment}

* @param id id

* @return Result

*/

@ApiOperation(value = "通过id删除${comment}", notes = "通过id删除${comment}")

@DeleteMapping("/{id}")

public String removeById(@PathVariable Integer id) {

return ${lowerClassName}Service.removeById(id)? "删除成功":"删除失败";

}

}

3.10定义启动类

执行以上函数就可以自动生成代码了,如下图:

目前代码自动生成器只是一个脚本方式运行,后续我们会把它集成到页面上,通过图形界面的方式去操作。

以上就是基于mybatis-plus-generator实现代码自动生成器的详细内容,更多关于mybatis-plus-generator代码生成的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序关于Radio选中样式切换的实例详解(微信小程序radio组件)
下一篇:RocketMQ源码解析:同步刷盘和异步刷盘的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~