动态数据源,代码结构优化

pull/3/head
liuhanqing 2021-02-02 22:20:09 +08:00
parent 831525b71f
commit 297823d1db
7 changed files with 110 additions and 77 deletions

View File

@ -17,6 +17,13 @@
<dependencies> <dependencies>
<!--校验模块的api-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>validator-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies> </dependencies>

View File

@ -1,5 +1,6 @@
package cn.stylefeng.roses.kernel.dsctn.api.exception; package cn.stylefeng.roses.kernel.dsctn.api.exception;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.dsctn.api.constants.DatasourceContainerConstants; import cn.stylefeng.roses.kernel.dsctn.api.constants.DatasourceContainerConstants;
import cn.stylefeng.roses.kernel.rule.abstracts.AbstractExceptionEnum; import cn.stylefeng.roses.kernel.rule.abstracts.AbstractExceptionEnum;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
@ -12,12 +13,12 @@ import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
*/ */
public class DatasourceContainerException extends ServiceException { public class DatasourceContainerException extends ServiceException {
public DatasourceContainerException(AbstractExceptionEnum exception, Object... params) {
super(DatasourceContainerConstants.DS_CTN_MODULE_NAME, exception.getErrorCode(), StrUtil.format(exception.getUserTip(), params));
}
public DatasourceContainerException(AbstractExceptionEnum exception) { public DatasourceContainerException(AbstractExceptionEnum exception) {
super(DatasourceContainerConstants.DS_CTN_MODULE_NAME, exception); super(DatasourceContainerConstants.DS_CTN_MODULE_NAME, exception);
} }
public DatasourceContainerException(AbstractExceptionEnum exception, String userTip) {
super(DatasourceContainerConstants.DS_CTN_MODULE_NAME, exception.getErrorCode(), userTip);
}
} }

View File

