code generator 代碼生成器主程序
// 主生成程序
public class MybatisGenerator {
public static final String url = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true";
public static final String userName = "root";
public static final String userPassword = "123456";
public static final String projectPath = "C:/work/demo/mybatis-plus-demo";
public static void main(String[] args) {
DataSourceConfig dataSourceConfig =
new DataSourceConfig.Builder(url, userName, userPassword).build();
AutoGenerator generator = new AutoGenerator(dataSourceConfig);
GlobalConfig globalConfig = new GlobalConfig.Builder().openDir(false).
fileOverride().
outputDir(projectPath + "/src/main/java").
author("your name").
build();
generator.global(globalConfig);
// 各個文件生成位置
PackageConfig packageConfig = new PackageConfig.Builder().
parent("com.org.example").
service("manager").
serviceImpl("manager.impl").
entity("domain.entity").
mapper("dao.mapper").
build();
generator.packageInfo(packageConfig);
// 策略没咙,指定生成表等基本信息
StrategyConfig strategy = new StrategyConfig.Builder().
addInclude(new String[]{"user_address"}).
build();
// 設(shè)置service 的名字模板
Service.Builder serviceBuilder = strategy.serviceBuilder();
serviceBuilder.formatServiceFileName("%sManager").formatServiceImplFileName("%sManagerImpl");
// 設(shè)置生成的entity 模板
Entity.Builder entityBuilder = strategy.entityBuilder();
entityBuilder.enableLombok().columnNaming(underline_to_camel).
naming(underline_to_camel);
generator.strategy(strategy);
// 基本模板配置
TemplateConfig templateConfig = new TemplateConfig.Builder().
disable(TemplateType.XML, TemplateType.CONTROLLER).
build();
generator.template(templateConfig);
// 執(zhí)行
generator.execute();
}
}
pom 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.example</groupId>
<artifactId>mybatis-plus-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<!--驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<!--通用工具猩谊,json轉(zhuǎn)換等-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
username: root
password: 123456
mybatis-plus:
# 對枚舉類的處理,枚舉如果沒有實現(xiàn)指定的接口 IEnum<Integer>的話祭刚,需要專門的進行配置掃描包
typeEnumsPackage: com.org.example.domain.type
logging:
level:
com.org.example.dao.mapper: debug
生成的的實體類,需要手動的將需要進行轉(zhuǎn)換的屬性進行屬性的變更以及typeHandler的選取牌捷,這個類很重要,之后需要單獨維護袁梗,整個轉(zhuǎn)換器再這個上邊進行使用
package com.org.example.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.time.Instant;
import java.util.List;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.org.example.dao.typehandler.InstantMsLongTypeHandler;
import com.org.example.dao.typehandler.LiveAttrListTypeHandler;
import com.org.example.dao.typehandler.LiveChannelListTypeHandler;
import com.org.example.domain.type.PushStreamType;
import com.org.example.domain.type.StatusType;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@TableName(autoResultMap = true)
@EqualsAndHashCode(callSuper = false)
public class PlConfigProject implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("project_id")
private String projectId;
@TableField(value = "live_channel_info", typeHandler = LiveChannelListTypeHandler.class)
private List<LiveChannelInfo> liveChannelInfo;
@TableField(value = "cloud_store_info", typeHandler = JacksonTypeHandler.class)
private CloudStoreInfo cloudStoreInfo;
/**
* 直播初始化屬性包括 視頻屬性宜鸯,音頻屬性,錄屏屬性等
*/
@TableField(value = "live_attr", typeHandler = LiveAttrListTypeHandler.class)
private List<LiveAttr> liveAttr;
/**
* 狀態(tài)屬性 1 未激活 2激活 3禁用 4刪除
*/
private StatusType status;
@TableField("push_stream_type")
private PushStreamType pushStreamType;
@TableField(value = "create_time", typeHandler = InstantMsLongTypeHandler.class)
private Instant createTime;
@TableField(value = "update_time", typeHandler = InstantMsLongTypeHandler.class)
private Instant updateTime;
private Integer version;
}
枚舉類的創(chuàng)建
實現(xiàn)mybatis-plus的接口遮怜,則不需要再配置文件中配置相應(yīng)的路徑淋袖,但是需要重寫getValue方法
package com.org.example.domain.type;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.baomidou.mybatisplus.annotation.IEnum;
public enum StatusType implements IEnum<Integer> {
//狀態(tài)屬性 1 未激活 2激活 3已使用 4刪除
STATUS_INACTIVATED(1, "未激活"),
STATUS_ACTIVATED(2, "激活"),
STATUS_USED(3, "已使用"),
STATUS_DELETED(4, "刪除"),
;
@EnumValue
private int code;
private String description;
StatusType(int code, String description) {
this.code = code;
this.description = description;
}
@Override
public Integer getValue() {
return this.code;
}
public String getCodeString() {
return name();
}
public String getDescription() {
return description;
}
}
如果自定義枚舉的話,需要再配置文件中配置文件的路徑锯梁,進行掃描mybatis-plus.
typeEnumsPackage=com.org.example.domain.type
public enum PushStreamType implements Enumerable {
RTMP(0, "rtmp推流"),
RTC(1, "rtc推流"),
RTMP_RTC(2, "rtc & rtmp 推流"),
;
@EnumValue
private int code;
private String description;
PushStreamType(int code, String description) {
this.code = code;
this.description = description;
}
@Override
public int getCode() {
return code;
}
@Override
public String getCodeString() {
return name();
}
@Override
public String getDescription() {
return description;
}
}
public interface Enumerable {
int getCode();
String getCodeString();
String getDescription();
}
使用的typeHandler定義
// instant 2 bigint的轉(zhuǎn)換
package com.org.example.dao.typehandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Instant;
public class InstantMsLongTypeHandler extends BaseTypeHandler<Instant> {
public InstantMsLongTypeHandler() {
}
public void setNonNullParameter(PreparedStatement ps, int i, Instant parameter, JdbcType jdbcType) throws SQLException {
ps.setLong(i, parameter.toEpochMilli());
}
public Instant getNullableResult(ResultSet rs, String columnName) throws SQLException {
long value = rs.getLong(columnName);
if (rs.wasNull()) {
return null;
} else {
return value > 0L ? Instant.ofEpochMilli(value) : null;
}
}
public Instant getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
long value = rs.getLong(columnIndex);
if (rs.wasNull()) {
return null;
} else {
return value > 0L ? Instant.ofEpochMilli(value) : null;
}
}
public Instant getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
long value = cs.getLong(columnIndex);
if (cs.wasNull()) {
return null;
} else {
return value > 0L ? Instant.ofEpochMilli(value) : null;
}
}
}
// instant 2 timestamp 的轉(zhuǎn)換器
public class InstantTimestampTypeHandler extends BaseTypeHandler<Instant> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Instant parameter, JdbcType jdbcType) throws SQLException {
ps.setTimestamp(i, new Timestamp(parameter.toEpochMilli()));
}
@Override
public Instant getNullableResult(ResultSet rs, String columnName)
throws SQLException {
Timestamp value = rs.getTimestamp(columnName);
if (rs.wasNull()) {
return null;
} else {
return Instant.ofEpochMilli(value.getTime());
}
}
@Override
public Instant getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
Timestamp value = rs.getTimestamp(columnIndex);
if (rs.wasNull()) {
return null;
} else {
return Instant.ofEpochMilli(value.getTime());
}
}
@Override
public Instant getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
Timestamp value = cs.getTimestamp(columnIndex);
if (cs.wasNull()) {
return null;
} else {
return Instant.ofEpochMilli(value.getTime());
}
}
}
// 其他復(fù)雜類型轉(zhuǎn)換器
public class LiveAttrListTypeHandler extends BaseTypeHandler<List<LiveAttr>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
List<LiveAttr> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, toValue(parameter));
}
@Override
public List<LiveAttr> getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String value = rs.getString(columnName);
if (rs.wasNull()) {
return null;
} else {
return convert(value);
}
}
@Override
public List<LiveAttr> getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
String value = rs.getString(columnIndex);
if (rs.wasNull()) {
return null;
} else {
return convert(value);
}
}
@Override
public List<LiveAttr> getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String value = cs.getString(columnIndex);
if (cs.wasNull()) {
return null;
} else {
return convert(value);
}
}
private List<LiveAttr> convert(String value) {
return JSONUtil.toBean(value, new TypeReference<List<LiveAttr>>() {
}, true);
}
private String toValue(List<LiveAttr> parameter) {
return JSONUtil.toJsonStr(parameter);
}
}