
com.baomidou.mybatisplus.generator.config.po.TableField Maven / Gradle / Ivy
/*
* Copyright (c) 2011-2023, baomidou ([email protected]).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.generator.config.po;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.config.ConstVal;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.IKeyWordsHandler;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.builder.Entity;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.baomidou.mybatisplus.generator.jdbc.DatabaseMetaDataWrapper;
import org.apache.ibatis.type.JdbcType;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
/**
* 表字段信息
*
* @author YangHu
* @since 2016-12-03
*/
public class TableField {
/**
* 是否做注解转换
*/
private boolean convert;
/**
* 是否主键
*/
private boolean keyFlag;
/**
* 主键是否为自增类型
*/
private boolean keyIdentityFlag;
/**
* 字段名称
*/
private String name;
/**
* 字段类型(已弃用,使用 {@link #columnType} 代替)
*/
@Deprecated
private String type;
/**
* 属性名称
*/
private String propertyName;
/**
* 字段类型
*/
private IColumnType columnType;
/**
* 字段注释
*/
private String comment;
/**
* 填充
*/
private String fill;
/**
* 是否关键字
*
* @since 3.3.2
*/
private boolean keyWords;
/**
* 数据库字段(关键字含转义符号)
*
* @since 3.3.2
*/
private String columnName;
/**
* 自定义查询字段列表
*/
private Map customMap;
/**
* 字段元数据信息
*
* @since 3.5.0
*/
private MetaInfo metaInfo;
/**
* 实体属性配置
*/
private final Entity entity;
/**
* 数据库配置
*/
private final DataSourceConfig dataSourceConfig;
/**
* 全局配置
*/
private final GlobalConfig globalConfig;
/**
* 构造方法
*
* @param configBuilder 配置构建
* @param name 数据库字段名称
* @since 3.5.0
*/
public TableField(@NotNull ConfigBuilder configBuilder, @NotNull String name) {
this.name = name;
this.columnName = name;
this.entity = configBuilder.getStrategyConfig().entity();
this.dataSourceConfig = configBuilder.getDataSourceConfig();
this.globalConfig = configBuilder.getGlobalConfig();
}
/**
* 设置属性名称
*
* @param propertyName 属性名
* @param columnType 字段类型
* @return this
* @since 3.5.0
*/
public TableField setPropertyName(@NotNull String propertyName, @NotNull IColumnType columnType) {
this.columnType = columnType;
if (entity.isBooleanColumnRemoveIsPrefix()
&& "boolean".equalsIgnoreCase(this.getPropertyType()) && propertyName.startsWith("is")) {
this.convert = true;
this.propertyName = StringUtils.removePrefixAfterPrefixToLower(propertyName, 2);
return this;
}
// 下划线转驼峰策略
if (NamingStrategy.underline_to_camel.equals(this.entity.getColumnNaming())) {
this.convert = !propertyName.equalsIgnoreCase(NamingStrategy.underlineToCamel(this.columnName));
}
// 原样输出策略
if (NamingStrategy.no_change.equals(this.entity.getColumnNaming())) {
this.convert = !propertyName.equalsIgnoreCase(this.columnName);
}
if (entity.isTableFieldAnnotationEnable()) {
this.convert = true;
} else {
if (this.keyFlag) {
this.convert = !ConstVal.DEFAULT_ID_NAME.equals(propertyName);
}
}
this.propertyName = propertyName;
return this;
}
public String getPropertyType() {
if (null != columnType) {
return columnType.getType();
}
return null;
}
/**
* 按 JavaBean 规则来生成 get 和 set 方法后面的属性名称
* 需要处理一下特殊情况:
*
* 1、如果只有一位,转换为大写形式
* 2、如果多于 1 位,只有在第二位是小写的情况下,才会把第一位转为小写
*
* 我们并不建议在数据库对应的对象中使用基本类型,因此这里不会考虑基本类型的情况
*/
public String getCapitalName() {
if (propertyName.length() == 1) {
return propertyName.toUpperCase();
}
if (Character.isLowerCase(propertyName.charAt(1))) {
return Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1);
}
return propertyName;
}
/**
* 获取注解字段名称
*
* @return 字段
* @since 3.3.2
*/
public String getAnnotationColumnName() {
if (keyWords) {
if (columnName.startsWith("\"")) {
return String.format("\\\"%s\\\"", name);
}
}
return columnName;
}
/**
* 是否为乐观锁字段
*
* @return 是否为乐观锁字段
* @since 3.5.0
*/
public boolean isVersionField() {
String propertyName = entity.getVersionPropertyName();
String columnName = entity.getVersionColumnName();
return StringUtils.isNotBlank(propertyName) && this.propertyName.equals(propertyName)
|| StringUtils.isNotBlank(columnName) && this.name.equalsIgnoreCase(columnName);
}
/**
* 是否为逻辑删除字段
*
* @return 是否为逻辑删除字段
* @since 3.5.0
*/
public boolean isLogicDeleteField() {
String propertyName = entity.getLogicDeletePropertyName();
String columnName = entity.getLogicDeleteColumnName();
return StringUtils.isNotBlank(propertyName) && this.propertyName.equals(propertyName)
|| StringUtils.isNotBlank(columnName) && this.name.equalsIgnoreCase(columnName);
}
/**
* 设置主键
*
* @param autoIncrement 自增标识
* @return this
* @since 3.5.0
*/
public TableField primaryKey(boolean autoIncrement) {
this.keyFlag = true;
this.keyIdentityFlag = autoIncrement;
return this;
}
/**
* @param type 类型
* @return this
*/
public TableField setType(String type) {
this.type = type;
return this;
}
public TableField setComment(String comment) {
//TODO 暂时挪动到这
this.comment = this.globalConfig.isSwagger()
&& StringUtils.isNotBlank(comment) ? comment.replace("\"", "\\\"") : comment;
return this;
}
public TableField setColumnName(String columnName) {
this.columnName = columnName;
IKeyWordsHandler keyWordsHandler = dataSourceConfig.getKeyWordsHandler();
if (keyWordsHandler != null && keyWordsHandler.isKeyWords(columnName)) {
this.keyWords = true;
this.columnName = keyWordsHandler.formatColumn(columnName);
}
return this;
}
public TableField setCustomMap(Map customMap) {
this.customMap = customMap;
return this;
}
public boolean isConvert() {
return convert;
}
public boolean isKeyFlag() {
return keyFlag;
}
public boolean isKeyIdentityFlag() {
return keyIdentityFlag;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
public String getPropertyName() {
return propertyName;
}
public IColumnType getColumnType() {
return columnType;
}
public String getComment() {
return comment;
}
public String getFill() {
if (StringUtils.isBlank(fill)) {
entity.getTableFillList().stream()
//忽略大写字段问题
.filter(tf -> tf instanceof Column && tf.getName().equalsIgnoreCase(name)
|| tf instanceof Property && tf.getName().equals(propertyName))
.findFirst().ifPresent(tf -> this.fill = tf.getFieldFill().name());
}
return fill;
}
public boolean isKeyWords() {
return keyWords;
}
public String getColumnName() {
return columnName;
}
public Map getCustomMap() {
return customMap;
}
public MetaInfo getMetaInfo() {
return metaInfo;
}
public void setMetaInfo(MetaInfo metaInfo) {
this.metaInfo = metaInfo;
}
/**
* 元数据信息
*
* @author nieqiurong 2021/2/8
* @since 3.5.0
*/
public static class MetaInfo {
/**
* 表名称
*/
private String tableName;
/**
* 字段名称
*/
private String columnName;
/**
* 字段长度
*/
private int length;
/**
* 是否非空
*/
private boolean nullable;
/**
* 字段注释
*/
private String remarks;
/**
* 字段默认值
*/
private String defaultValue;
/**
* 字段精度
*/
private int scale;
/**
* JDBC类型
*/
private JdbcType jdbcType;
/**
* 类型名称(可用做额外判断处理,例如在pg下,json,uuid,jsonb,tsquery这种都认为是OHTER 1111)
*
* @since 3.5.3
*/
private String typeName;
public MetaInfo(DatabaseMetaDataWrapper.Column column, TableInfo tableInfo) {
if (column != null) {
this.tableName = tableInfo.getName();
this.columnName = column.getName();
this.length = column.getLength();
this.nullable = column.isNullable();
this.remarks = column.getRemarks();
this.defaultValue = column.getDefaultValue();
this.scale = column.getScale();
this.jdbcType = column.getJdbcType();
this.typeName = column.getTypeName();
}
}
public String getTableName() {
return tableName;
}
public String getColumnName() {
return columnName;
}
public int getLength() {
return length;
}
public boolean isNullable() {
return nullable;
}
public String getRemarks() {
return remarks;
}
public String getDefaultValue() {
return defaultValue;
}
public int getScale() {
return scale;
}
public JdbcType getJdbcType() {
return jdbcType;
}
public String getTypeName() {
return typeName;
}
@Override
public String toString() {
return "MetaInfo{" +
"tableName='" + tableName + '\'' +
", columnName='" + columnName + '\'' +
", length=" + length +
", nullable=" + nullable +
", remarks='" + remarks + '\'' +
", defaultValue='" + defaultValue + '\'' +
", scale=" + scale +
", jdbcType=" + jdbcType +
", typeName='" + typeName + '\'' +
'}';
}
}
}