feat:增加了oracle,postgresql,sqlserver()

dev
zhang xu 2024-04-24 21:59:35 +08:00
parent aeca277369
commit 0215b0cb5e
8 changed files with 293 additions and 118 deletions

View File

@ -22,5 +22,28 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class MuYuKVTApplication {
public static void main(String[] args) {
SpringApplication.run(MuYuKVTApplication.class);
System.out.println(" " +
" _ooOoo_\n" +
" o8888888o\n" +
" 88\" . \"88\n" +
" (| -_- |)\n" +
" O\\ = /O\n" +
" ____/`---'\\____\n" +
" .' \\\\| |// `.\n" +
" / \\\\||| : |||// \\\n" +
" / _||||| -:- |||||- \\\n" +
" | | \\\\\\ - /// | |\n" +
" | \\_| ''\\---/'' | |\n" +
" \\ .-\\__ `-` ___/-. /\n" +
" ___`. .' /--.--\\ `. . __\n" +
" .\"\" '< `.___\\_<|>_/___.' >'\"\".\n" +
" | | : `- \\`.;`\\ _ /`;.`/ - ` : | |\n" +
" \\ \\ `-. \\_ __\\ /__ _/ .-` / /\n" +
" ======`-.____`-.___\\_____/___.-`____.-'======\n" +
" `=---='\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
" // 佛祖保佑 永不宕机 永无BUG //" +
" 最好是永无BUG\n" +
"");
}
}

View File

@ -126,6 +126,12 @@ public class KvtController extends BaseController {
}
@GetMapping("/Statistics")
public Result statistics(){
return kvtService.statistics();
}

View File

@ -0,0 +1,26 @@
package com.zx.domain.req;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/4/24 17:25
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Statistics {
private Long dataAsset;
private Long assetModel;
private Long dataModel;
}

View File

@ -1,11 +1,8 @@
package com.zx.mapper;
import com.zx.domain.req.DataAsset;
import feign.Param;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import javax.lang.model.type.ArrayType;
import java.util.ArrayList;
import java.util.List;
/**
@ -64,5 +61,8 @@ public interface DataAssetMapper {
*/
public int deleteDataAssetByIds(Long[] ids);
void batchInsert(@Param("dataAssets") ArrayList<DataAsset> dataAssets);
void batchInsert(@Param("dataAssets") List<DataAsset> dataAssets);
List<DataAsset> selectDataAssetBatchId(@Param("longs") List<Long> longs);
}

View File

@ -1,6 +1,8 @@
package com.zx.mapper;
import com.muyu.common.core.domain.Result;
import com.zx.domain.req.DataAsset;
import com.zx.domain.req.JdbcClass;
import feign.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -49,4 +51,7 @@ public interface KvtMapper {
}

View File

@ -65,5 +65,10 @@ public interface KvtService {
Result dattaList(JdbcClass jdbcClass);
Result statistics();
Result assrtModelList(JdbcClass jdbcClass);
}

View File

