Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
MicLng 2021-10-11 23:12:34 +08:00
commit 385f03dbea
9 changed files with 192 additions and 13 deletions

View File

@ -17,6 +17,7 @@ CREATE TABLE `gen_datasource_conf` (
`username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
`driver_class_name` varchar (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据驱动名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人', `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间', `update_time` datetime DEFAULT NULL COMMENT '修改时间',

View File

@ -47,6 +47,7 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
/** /**
* 执行语句获得数据源参数 * 执行语句获得数据源参数
*
* @param statement 语句 * @param statement 语句
* @return 数据源参数 * @return 数据源参数
* @throws SQLException sql异常 * @throws SQLException sql异常
@ -61,8 +62,9 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
String username = rs.getString(DataSourceConstants.DS_USER_NAME); String username = rs.getString(DataSourceConstants.DS_USER_NAME);
String password = rs.getString(DataSourceConstants.DS_USER_PWD); String password = rs.getString(DataSourceConstants.DS_USER_PWD);
String url = rs.getString(DataSourceConstants.DS_JDBC_URL); String url = rs.getString(DataSourceConstants.DS_JDBC_URL);
String driverClassName = rs.getString(DataSourceConstants.DS_DRIVER_CLASS_NAME);
DataSourceProperty property = new DataSourceProperty(); DataSourceProperty property = new DataSourceProperty();
property.setDriverClassName(DataSourceConstants.DS_DRIVER); property.setDriverClassName(driverClassName);
property.setUsername(username); property.setUsername(username);
property.setLazy(true); property.setLazy(true);
property.setPassword(stringEncryptor.decrypt(password)); property.setPassword(stringEncryptor.decrypt(password));
@ -76,7 +78,7 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
property.setPassword(properties.getPassword()); property.setPassword(properties.getPassword());
property.setUrl(properties.getUrl()); property.setUrl(properties.getUrl());
property.setLazy(true); property.setLazy(true);
property.setDriverClassName(DataSourceConstants.DS_DRIVER); property.setDriverClassName(property.getDriverClassName());
map.put(DataSourceConstants.DS_MASTER, property); map.put(DataSourceConstants.DS_MASTER, property);
return map; return map;
} }

View File

@ -29,11 +29,6 @@ public interface DataSourceConstants {
*/ */
String DS_NAME = "name"; String DS_NAME = "name";
/**
* 默认驱动
*/
String DS_DRIVER = "com.mysql.cj.jdbc.Driver";
/** /**
* 默认数据源master * 默认数据源master
*/ */
@ -54,4 +49,9 @@ public interface DataSourceConstants {
*/ */
String DS_USER_PWD = "password"; String DS_USER_PWD = "password";
/**
* 驱动包名称
*/
String DS_DRIVER_CLASS_NAME = "driver_class_name";
} }

View File

@ -0,0 +1,76 @@
package com.pig4cloud.pig.common.datasource.support;
/**
* 数据库驱动ClassName
*
* @author huyuanxin
* @date 2021-10-08
*/
public enum DriverClassNameConstants {
/**
* MySQL Driver
* After mysql-connector-java 6
*/
MYSQL_DRIVER("com.mysql.cj.jdbc.Driver"),
/**
* Old MySQL Driver
* Before mysql-connector-java 5
*/
OLD_MYSQL_DRIVER("com.mysql.jdbc.Driver"),
/**
* Oracle Driver
*/
ORACLE_DRIVER("oracle.jdbc.OracleDriver"),
/**
* Mariadb Driver
*/
MARIADB("org.mariadb.jdbc.Driver"),
/**
* SqlServer Driver
* SqlServer 2005+
*/
SQLSERVER_DRIVER("com.microsoft.sqlserver.jdbc.SQLServerDriver"),
/**
* Old SqlServer Driver
* SqlServer 2000
*/
OLD_SQLSERVER_DRIVER(" com.microsoft.jdbc.sqlserver.SQLServerDriver"),
/**
* DB2 Driver
*/
DB2("com.ibm.db2.jcc.DB2Driver"),
/**
* PostgreSQL Driver
*/
POSTGRE_SQL("org.postgresql.Driver"),
/**
* Neo4j Bolt Driver
*/
NEO4J_BOLT("org.neo4j.jdbc.bolt.BoltDriver"),
/**
* Neo4j Http Driver
*/
NEO4J_HTTP("org.neo4j.jdbc.http.HttpDriver");
private final String driverClassName;
DriverClassNameConstants(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getDriverClassName() {
return driverClassName;
}
}

View File

@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.pig4cloud.pig.common.mybatis.config.MybatisPlusMetaObjectHandler; import com.pig4cloud.pig.common.mybatis.config.MybatisPlusMetaObjectHandler;
import com.pig4cloud.pig.common.mybatis.plugins.LimitInterceptor;
import com.pig4cloud.pig.common.mybatis.resolver.SqlFilterArgumentResolver; import com.pig4cloud.pig.common.mybatis.resolver.SqlFilterArgumentResolver;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -53,7 +54,7 @@ public class MybatisAutoConfiguration implements WebMvcConfigurer {
@Bean @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() { public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new LimitInterceptor(DbType.MYSQL));
return interceptor; return interceptor;
} }

