【7.6.0】【框架改造】【db】删除db-sdk-init模块,转移基础类到db-api

pull/55/head
fengshuonan 2023-05-09 12:56:11 +08:00
parent 81223aada6
commit d8bb55de8b
11 changed files with 3 additions and 456 deletions

View File

@ -22,7 +22,7 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.db.init.util;
package cn.stylefeng.roses.kernel.db.api.util;
import cn.hutool.db.DbUtil;
import cn.hutool.db.handler.RsHandler;

View File

@ -22,7 +22,7 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.db.init.util;
package cn.stylefeng.roses.kernel.db.api.util;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,43 +0,0 @@
<?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>cn.stylefeng.roses</groupId>
<artifactId>kernel-d-db</artifactId>
<version>7.6.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>db-sdk-init</artifactId>
<packaging>jar</packaging>
<dependencies>
<!--db操作的api-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>db-api</artifactId>
<version>${roses.version}</version>
</dependency>
<!--auth鉴权模块的api-->
<!--需要用auth模块的LoginContext获取当前登录用户然后填充到create_user这类字段里-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>auth-api</artifactId>
<version>${roses.version}</version>
</dependency>
<!--数据源容器的api-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>ds-container-api</artifactId>
<version>${roses.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -1,210 +0,0 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* 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.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.db.init.actuator;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.db.api.exception.enums.DbInitEnum;
import cn.stylefeng.roses.kernel.db.api.pojo.db.TableFieldInfo;
import cn.stylefeng.roses.kernel.db.api.pojo.db.TableInfo;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import cn.stylefeng.roses.kernel.db.api.util.DatabaseUtil;
import cn.stylefeng.roses.kernel.db.init.util.SqlExe;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2018-07-29 22:05
*/
@Slf4j
@Getter
@Setter
public abstract class DbInitializer {
/**
* true
*/
private Boolean fieldValidatorExceptionFlag = true;
public DbInitializer() {
}
public DbInitializer(Boolean fieldValidatorExceptionFlag) {
this.fieldValidatorExceptionFlag = fieldValidatorExceptionFlag;
}
@Resource
@Getter
private DruidProperties druidProperties;
/**
*
*
* @author fengshuonan
* @since 2018/7/30 10:30
*/
public void dbInit() {
// 初始化表
initTable();
// 校验实体和对应表结构是否有不一致的
fieldsValidate();
}
/**
*
*
* @author fengshuonan
* @since 2018/7/30 10:24
*/
private void initTable() {
// 校验参数
String tableName = this.getTableName();
String tableInitSql = this.getTableInitSql();
if (ObjectUtil.isEmpty(tableName) || ObjectUtil.isEmpty(tableInitSql)) {
if (fieldValidatorExceptionFlag) {
throw new ServiceException(DbInitEnum.INIT_TABLE_EMPTY_PARAMS);
}
}
// 列出数据库中所有的表
List<TableInfo> tableInfos = DatabaseUtil.selectTables(druidProperties);
boolean haveSmsTableFlag = false;
for (TableInfo tableInfo : tableInfos) {
if (tableInfo.getTableName().equalsIgnoreCase(tableName)) {
haveSmsTableFlag = true;
break;
}
}
// 判断数据库中是否有这张表,如果没有就初始化
if (!haveSmsTableFlag) {
SqlExe.update(tableInitSql);
log.info("初始化" + getTableName() + "成功!");
}
}
/**
*
*
* @author fengshuonan
* @since 2018/7/30 10:24
*/
private void fieldsValidate() {
//检查数据库中的字段,是否和实体字段一致
List<TableFieldInfo> tableFields = DatabaseUtil.getTableFields(druidProperties, getTableName());
if (tableFields != null && !tableFields.isEmpty()) {
//用于保存实体中不存在的字段的名称集合
List<String> fieldsNotInClass = new ArrayList<>();
//反射获取字段的所有字段名称
List<String> classFields = this.getClassFields();
for (TableFieldInfo tableField : tableFields) {
String fieldName = tableField.getColumnName();
if (!classFields.contains(fieldName.toLowerCase())) {
fieldsNotInClass.add(fieldName);
}
}
//如果集合不为空,代表有实体和数据库不一致的数据
if (!fieldsNotInClass.isEmpty()) {
log.error("实体中和数据库字段不一致的字段如下:" + JSON.toJSONString(fieldsNotInClass));
if (fieldValidatorExceptionFlag) {
throw new ServiceException(DbInitEnum.FIELD_VALIDATE_ERROR);
}
}
}
}
/**
*
*
* @author fengshuonan
* @since 2018/7/30 10:06
*/
private List<String> getClassFields() {
Class<?> entityClass = this.getEntityClass();
Field[] declaredFields = ClassUtil.getDeclaredFields(entityClass);
ArrayList<String> filedNamesUnderlineCase = new ArrayList<>();
for (Field declaredField : declaredFields) {
String fieldName = StrUtil.toUnderlineCase(declaredField.getName());
filedNamesUnderlineCase.add(fieldName);
}
// 获取父类的所有字段名称
Field[] superfields = ReflectUtil.getFields(entityClass.getSuperclass());
for (Field superfield : superfields) {
String fieldName = StrUtil.toUnderlineCase(superfield.getName());
filedNamesUnderlineCase.add(fieldName);
}
return filedNamesUnderlineCase;
}
/**
*
*
* @author stylefeng
* @since 2018/7/29 22:10
*/
protected abstract String getTableInitSql();
/**
*
*
* @author stylefeng
* @since 2018/7/29 22:10
*/
protected abstract String getTableName();
/**
*
*
* @author stylefeng
* @since 2018/7/29 22:49
*/
protected abstract Class<?> getEntityClass();
}

View File

@ -1,58 +0,0 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* 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.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.db.init.listener;
import cn.stylefeng.roses.kernel.db.init.actuator.DbInitializer;
import cn.stylefeng.roses.kernel.rule.listener.ApplicationReadyListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.core.Ordered;
import java.util.Map;
/**
*
*
* @author wangzhongqiang
* @since 2018/4/23 9:57
*/
@Slf4j
public class InitTableListener extends ApplicationReadyListener implements Ordered {
@Override
public void eventCallback(ApplicationReadyEvent event) {
Map<String, DbInitializer> beansOfType = event.getApplicationContext().getBeansOfType(DbInitializer.class);
for (Map.Entry<String, DbInitializer> entry : beansOfType.entrySet()) {
DbInitializer value = entry.getValue();
value.dbInit();
}
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE - 200;
}
}

View File

@ -24,13 +24,6 @@
<version>${roses.version}</version>
</dependency>
<!--数据库初始化模块-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>db-sdk-init</artifactId>
<version>${roses.version}</version>
</dependency>
<!--flyway数据同步-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>

View File

@ -18,7 +18,6 @@
<modules>
<module>db-api</module>
<module>db-sdk-flyway</module>
<module>db-sdk-init</module>
<module>db-sdk-mp</module>
<module>db-spring-boot-starter</module>
</modules>

View File

@ -80,14 +80,6 @@
<version>${roses.version}</version>
</dependency>
<!--数据库sdk-->
<!--数据库初始化-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>db-sdk-init</artifactId>
<version>${roses.version}</version>
</dependency>
<!--数据库sdk-->
<!--数据库dao框架-->
<dependency>

View File

@ -44,15 +44,7 @@
<!--用在控制器,参数校验-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>validator-api</artifactId>
<version>${roses.version}</version>
</dependency>
<!--数据库sdk-->
<!--数据库初始化-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>db-sdk-init</artifactId>
<artifactId>validator-api-table-unique</artifactId>
<version>${roses.version}</version>
</dependency>

View File

@ -1,59 +0,0 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* 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.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.dict.modular.init;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import cn.stylefeng.roses.kernel.db.api.sqladapter.AbstractSql;
import cn.stylefeng.roses.kernel.db.init.actuator.DbInitializer;
import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
import cn.stylefeng.roses.kernel.dict.modular.sqladapter.DictSql;
import org.springframework.stereotype.Component;
/**
*
*
* @author majianguo
* @since 2020/12/9 11:02
* @see AbstractSql
*/
@Component
public class DictInitializer extends DbInitializer {
@Override
protected String getTableInitSql() {
DruidProperties druidProperties = getDruidProperties();
return new DictSql().getSql(druidProperties.getUrl());
}
@Override
protected String getTableName() {
return "sys_dict";
}
@Override
protected Class<?> getEntityClass() {
return SysDict.class;
}
}

View File

@ -1,59 +0,0 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* 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.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.dict.modular.init;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import cn.stylefeng.roses.kernel.db.api.sqladapter.AbstractSql;
import cn.stylefeng.roses.kernel.db.init.actuator.DbInitializer;
import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
import cn.stylefeng.roses.kernel.dict.modular.sqladapter.DictTypeSql;
import org.springframework.stereotype.Component;
/**
*
*
* @author majianguo
* @since 2020/12/9 11:02
* @see AbstractSql
*/
@Component
public class DictTypeInitializer extends DbInitializer {
@Override
protected String getTableInitSql() {
DruidProperties druidProperties = getDruidProperties();
return new DictTypeSql().getSql(druidProperties.getUrl());
}
@Override
protected String getTableName() {
return "sys_dict_type";
}
@Override
protected Class<?> getEntityClass() {
return SysDictType.class;
}
}