@ -9,6 +9,7 @@ import com.zx.domain.req.AssetModel;
import com.zx.domain.req.DataAsset;
import com.zx.domain.req.JdbcClass;
import com.zx.domain.req.Statistics;
import com.zx.mapper.AssetModelMapper;
import com.zx.mapper.DataAssetMapper;
import com.zx.mapper.KvtMapper;
@ -110,8 +111,10 @@ public class KvtServiceImpl implements KvtService{
// // 连接成功,返回成功信息
// return Result.success("连接成功");
if (jdbcClass.getType().equals("MySql")){
String user= jdbcClass.getUsername();
// if (jdbcClass.getType().equals("MySql")){
// String type = jdbcClass.getType();
// type="mysql";
String user= jdbcClass.getUsername();
String pwd= jdbcClass.getPassword();
String driver="com.mysql.cj.jdbc.Driver";
// 构造数据库连接URL
@ -132,28 +135,28 @@ public class KvtServiceImpl implements KvtService{
} catch (Exception e) {
return Result.success("连接成功");
}
}else {
String user= jdbcClass.getUsername();
String pwd= jdbcClass.getPassword();
String driver="org.postgresql.Driver";
String uel="jdbc:postgresql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
if (jdbcClass.getConnectionParam()!=null&&jdbcClass.getConnectionParam()!=""){
uel=uel+"?"+jdbcClass.getConnectionParam();
}
Connection connection=null;
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
return Result.error("连接失败");
}
try {
connection=DriverManager.getConnection(uel,pwd,user);
connection.close();
} catch (SQLException e) {
return Result.error("链接失败");
}
// }else {
// String user= jdbcClass.getUsername();
// String pwd= jdbcClass.getPassword();
// String driver="org.postgresql.Driver";
// String uel="jdbc:postgresql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
// if (jdbcClass.getConnectionParam()!=null&&jdbcClass.getConnectionParam()!=""){
// uel=uel+"?"+jdbcClass.getConnectionParam();
// }
// Connection connection=null;
// try {
// Class.forName(driver);
// } catch (ClassNotFoundException e) {
// return Result.error("连接失败");
// }
// try {
// connection=DriverManager.getConnection(uel,pwd,user);
// connection.close();
// } catch (SQLException e) {
// return Result.error("链接失败");
// }
}
return Result.success("连接成功");
}
@ -260,115 +263,166 @@ public class KvtServiceImpl implements KvtService{
public List<AssetModel> getTableAssets(JdbcClass jdbcClass,String tableName){
// 初始化数据库连接信息
String user= jdbcClass.getUsername();
String pwd= jdbcClass.getPassword();
String driver="";
String url="";
url="jdbc:"+jdbcClass.getType().toLowerCase()+"://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
if (jdbcClass.getType().equals("mysql")){
driver="com.mysql.cj.jdbc.Driver";
}else if (jdbcClass.getType().equals("oracle")){
driver="oracle.jdbc.driver.OracleDriver";
}else if (jdbcClass.getType().equals("sqlserver")){
driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
}else if (jdbcClass.getType().equals("postgresql")){
driver="org.postgresql.Driver";
}
if (jdbcClass.getType().equals("oracle")){
url="jdbc:oracle:thin:@"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+":"+jdbcClass.getDatabaseName();
}
if (jdbcClass.getType().equals("postgresql")){
url="jdbc:postgresql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
}
if (jdbcClass.getType().equals("sqlserver")){
url="jdbc:sqlserver://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+";DatabaseName="+jdbcClass.getDatabaseName();
}
if (jdbcClass.getType().equals("mysql")){
url="jdbc:mysql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
}
String user= jdbcClass.getUsername(); // 获取用户名
String pwd= jdbcClass.getPassword(); // 获取密码
String driver="com.mysql.cj.jdbc.Driver"; // 初始化驱动字符串
String jdbcUrl= "jdbc:mysql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
// 初始化数据库连接URL
// 根据数据库类型构造相应的URL
// url="jdbc:"+jdbcClass.getType().toLowerCase()+"://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
// // 如果是Oracle数据库则使用特定的URL格式
// if (jdbcClass.getType().equals("oracle")){
// url="jdbc:oracle:thin:@"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+":"+jdbcClass.getDatabaseName();
// }
// // 如果是PostgreSQL数据库
// if (jdbcClass.getType().equals("postgresql")){
// url="jdbc:postgresql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
// }
// // 如果是SQL Server数据库
// if (jdbcClass.getType().equals("sqlserver")){
// url="jdbc:sqlserver://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+";DatabaseName="+jdbcClass.getDatabaseName();
// }
// // 如果是MySQL数据库
// if (jdbcClass.getType().equals("mysql")){
// url="jdbc:mysql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
// }
// 定义空的connection
Connection connection=null;
List<AssetModel> assetsData = new ArrayList<>();
HashMap<String, String> hashMap = new HashMap<>();
List<AssetModel> assetsData = new ArrayList<>(); // 用于存储表结构信息的列表
HashMap<String, String> hashMap = new HashMap<>(); // 临时使用的HashMap
// 尝试加载驱动并建立数据库连接
try {
Class.forName(jdbcClass.getJdbcDriver());
connection=DriverManager.getConnection(url,user,pwd);
//jdbcClass.getJdbcDriver()
Class.forName(driver); // 加载驱动
connection=DriverManager.getConnection(jdbcUrl,user,pwd); // 建立连接
} catch (SQLException|ClassNotFoundException e) {
throw new RuntimeException(e);
throw new RuntimeException(e); // 处理异常
}
DatabaseMetaData metaData = null;
try {
// 执行SQL查询获取表的描述信息
PreparedStatement preparedStatement = connection.prepareStatement("SELECT COLUMN_NAME,DATA_TYPE,IS_NULLABLE,COLUMN_KEY,COLUMN_DEFAULT,COLUMN_COMMENT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '"+jdbcClass.getDatabaseName()+"' AND TABLE_NAME = '"+tableName+"'");
ResultSet resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
// 遍历查询结果填充TableAssets对象列表
while (resultSet.next()){
AssetModel assetModel = new AssetModel();
assetModel.setComment(resultSet.getString("COLUMN_COMMENT"));
assetModel.setName(resultSet.getString("COLUMN_NAME"));
if (resultSet.getString("CHARACTER_MAXIMUM_LENGTH")!=null){
assetModel.setLength(resultSet.getString("CHARACTER_MAXIMUM_LENGTH"));
}else if (resultSet.getString("NUMERIC_PRECISION")!=null){
assetModel.setLength(resultSet.getString("NUMERIC_PRECISION"));
}else{
assetModel.setLength("-");
}
if (resultSet.getString("NUMERIC_SCALE")!=null){
assetModel.setDecimalPlaces(resultSet.getString("NUMERIC_SCALE"));
}else{
assetModel.setDecimalPlaces("-");
}
//是否不可为空
if (resultSet.getString("IS_NULLABLE").equals("NO")){
assetModel.setIsNull("N");
}else{
assetModel.setIsNull("Y");
}
//是否有默认值
if (resultSet.getString("COLUMN_DEFAULT")!=null){
assetModel.setDefaultValue(resultSet.getString("COLUMN_DEFAULT"));
}else{
assetModel.setDefaultValue("-");
}
assetModel.setIsDict("");
metaData = connection.getMetaData(); // 获取元数据
// 查询列信息
ResultSet columns = metaData.getColumns(jdbcClass.getDatabaseName(), jdbcClass.getModeName(), tableName,"%");
// 查询主键信息
ResultSet primaryKeys = metaData.getPrimaryKeys(jdbcClass.getDatabaseName(), jdbcClass.getModeName(), tableName);
String primaryKeyColumnName=""; // 用于存储主键列名
// 处理主键列信息
while (primaryKeys.next()){
primaryKeyColumnName=primaryKeys.getString("COLUMN_NAME");
}
// 处理所有列的信息
while (columns.next()){
AssetModel assetModel = new AssetModel(); // 创建新的AssetModel实例
// 提取并设置列信息到AssetModel
String columnName = columns.getString("COLUMN_NAME");
String typeName = columns.getString("TYPE_NAME");
int columnSize = columns.getInt("COLUMN_SIZE");
int decimalDigits = columns.getInt("DECIMAL_DIGITS");
String isNullable = columns.getString("IS_NULLABLE");
String columnDef = columns.getString("COLUMN_DEF");
String remarks = columns.getString("REMARKS");
assetModel.setCreateTime(new Date());
assetModel.setCreateBy(SecurityUtils.getUsername());
assetModel.setLength(String.valueOf(columnSize));
assetModel.setDecimalPlaces(String.valueOf(decimalDigits));
assetModel.setName(columnDef);
assetModel.setType(typeName);
assetModel.setMappingType(hashMap.get(columnName));
assetModel.setDictKey("");
assetModel.setType(resultSet.getString("DATA_TYPE"));
//是否主键
if ("PRI".equals(resultSet.getString("COLUMN_KEY"))){
assetModel.setIsDict("");
assetModel.setIsNull(isNullable.substring(0,1));
// 标记是否为主键
if (columnName.equals(primaryKeyColumnName)){
assetModel.setIsPrimaryKey("Y");
}else{
} else {
assetModel.setIsPrimaryKey("N");
}
assetModel.setCreateBy(SecurityUtils.getUsername());
assetModel.setCreateTime(new Date());
assetModel.setMappingType("String");
assetsData.add(assetModel);
// 设置列注释
if (remarks==null||remarks==""){
assetModel.setComment("-");
}else {
assetModel.setComment(remarks);
}
// 设置默认值
if (columnDef==null||columnDef==""){
assetModel.setDefaultValue("-");
}else {
assetModel.setDefaultValue(columnDef);
}
assetsData.add(assetModel); // 将处理好的信息添加到列表中
}
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
// 关闭资源
primaryKeys.close();
connection.close();
columns.close();
} catch (SQLException ex) {
throw new RuntimeException(ex); // 处理异常
}
// // 遍历查询结果填充TableAssets对象列表
// while (resultSet.next()){
// AssetModel assetModel = new AssetModel();
// assetModel.setComment(resultSet.getString("COLUMN_COMMENT"));
// assetModel.setName(resultSet.getString("COLUMN_NAME"));
// if (resultSet.getString("CHARACTER_MAXIMUM_LENGTH")!=null){
// assetModel.setLength(resultSet.getString("CHARACTER_MAXIMUM_LENGTH"));
// }else if (resultSet.getString("NUMERIC_PRECISION")!=null){
// assetModel.setLength(resultSet.getString("NUMERIC_PRECISION"));
// }else{
// assetModel.setLength("-");
// }
// if (resultSet.getString("NUMERIC_SCALE")!=null){
// assetModel.setDecimalPlaces(resultSet.getString("NUMERIC_SCALE"));
// }else{
// assetModel.setDecimalPlaces("-");
// }
//
// //是否不可为空
// if (resultSet.getString("IS_NULLABLE").equals("NO")){
// assetModel.setIsNull("N");
// }else{
// assetModel.setIsNull("Y");
// }
// //是否有默认值
// if (resultSet.getString("COLUMN_DEFAULT")!=null){
// assetModel.setDefaultValue(resultSet.getString("COLUMN_DEFAULT"));
// }else{
// assetModel.setDefaultValue("-");
// }
// assetModel.setIsDict("");
// assetModel.setDictKey("");
// assetModel.setType(resultSet.getString("DATA_TYPE"));
// //是否主键
// if ("PRI".equals(resultSet.getString("COLUMN_KEY"))){
// assetModel.setIsPrimaryKey("Y");
// }else{
// assetModel.setIsPrimaryKey("N");
// }
// assetModel.setCreateBy(SecurityUtils.getUsername());
// assetModel.setCreateTime(new Date());
// assetModel.setMappingType("String");
// assetsData.add(assetModel);
// }
// preparedStatement.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
return assetsData;
}
public AssetsData getAssets(JdbcClass jdbcClass){
String user = jdbcClass.getUsername();
String password = jdbcClass.getPassword();
String jdbcDriver = "com.mysql.cj.jdbc.Driver";
String jdbcUrl = "jdbc:mysql://"+jdbcClass.getLinkAddress()+":"+jdbcClass.getPort()+"/"+jdbcClass.getDatabaseName();
Connection conn = null;
String jdbcUrl="";
String user="";
String password="";
List<Map<String, DataKvt>> kvtList = new ArrayList<>();
Connection conn=null;
HashMap<String, String> map = new HashMap<>();
List<AssetModel> tableAssets = getTableAssets(jdbcClass,jdbcClass.getTableName());
try {
Class.forName(jdbcDriver);
Class.forName(jdbcClass.getJdbcDriver());
conn = DriverManager.getConnection(jdbcUrl, user, password);
PreparedStatement preparedStatement = conn.prepareStatement("select * from "+ jdbcClass.getTableName()+"+where 1=1");
ResultSet resultSet = preparedStatement.executeQuery();
@ -405,6 +459,12 @@ public class KvtServiceImpl implements KvtService{
public void method(JdbcClass jdbcClass){
String user=jdbcClass.getUsername();
String pwd=jdbcClass.getPassword();
String jdbc = "com.mysql.cj.jdbc.Driver";
String jdbcUrl = "jdbc:mysql://" + jdbcClass.getLinkAddress() + ":" + jdbcClass.getPort() + "/" + jdbcClass.getDatabaseName();
}
/**
@ -414,18 +474,32 @@ public class KvtServiceImpl implements KvtService{
@Override
public Result synchronousData(JdbcClass jdbcClass) {
// 构造查询MySQL数据库中表信息的SQL语句
String mysql = "SELECT TABLE_NAME t_name,TABLE_COMMENT table_comment,TABLE_ROWS table_rows,(SELECT count(*) FROM INFORMATION_SCHEMA.columns WHERE TABLE_SCHEMA = '"+jdbcClass.getDatabaseName()+"' and TABLE_NAME=t_name) fields FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='"+jdbcClass.getDatabaseName()+"'";
// 从JdbcClass实例获取数据库连接所需的用户、密码和驱动信息
String user = jdbcClass.getUsername();
String pwd = jdbcClass.getPassword();
String jdbc = "com.mysql.cj.jdbc.Driver";
// 构造数据库连接的URL
String jdbcUrl = "jdbc:mysql://" + jdbcClass.getLinkAddress() + ":" + jdbcClass.getPort() + "/" + jdbcClass.getDatabaseName();
// 声明数据库连接变量
Connection connection = null;
// 初始化数据资产列表
ArrayList<DataAsset> dataAssets = new ArrayList<>();
try {
// 加载数据库驱动
Class.forName(jdbc);
// 获取数据库连接
connection = DriverManager.getConnection(jdbcUrl, user, pwd);
// 准备SQL语句并执行查询
PreparedStatement preparedStatement = connection.prepareStatement(mysql);
//在Java的数据库编程中,PreparedStatement是一种高效的执行SQL语句的方式。
// 其中,executeQuery()是PreparedStatement类中的一个方法,用于执行SELECT语句并返回查询结果。
ResultSet resultSet = preparedStatement.executeQuery();
// 遍历查询结果,构造数据资产对象并填充信息
while (resultSet.next()) {
DataAsset dataAsset = new DataAsset();
dataAsset.setTableName(resultSet.getString("t_name"));
@ -437,19 +511,32 @@ public class KvtServiceImpl implements KvtService{
dataAsset.setCreateTime(new java.util.Date());
dataAssets.add(dataAsset);
}
// 批量插入数据资产信息
dataAssetMapper.batchInsert(dataAssets);
// 遍历数据资产列表,为每个表获取详细的资产信息,并批量插入
for (DataAsset dataAsset : dataAssets) {
List<AssetModel> tableAssets = getTableAssets(jdbcClass, dataAsset.getTableName());
tableAssets.stream().forEach(assetModel -> assetModel.setDataAssetId(dataAsset.getId()));
assetModelMapper.batchInsert(tableAssets);
}
} catch ( SQLException | ClassNotFoundException e) {
// 抛出运行时异常封装SQLException和ClassNotFoundException
throw new RuntimeException(e);
}
// 返回操作成功的结果
return Result.success();
}
// @Override
// public Result dataAssetList(DataSource dataSource) {
// DataAsset dataAsset = new DataAsset();
// dataAsset.setDataSourceId(dataSource.getId());
// List<DataAsset> dataAssets = dataAssetMapper.selectDataAssetList(dataAsset);
// return Result.success(dataAssets);
// }
@Override
public Result dattaList (JdbcClass jdbcClass){
DataAsset dataAsset = new DataAsset();
@ -458,15 +545,31 @@ public class KvtServiceImpl implements KvtService{
return Result.success(dataAssets);
}
@Override
public Result statistics() {
//查询所有书库源
List<JdbcClass> dataAssets = kvtMapper.selectList(new JdbcClass());
//获取所有的数据主键
List<Long> list = dataAssets.stream().map(JdbcClass::getId).toList();
List<DataAsset> dataAssets1 = dataAssetMapper.selectDataAssetBatchId(list);
Statistics statistics = new Statistics();
statistics.setDataAsset(Long.valueOf(dataAssets.size()));
long sum1;
long sum2=0;
sum1=dataAssets1.stream().mapToLong(value -> Long.valueOf(value.getFields())).sum();
sum2=dataAssets1.stream().mapToLong(value -> Long.valueOf(value.getTableCount())).sum();
statistics.setAssetModel(sum1);
statistics.setDataModel(sum2);
return Result.success(statistics);
}
@Override
public Result assrtModelList (JdbcClass jdbcClass){
public Result assrtModelList(JdbcClass jdbcClass){
AssetModel assetModel = new AssetModel();
assetModel.setDataAssetId(jdbcClass.getId());
List<AssetModel> assetModels = assetModelMapper.selectAssetModelList(assetModel);
return Result.success(assetModels);
}
}

View File

@ -17,10 +17,11 @@
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="jdbcDriver" column="jdbc_driver" />
</resultMap>
<sql id="selectDataSourceVo">
select id, data_source_name, link_address, port, database_name, username, password, create_by, create_time, update_by, update_time, remark from jdbc
select id, data_source_name, link_address, port, database_name, username, password, create_by, create_time, update_by, update_time, remark,jdbc_driver from jdbc
</sql>
<select id="selectList" parameterType="com.zx.domain.req.JdbcClass" resultMap="DataSourceResult">
@ -54,6 +55,7 @@ select id, data_source_name, link_address, port, database_name, username, passwo
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
<if test="jdbcDriver != null">jdbc_driver,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="dataSourceName != null">#{dataSourceName},</if>
@ -67,6 +69,8 @@ select id, data_source_name, link_address, port, database_name, username, passwo
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
<if test="jdbcDriver != null">jdbc_driver = #{jdbcDriver},</if>
</trim>
</insert>
@ -84,6 +88,7 @@ select id, data_source_name, link_address, port, database_name, username, passwo
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="jdbcDriver != null and jdbcDriver != ''"> and jdbc_driver like concat('%', #{jdbcDriver}, '%')</if>
</trim>
where id = #{id}
</update>
@ -98,4 +103,6 @@ select id, data_source_name, link_address, port, database_name, username, passwo
#{id}
</foreach>
</delete>
</mapper>