View File

@ -0,0 +1,61 @@
package com.pig4cloud.pig.common.mybatis.plugins;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ParameterUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.sql.SQLException;
/**
* 分页拦截器
* <p>
* 重构分页插件, size 小于 0 , 直接设置为 0, 防止错误查询全表
*
* @author seven
* @since 2021年10月11日
*/
@Data
@NoArgsConstructor
public class LimitInterceptor extends PaginationInnerInterceptor {
/**
* 数据库类型
* <p>
* 查看 {@link #findIDialect(Executor)} 逻辑
*/
private DbType dbType;
/**
* 方言实现类
* <p>
* 查看 {@link #findIDialect(Executor)} 逻辑
*/
private IDialect dialect;
public LimitInterceptor(DbType dbType) {
this.dbType = dbType;
}
public LimitInterceptor(IDialect dialect) {
this.dialect = dialect;
}
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
IPage<?> page = ParameterUtils.findPage(parameter).orElse(null);
// size 小于 0 直接设置为 0 , 即不查询任何数据
if (null != page && page.getSize() < 0) {
page.setSize(0);
}
super.beforeQuery(executor, ms, page, rowBounds, resultHandler, boundSql);
}
}

View File

@ -20,11 +20,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pig.codegen.entity.GenDatasourceConf; import com.pig4cloud.pig.codegen.entity.GenDatasourceConf;
import com.pig4cloud.pig.codegen.service.GenDatasourceConfService; import com.pig4cloud.pig.codegen.service.GenDatasourceConfService;
import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.R;
import com.pig4cloud.pig.common.datasource.support.DriverClassNameConstants;
import com.pig4cloud.pig.common.log.annotation.SysLog; import com.pig4cloud.pig.common.log.annotation.SysLog;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/** /**
* 数据源管理 * 数据源管理
* *
@ -37,10 +42,13 @@ import org.springframework.web.bind.annotation.*;
@Api(value = "dsconf", tags = "数据源管理模块") @Api(value = "dsconf", tags = "数据源管理模块")
public class GenDsConfController { public class GenDsConfController {
private static List<String> driverList = null;
private final GenDatasourceConfService datasourceConfService; private final GenDatasourceConfService datasourceConfService;
/** /**
* 分页查询 * 分页查询
*
* @param page 分页对象 * @param page 分页对象
* @param datasourceConf 数据源表 * @param datasourceConf 数据源表
* @return * @return
@ -52,6 +60,7 @@ public class GenDsConfController {
/** /**
* 查询全部数据源 * 查询全部数据源
*
* @return * @return
*/ */
@GetMapping("/list") @GetMapping("/list")
@ -61,6 +70,7 @@ public class GenDsConfController {
/** /**
* 通过id查询数据源表 * 通过id查询数据源表
*
* @param id id * @param id id
* @return R * @return R
*/ */
@ -71,6 +81,7 @@ public class GenDsConfController {
/** /**
* 新增数据源表 * 新增数据源表
*
* @param datasourceConf 数据源表 * @param datasourceConf 数据源表
* @return R * @return R
*/ */
@ -82,6 +93,7 @@ public class GenDsConfController {
/** /**
* 修改数据源表 * 修改数据源表
*
* @param conf 数据源表 * @param conf 数据源表
* @return R * @return R
*/ */
@ -93,6 +105,7 @@ public class GenDsConfController {
/** /**
* 通过id删除数据源表 * 通过id删除数据源表
*
* @param id id * @param id id
* @return R * @return R
*/ */
@ -102,4 +115,21 @@ public class GenDsConfController {
return R.ok(datasourceConfService.removeByDsId(id)); return R.ok(datasourceConfService.removeByDsId(id));
} }
/**
* 获得支持的数据库驱动
*
* @return 数据库驱动列表
*/
@SysLog("获得支持的数据库驱动")
@GetMapping("/driver")
public R<List<String>> driverList() {
return Optional.ofNullable(driverList).map(R::ok).orElseGet(() -> {
driverList = new ArrayList<>();
for (DriverClassNameConstants driverClassNameConstant : DriverClassNameConstants.values()) {
driverList.add(driverClassNameConstant.getDriverClassName());
}
return R.ok(driverList);
});
}
} }

View File

@ -59,6 +59,11 @@ public class GenDatasourceConf extends BaseEntity {
*/ */
private String password; private String password;
/**
* 驱动类型
*/
private String driverClassName;
/** /**
* 删除标记 * 删除标记
*/ */

View File

@ -24,7 +24,6 @@ import com.pig4cloud.pig.codegen.entity.GenDatasourceConf;
import com.pig4cloud.pig.codegen.mapper.GenDatasourceConfMapper; import com.pig4cloud.pig.codegen.mapper.GenDatasourceConfMapper;
import com.pig4cloud.pig.codegen.service.GenDatasourceConfService; import com.pig4cloud.pig.codegen.service.GenDatasourceConfService;
import com.pig4cloud.pig.common.core.util.SpringContextHolder; import com.pig4cloud.pig.common.core.util.SpringContextHolder;
import com.pig4cloud.pig.common.datasource.support.DataSourceConstants;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.StringEncryptor;
@ -52,6 +51,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
/** /**
* 保存数据源并且加密 * 保存数据源并且加密
*
* @param conf * @param conf
* @return * @return
*/ */
@ -73,6 +73,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
/** /**
* 更新数据源 * 更新数据源
*
* @param conf 数据源信息 * @param conf 数据源信息
* @return * @return
*/ */
@ -98,6 +99,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
/** /**
* 通过数据源名称删除 * 通过数据源名称删除
*
* @param dsId 数据源ID * @param dsId 数据源ID
* @return * @return
*/ */
@ -111,6 +113,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
/** /**
* 添加动态数据源 * 添加动态数据源
*
* @param conf 数据源信息 * @param conf 数据源信息
*/ */
@Override @Override
@ -120,7 +123,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
dataSourceProperty.setUrl(conf.getUrl()); dataSourceProperty.setUrl(conf.getUrl());
dataSourceProperty.setUsername(conf.getUsername()); dataSourceProperty.setUsername(conf.getUsername());
dataSourceProperty.setPassword(conf.getPassword()); dataSourceProperty.setPassword(conf.getPassword());
dataSourceProperty.setDriverClassName(DataSourceConstants.DS_DRIVER); dataSourceProperty.setDriverClassName(conf.getDriverClassName());
dataSourceProperty.setLazy(true); dataSourceProperty.setLazy(true);
DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty); DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);
SpringContextHolder.getBean(DynamicRoutingDataSource.class).addDataSource(dataSourceProperty.getPoolName(), SpringContextHolder.getBean(DynamicRoutingDataSource.class).addDataSource(dataSourceProperty.getPoolName(),
@ -129,6 +132,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
/** /**
* 校验数据源配置是否有效 * 校验数据源配置是否有效
*
* @param conf 数据源信息 * @param conf 数据源信息
* @return 有效/无效 * @return 有效/无效
*/ */
@ -136,8 +140,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
public Boolean checkDataSource(GenDatasourceConf conf) { public Boolean checkDataSource(GenDatasourceConf conf) {
try { try {
DriverManager.getConnection(conf.getUrl(), conf.getUsername(), conf.getPassword()); DriverManager.getConnection(conf.getUrl(), conf.getUsername(), conf.getPassword());
} } catch (SQLException e) {
catch (SQLException e) {
log.error("数据源配置 {} , 获取链接失败", conf.getName(), e); log.error("数据源配置 {} , 获取链接失败", conf.getName(), e);
return Boolean.FALSE; return Boolean.FALSE;
} }