【dbs】整理dbs模块的字段和业务

pull/3/head
fengshuonan 2020-12-19 16:32:17 +08:00
parent fd374e81fa
commit 3e0b4e60a8
8 changed files with 103 additions and 91 deletions

View File

@ -1,9 +1,9 @@
package cn.stylefeng.roses.kernel.db.api.factory;
import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.pool.DruidDataSource;
import cn.stylefeng.roses.kernel.db.api.enums.DbTypeEnum;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import java.sql.SQLException;
@ -15,7 +15,7 @@ import java.sql.SQLException;
* @date 2020/10/16 15:59
*/
@Slf4j
public class DruidFactory {
public class DruidDatasourceFactory {
/**
* druid

View File

@ -1,8 +1,8 @@
package cn.stylefeng.roses.kernel.db.starter;
import com.alibaba.druid.pool.DruidDataSource;
import cn.stylefeng.roses.kernel.db.api.factory.DruidFactory;
import cn.stylefeng.roses.kernel.db.api.factory.DruidDatasourceFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@ -32,7 +32,7 @@ public class GunsDataSourceAutoConfiguration {
@Bean(initMethod = "init")
@ConditionalOnMissingBean(DataSource.class)
public DruidDataSource druidDataSource(DruidProperties druidProperties) {
return DruidFactory.createDruidDataSource(druidProperties);
return DruidDatasourceFactory.createDruidDataSource(druidProperties);
}
}

View File

@ -1,10 +1,10 @@
package cn.stylefeng.roses.kernel.dsctn.modular.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -24,8 +24,8 @@ public class DatabaseInfo extends BaseEntity {
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
@TableId(value = "db_id", type = IdType.ASSIGN_ID)
private Long dbId;
/**
*
@ -39,11 +39,17 @@ public class DatabaseInfo extends BaseEntity {
@TableField("jdbc_driver")
private String jdbcDriver;
/**
* jdbcurl
*/
@TableField("jdbc_url")
private String jdbcUrl;
/**
*
*/
@TableField("user_name")
private String userName;
@TableField("username")
private String username;
/**
*
@ -51,16 +57,16 @@ public class DatabaseInfo extends BaseEntity {
@TableField("password")
private String password;
/**
* jdbcurl
*/
@TableField("jdbc_url")
private String jdbcUrl;
/**
*
*/
@TableField("remarks")
private String remarks;
/**
* Y-N-
*/
@TableField("del_flag")
private String delFlag;
}

View File

@ -9,7 +9,7 @@ import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo;
* @author fengshuonan
* @date 2020/11/1 21:44
*/
public class DruidFactory {
public class DruidPropertiesFactory {
/**
* druid
@ -20,7 +20,7 @@ public class DruidFactory {
public static DruidProperties createDruidProperties(DatabaseInfo databaseInfo) {
DruidProperties druidProperties = new DruidProperties();
druidProperties.setDriverClassName(databaseInfo.getJdbcDriver());
druidProperties.setUsername(databaseInfo.getUserName());
druidProperties.setUsername(databaseInfo.getUsername());
druidProperties.setPassword(databaseInfo.getPassword());
druidProperties.setUrl(databaseInfo.getJdbcUrl());
return druidProperties;

View File

@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
*
@ -24,15 +23,15 @@ public class DatabaseInfoParam extends BaseRequest {
/**
* id
*/
@NotNull(message = "id不能为空请检查id参数", groups = {edit.class, delete.class, detail.class})
private Long id;
@NotNull(message = "dbId不能为空", groups = {edit.class, delete.class, detail.class})
private Long dbId;
/**
*
*/
@NotBlank(message = "数据库名称不能为空请检查dbName参数", groups = {add.class, edit.class})
@NotBlank(message = "数据库名称不能为空", groups = {add.class, edit.class})
@TableUniqueValue(
message = "数据库名称存在重复请检查dbName参数",
message = "数据库名称存在重复",
groups = {add.class, edit.class},
tableName = "sys_database_info",
columnName = "db_name")
@ -41,9 +40,15 @@ public class DatabaseInfoParam extends BaseRequest {
/**
* jdbc
*/
@NotBlank(message = "jdbc的驱动类型请检查jdbcDriver参数", groups = {add.class, edit.class})
@NotBlank(message = "jdbc的驱动类型为空", groups = {add.class, edit.class})
private String jdbcDriver;
/**
* jdbcurl
*/
@NotBlank(message = "jdbc的url请检查jdbcUrl参数", groups = {add.class, edit.class})
private String jdbcUrl;
/**
*
*/
@ -56,20 +61,9 @@ public class DatabaseInfoParam extends BaseRequest {
@NotBlank(message = "数据库连接密码请检查password参数", groups = {add.class, edit.class})
private String password;
/**
* jdbcurl
*/
@NotBlank(message = "jdbc的url请检查jdbcUrl参数", groups = {add.class, edit.class})
private String jdbcUrl;
/**
*
*/
private String remarks;
/**
*
*/
private Date createTime;
}

View File

@ -3,21 +3,24 @@ package cn.stylefeng.roses.kernel.dsctn.modular.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo;
import cn.stylefeng.roses.kernel.dsctn.modular.factory.DruidFactory;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.stylefeng.roses.kernel.db.api.factory.DruidDatasourceFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.dsctn.api.exception.DatasourceContainerException;
import cn.stylefeng.roses.kernel.dsctn.context.DataSourceContext;
import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo;
import cn.stylefeng.roses.kernel.dsctn.modular.factory.DruidPropertiesFactory;
import cn.stylefeng.roses.kernel.dsctn.modular.mapper.DatabaseInfoMapper;
import cn.stylefeng.roses.kernel.dsctn.modular.pojo.DatabaseInfoParam;
import cn.stylefeng.roses.kernel.dsctn.modular.service.DatabaseInfoService;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -51,35 +54,17 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
DatabaseInfo entity = parseEntity(databaseInfoParam);
this.save(entity);
// 先判断context中是否有了这个数据源
DataSource dataSource = DataSourceContext.getDataSources().get(databaseInfoParam.getDbName());
if (dataSource != null) {
String userTip = StrUtil.format(DATASOURCE_NAME_REPEAT.getUserTip(), databaseInfoParam.getDbName());
throw new DatasourceContainerException(DATASOURCE_NAME_REPEAT, userTip);
}
// 往上下文中添加数据源
DruidProperties druidProperties = DruidFactory.createDruidProperties(entity);
DruidDataSource druidDataSource = cn.stylefeng.roses.kernel.db.api.factory.DruidFactory.createDruidDataSource(druidProperties);
DataSourceContext.addDataSource(databaseInfoParam.getDbName(), druidDataSource, druidProperties);
// 初始化数据源
try {
druidDataSource.init();
} catch (SQLException exception) {
log.error("初始化数据源异常!", exception);
String userTip = StrUtil.format(INIT_DATASOURCE_ERROR.getUserTip(), exception.getMessage());
throw new DatasourceContainerException(INIT_DATASOURCE_ERROR, userTip);
}
// 往数据源容器文中添加数据源
addDataSourceToContext(entity, false);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void edit(DatabaseInfoParam databaseInfoParam) {
DatabaseInfo oldEntity = this.getById(databaseInfoParam.getId());
DatabaseInfo oldEntity = this.getById(databaseInfoParam.getDbId());
if (oldEntity == null) {
String userTip = StrUtil.format(EDIT_DATASOURCE_ERROR.getUserTip(), databaseInfoParam.getId());
String userTip = StrUtil.format(EDIT_DATASOURCE_ERROR.getUserTip(), databaseInfoParam.getDbId());
throw new DatasourceContainerException(EDIT_DATASOURCE_ERROR, userTip);
}
@ -96,32 +81,17 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
BeanUtil.copyProperties(databaseInfoParam, oldEntity);
this.updateById(oldEntity);
// 删除容器中的数据源记录
DataSourceContext.removeDataSource(oldEntity.getDbName());
// 往上下文中添加数据源
DruidProperties druidProperties = DruidFactory.createDruidProperties(oldEntity);
DruidDataSource druidDataSource = cn.stylefeng.roses.kernel.db.api.factory.DruidFactory.createDruidDataSource(druidProperties);
DataSourceContext.addDataSource(databaseInfoParam.getDbName(), druidDataSource, druidProperties);
// 初始化数据源
try {
druidDataSource.init();
} catch (SQLException exception) {
log.error("初始化数据源异常!", exception);
String userTip = StrUtil.format(INIT_DATASOURCE_ERROR.getUserTip(), exception.getMessage());
throw new DatasourceContainerException(INIT_DATASOURCE_ERROR, userTip);
}
// 往数据源容器文中添加数据源
addDataSourceToContext(oldEntity, true);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(DatabaseInfoParam param) {
public void delete(DatabaseInfoParam databaseInfoParam) {
DatabaseInfo databaseInfo = this.getById(param.getId());
DatabaseInfo databaseInfo = this.getById(databaseInfoParam.getDbId());
if (databaseInfo == null) {
String userTip = StrUtil.format(DELETE_DATASOURCE_NOT_EXISTED_ERROR.getUserTip(), param.getId());
String userTip = StrUtil.format(DELETE_DATASOURCE_NOT_EXISTED_ERROR.getUserTip(), databaseInfoParam.getDbId());
throw new DatasourceContainerException(DELETE_DATASOURCE_NOT_EXISTED_ERROR, userTip);
}
@ -136,7 +106,10 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
}
// 删除库中的数据源记录
this.removeById(param.getId());
LambdaUpdateWrapper<DatabaseInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(DatabaseInfo::getDelFlag, YesOrNotEnum.Y.getCode());
updateWrapper.eq(DatabaseInfo::getDbId, databaseInfoParam.getDbId());
this.update(updateWrapper);
// 删除容器中的数据源记录
DataSourceContext.removeDataSource(databaseInfo.getDbName());
@ -151,6 +124,9 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
queryWrapper.like(DatabaseInfo::getDbName, databaseInfoParam.getDbName());
}
// 查询没被删除的
queryWrapper.eq(DatabaseInfo::getDelFlag, YesOrNotEnum.N);
// 查询分页结果
Page<DatabaseInfo> result = this.page(PageFactory.defaultPage(), queryWrapper);
@ -200,4 +176,40 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
return entity;
}
/**
*
*
* @param databaseInfo
* @author fengshuonan
* @date 2020/12/19 16:16
*/
private void addDataSourceToContext(DatabaseInfo databaseInfo, Boolean removeOldDatasource) {
// 删除容器中的数据源记录
if (removeOldDatasource) {
DataSourceContext.removeDataSource(databaseInfo.getDbName());
} else {
// 先判断context中是否有了这个数据源
DataSource dataSource = DataSourceContext.getDataSources().get(databaseInfo.getDbName());
if (dataSource != null) {
String userTip = StrUtil.format(DATASOURCE_NAME_REPEAT.getUserTip(), databaseInfo.getDbName());
throw new DatasourceContainerException(DATASOURCE_NAME_REPEAT, userTip);
}
}
// 往数据源容器文中添加数据源
DruidProperties druidProperties = DruidPropertiesFactory.createDruidProperties(databaseInfo);
DruidDataSource druidDataSource = DruidDatasourceFactory.createDruidDataSource(druidProperties);
DataSourceContext.addDataSource(databaseInfo.getDbName(), druidDataSource, druidProperties);
// 初始化数据源
try {
druidDataSource.init();
} catch (SQLException exception) {
log.error("初始化数据源异常!", exception);
String userTip = StrUtil.format(INIT_DATASOURCE_ERROR.getUserTip(), exception.getMessage());
throw new DatasourceContainerException(INIT_DATASOURCE_ERROR, userTip);
}
}
}

View File

@ -1,10 +1,10 @@
package cn.stylefeng.roses.kernel.dsctn.context;
import cn.stylefeng.roses.kernel.db.api.factory.DruidDatasourceFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import cn.stylefeng.roses.kernel.dsctn.persist.DataBaseInfoPersistence;
import com.alibaba.druid.pool.DruidDataSource;
import cn.stylefeng.roses.kernel.db.api.factory.DruidFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import javax.sql.DataSource;
import java.util.Map;
@ -136,7 +136,7 @@ public class DataSourceContext {
//添加到全局配置里
DATA_SOURCES_CONF.put(dataSourceName, druidProperties);
return DruidFactory.createDruidDataSource(druidProperties);
return DruidDatasourceFactory.createDruidDataSource(druidProperties);
}
}

View File

@ -2,11 +2,11 @@ package cn.stylefeng.roses.kernel.dsctn.listener;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.dsctn.context.DataSourceContext;
import com.alibaba.druid.pool.DruidDataSource;
import cn.stylefeng.roses.kernel.db.api.factory.DruidFactory;
import cn.stylefeng.roses.kernel.db.api.factory.DruidDatasourceFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties;
import cn.stylefeng.roses.kernel.dsctn.api.exception.DatasourceContainerException;
import cn.stylefeng.roses.kernel.dsctn.context.DataSourceContext;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
import org.springframework.context.ApplicationListener;
@ -64,7 +64,7 @@ public class DataSourceInitListener implements ApplicationListener<ApplicationCo
druidProperties.setPassword(dataSourcePassword);
// 创建主数据源
DruidDataSource druidDataSource = DruidFactory.createDruidDataSource(druidProperties);
DruidDataSource druidDataSource = DruidDatasourceFactory.createDruidDataSource(druidProperties);
// 初始化数据源容器
try {