@ -1,4 +1,4 @@
package cn.stylefeng.roses.kernel.dsctn.modular.pojo; package cn.stylefeng.roses.kernel.dsctn.api.pojo.request;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.validator.validators.unique.TableUniqueValue; import cn.stylefeng.roses.kernel.validator.validators.unique.TableUniqueValue;
@ -16,7 +16,7 @@ import javax.validation.constraints.NotNull;
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class DatabaseInfoParam extends BaseRequest { public class DatabaseInfoRequest extends BaseRequest {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -32,14 +32,6 @@
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
<!--参数校验模块-->
<!--用在控制器,参数校验-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>validator-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--数据库sdk--> <!--数据库sdk-->
<!--数据库dao框架--> <!--数据库dao框架-->
<dependency> <dependency>

View File

@ -2,7 +2,7 @@ package cn.stylefeng.roses.kernel.dsctn.modular.controller;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo; import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo;
import cn.stylefeng.roses.kernel.dsctn.modular.pojo.DatabaseInfoParam; import cn.stylefeng.roses.kernel.dsctn.api.pojo.request.DatabaseInfoRequest;
import cn.stylefeng.roses.kernel.dsctn.modular.service.DatabaseInfoService; import cn.stylefeng.roses.kernel.dsctn.modular.service.DatabaseInfoService;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource; import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource; import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
@ -37,8 +37,8 @@ public class DatabaseInfoController {
* @date 2020/11/1 22:16 * @date 2020/11/1 22:16
*/ */
@PostResource(name = "新增数据源", path = "/databaseInfo/add") @PostResource(name = "新增数据源", path = "/databaseInfo/add")
public ResponseData add(@RequestBody @Validated(BaseRequest.add.class) DatabaseInfoParam databaseInfoParam) { public ResponseData add(@RequestBody @Validated(BaseRequest.add.class) DatabaseInfoRequest databaseInfoRequest) {
databaseInfoService.add(databaseInfoParam); databaseInfoService.add(databaseInfoRequest);
return new SuccessResponseData(); return new SuccessResponseData();
} }
@ -49,8 +49,8 @@ public class DatabaseInfoController {
* @date 2020/11/1 22:16 * @date 2020/11/1 22:16
*/ */
@PostResource(name = "编辑数据源", path = "/databaseInfo/edit") @PostResource(name = "编辑数据源", path = "/databaseInfo/edit")
public ResponseData edit(@RequestBody @Validated(DatabaseInfoParam.edit.class) DatabaseInfoParam databaseInfoParam) { public ResponseData edit(@RequestBody @Validated(DatabaseInfoRequest.edit.class) DatabaseInfoRequest databaseInfoRequest) {
databaseInfoService.edit(databaseInfoParam); databaseInfoService.edit(databaseInfoRequest);
return new SuccessResponseData(); return new SuccessResponseData();
} }
@ -61,8 +61,8 @@ public class DatabaseInfoController {
* @date 2020/11/1 22:18 * @date 2020/11/1 22:18
*/ */
@PostResource(name = "删除数据源", path = "/databaseInfo/delete") @PostResource(name = "删除数据源", path = "/databaseInfo/delete")
public ResponseData delete(@RequestBody @Validated(DatabaseInfoParam.delete.class) DatabaseInfoParam databaseInfoParam) { public ResponseData del(@RequestBody @Validated(DatabaseInfoRequest.delete.class) DatabaseInfoRequest databaseInfoRequest) {
databaseInfoService.delete(databaseInfoParam); databaseInfoService.del(databaseInfoRequest);
return new SuccessResponseData(); return new SuccessResponseData();
} }
@ -73,8 +73,8 @@ public class DatabaseInfoController {
* @date 2020/11/1 22:18 * @date 2020/11/1 22:18
*/ */
@GetResource(name = "查询数据源列表(带分页)", path = "/databaseInfo/page") @GetResource(name = "查询数据源列表(带分页)", path = "/databaseInfo/page")
public ResponseData page(DatabaseInfoParam databaseInfoParam) { public ResponseData findPage(DatabaseInfoRequest databaseInfoRequest) {
PageResult<DatabaseInfo> pageResult = databaseInfoService.page(databaseInfoParam); PageResult<DatabaseInfo> pageResult = databaseInfoService.findPage(databaseInfoRequest);
return new SuccessResponseData(pageResult); return new SuccessResponseData(pageResult);
} }
@ -85,8 +85,8 @@ public class DatabaseInfoController {
* @date 2021/1/23 20:29 * @date 2021/1/23 20:29
*/ */
@GetResource(name = "查询数据源详情", path = "/databaseInfo/detail") @GetResource(name = "查询数据源详情", path = "/databaseInfo/detail")
public ResponseData detail(@Validated(BaseRequest.detail.class) DatabaseInfoParam databaseInfoParam) { public ResponseData detail(@Validated(BaseRequest.detail.class) DatabaseInfoRequest databaseInfoRequest) {
DatabaseInfo databaseInfo = databaseInfoService.detail(databaseInfoParam); DatabaseInfo databaseInfo = databaseInfoService.detail(databaseInfoRequest);
return new SuccessResponseData(databaseInfo); return new SuccessResponseData(databaseInfo);
} }

View File

@ -2,9 +2,11 @@ package cn.stylefeng.roses.kernel.dsctn.modular.service;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo; import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo;
import cn.stylefeng.roses.kernel.dsctn.modular.pojo.DatabaseInfoParam; import cn.stylefeng.roses.kernel.dsctn.api.pojo.request.DatabaseInfoRequest;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* *
* *
@ -16,47 +18,58 @@ public interface DatabaseInfoService extends IService<DatabaseInfo> {
/** /**
* *
* *
* @param databaseInfoParam * @param databaseInfoRequest
* @author fengshuonan * @author fengshuonan
* @date 2020/11/1 21:47 * @date 2020/11/1 21:47
*/ */
void add(DatabaseInfoParam databaseInfoParam); void add(DatabaseInfoRequest databaseInfoRequest);
/** /**
* *
* *
* @param databaseInfoParam * @param databaseInfoRequest
* @author fengshuonan * @author fengshuonan
* @date 2020/11/1 21:47 * @date 2020/11/1 21:47
*/ */
void edit(DatabaseInfoParam databaseInfoParam); void edit(DatabaseInfoRequest databaseInfoRequest);
/** /**
* service * service
* *
* @param databaseInfoParam * @param databaseInfoRequest
* @author fengshuonan * @author fengshuonan
* @date 2020/11/1 21:47 * @date 2020/11/1 21:47
*/ */
void delete(DatabaseInfoParam databaseInfoParam); void del(DatabaseInfoRequest databaseInfoRequest);
/**
*
*
* @param databaseInfoParam
* @return
* @author fengshuonan
* @date 2020/11/1 21:47
*/
PageResult<DatabaseInfo> page(DatabaseInfoParam databaseInfoParam);
/** /**
* *
* *
* @param databaseInfoParam * @param databaseInfoRequest
* @author fengshuonan * @author fengshuonan
* @date 2021/1/23 20:30 * @date 2021/1/23 20:30
*/ */
DatabaseInfo detail(DatabaseInfoParam databaseInfoParam); DatabaseInfo detail(DatabaseInfoRequest databaseInfoRequest);
/**
*
*
* @param databaseInfoRequest
* @return
* @author fengshuonan
* @date 2020/11/1 21:47
*/
PageResult<DatabaseInfo> findPage(DatabaseInfoRequest databaseInfoRequest);
/**
*
*
* @param databaseInfoRequest
* @author liuhanqing
* @date 2021/2/2 21:21
*/
List<DatabaseInfo> findList(DatabaseInfoRequest databaseInfoRequest);
} }

View File

@ -13,7 +13,7 @@ import cn.stylefeng.roses.kernel.dsctn.context.DataSourceContext;
import cn.stylefeng.roses.kernel.dsctn.modular.entity.DatabaseInfo; 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.factory.DruidPropertiesFactory;
import cn.stylefeng.roses.kernel.dsctn.modular.mapper.DatabaseInfoMapper; import cn.stylefeng.roses.kernel.dsctn.modular.mapper.DatabaseInfoMapper;
import cn.stylefeng.roses.kernel.dsctn.modular.pojo.DatabaseInfoParam; import cn.stylefeng.roses.kernel.dsctn.api.pojo.request.DatabaseInfoRequest;
import cn.stylefeng.roses.kernel.dsctn.modular.service.DatabaseInfoService; import cn.stylefeng.roses.kernel.dsctn.modular.service.DatabaseInfoService;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSource;
@ -45,13 +45,13 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void add(DatabaseInfoParam databaseInfoParam) { public void add(DatabaseInfoRequest databaseInfoRequest) {
// 判断数据库连接是否可用 // 判断数据库连接是否可用
validateConnection(databaseInfoParam); validateConnection(databaseInfoRequest);
// 数据库中插入记录 // 数据库中插入记录
DatabaseInfo entity = parseEntity(databaseInfoParam); DatabaseInfo entity = parseEntity(databaseInfoRequest);
this.save(entity); this.save(entity);
// 往数据源容器文中添加数据源 // 往数据源容器文中添加数据源
@ -60,25 +60,23 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void edit(DatabaseInfoParam databaseInfoParam) { public void edit(DatabaseInfoRequest databaseInfoRequest) {
DatabaseInfo oldEntity = this.getById(databaseInfoParam.getDbId()); DatabaseInfo oldEntity = this.getById(databaseInfoRequest.getDbId());
if (oldEntity == null) { if (oldEntity == null) {
String userTip = StrUtil.format(EDIT_DATASOURCE_ERROR.getUserTip(), databaseInfoParam.getDbId()); throw new DatasourceContainerException(EDIT_DATASOURCE_ERROR, databaseInfoRequest.getDbId());
throw new DatasourceContainerException(EDIT_DATASOURCE_ERROR, userTip);
} }
// 不能修改数据源的名称 // 不能修改数据源的名称
if (!databaseInfoParam.getDbName().equals(oldEntity.getDbName())) { if (!databaseInfoRequest.getDbName().equals(oldEntity.getDbName())) {
String userTip = StrUtil.format(EDIT_DATASOURCE_NAME_ERROR.getUserTip(), oldEntity.getDbName()); throw new DatasourceContainerException(EDIT_DATASOURCE_NAME_ERROR, oldEntity.getDbName());
throw new DatasourceContainerException(EDIT_DATASOURCE_NAME_ERROR, userTip);
} }
// 判断数据库连接是否可用 // 判断数据库连接是否可用
validateConnection(databaseInfoParam); validateConnection(databaseInfoRequest);
// 更新库中的记录 // 更新库中的记录
BeanUtil.copyProperties(databaseInfoParam, oldEntity); BeanUtil.copyProperties(databaseInfoRequest, oldEntity);
this.updateById(oldEntity); this.updateById(oldEntity);
// 往数据源容器文中添加数据源 // 往数据源容器文中添加数据源
@ -87,11 +85,11 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void delete(DatabaseInfoParam databaseInfoParam) { public void del(DatabaseInfoRequest databaseInfoRequest) {
DatabaseInfo databaseInfo = this.getById(databaseInfoParam.getDbId()); DatabaseInfo databaseInfo = this.getById(databaseInfoRequest.getDbId());
if (databaseInfo == null) { if (databaseInfo == null) {
String userTip = StrUtil.format(DELETE_DATASOURCE_NOT_EXISTED_ERROR.getUserTip(), databaseInfoParam.getDbId()); String userTip = StrUtil.format(DELETE_DATASOURCE_NOT_EXISTED_ERROR.getUserTip(), databaseInfoRequest.getDbId());
throw new DatasourceContainerException(DELETE_DATASOURCE_NOT_EXISTED_ERROR, userTip); throw new DatasourceContainerException(DELETE_DATASOURCE_NOT_EXISTED_ERROR, userTip);
} }
@ -108,7 +106,7 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
// 删除库中的数据源记录 // 删除库中的数据源记录
LambdaUpdateWrapper<DatabaseInfo> updateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<DatabaseInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(DatabaseInfo::getDelFlag, YesOrNotEnum.Y.getCode()); updateWrapper.set(DatabaseInfo::getDelFlag, YesOrNotEnum.Y.getCode());
updateWrapper.eq(DatabaseInfo::getDbId, databaseInfoParam.getDbId()); updateWrapper.eq(DatabaseInfo::getDbId, databaseInfoRequest.getDbId());
this.update(updateWrapper); this.update(updateWrapper);
// 删除容器中的数据源记录 // 删除容器中的数据源记录
@ -116,16 +114,8 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
} }
@Override @Override
public PageResult<DatabaseInfo> page(DatabaseInfoParam databaseInfoParam) { public PageResult<DatabaseInfo> findPage(DatabaseInfoRequest databaseInfoRequest) {
LambdaQueryWrapper<DatabaseInfo> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DatabaseInfo> queryWrapper = createWrapper(databaseInfoRequest);
// 根据名称模糊查询
if (ObjectUtil.isNotNull(databaseInfoParam) && ObjectUtil.isNotEmpty(databaseInfoParam.getDbName())) {
queryWrapper.like(DatabaseInfo::getDbName, databaseInfoParam.getDbName());
}
// 查询没被删除的
queryWrapper.eq(DatabaseInfo::getDelFlag, YesOrNotEnum.N);
// 查询分页结果 // 查询分页结果
Page<DatabaseInfo> result = this.page(PageFactory.defaultPage(), queryWrapper); Page<DatabaseInfo> result = this.page(PageFactory.defaultPage(), queryWrapper);
@ -139,13 +129,20 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
return PageResultFactory.createPageResult(result); return PageResultFactory.createPageResult(result);
} }
@Override
public DatabaseInfo detail(DatabaseInfoParam databaseInfoParam) {
DatabaseInfo oldEntity = this.getById(databaseInfoParam.getDbId()); @Override
public List<DatabaseInfo> findList(DatabaseInfoRequest databaseInfoRequest) {
LambdaQueryWrapper<DatabaseInfo> wrapper = createWrapper(databaseInfoRequest);
return this.list(wrapper);
}
@Override
public DatabaseInfo detail(DatabaseInfoRequest databaseInfoRequest) {
DatabaseInfo oldEntity = this.getById(databaseInfoRequest.getDbId());
if (oldEntity == null) { if (oldEntity == null) {
String userTip = StrUtil.format(EDIT_DATASOURCE_ERROR.getUserTip(), databaseInfoParam.getDbId()); throw new DatasourceContainerException(EDIT_DATASOURCE_ERROR, databaseInfoRequest.getDbId());
throw new DatasourceContainerException(EDIT_DATASOURCE_ERROR, userTip);
} }
oldEntity.setPassword("***"); oldEntity.setPassword("***");
@ -158,7 +155,7 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
* @author fengshuonan * @author fengshuonan
* @date 2020/11/1 21:50 * @date 2020/11/1 21:50
*/ */
private void validateConnection(DatabaseInfoParam param) { private void validateConnection(DatabaseInfoRequest param) {
Connection conn = null; Connection conn = null;
try { try {
Class.forName(param.getJdbcDriver()); Class.forName(param.getJdbcDriver());
@ -183,7 +180,7 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
* @author fengshuonan * @author fengshuonan
* @date 2020/11/1 21:50 * @date 2020/11/1 21:50
*/ */
private DatabaseInfo parseEntity(DatabaseInfoParam param) { private DatabaseInfo parseEntity(DatabaseInfoRequest param) {
DatabaseInfo entity = new DatabaseInfo(); DatabaseInfo entity = new DatabaseInfo();
BeanUtil.copyProperties(param, entity); BeanUtil.copyProperties(param, entity);
return entity; return entity;
@ -225,4 +222,27 @@ public class DatabaseInfoServiceImpl extends ServiceImpl<DatabaseInfoMapper, Dat
} }
} }
/**
* wrapper
*
* @author liuhanqing
* @date 2021/1/8 14:16
*/
private LambdaQueryWrapper<DatabaseInfo> createWrapper(DatabaseInfoRequest databaseInfoRequest) {
LambdaQueryWrapper<DatabaseInfo> queryWrapper = new LambdaQueryWrapper<>();
// 根据名称模糊查询
String dbName = databaseInfoRequest.getDbName();
// 拼接sql 条件
queryWrapper.like(ObjectUtil.isNotEmpty(dbName), DatabaseInfo::getDbName, dbName);
// 查询没被删除的
queryWrapper.eq(DatabaseInfo::getDelFlag, YesOrNotEnum.N);
return queryWrapper;
}
} }