Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
workflow
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
2
议题
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
黄夏豪
workflow
Commits
da3be51d
提交
da3be51d
authored
5月 14, 2021
作者:
黄承天
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[数据源模块]初始提交
上级
d0a91b50
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
273 行增加
和
20 行删除
+273
-20
pom.xml
pom.xml
+26
-20
DataSourceInfo.java
.../java/com/tykj/workflowcore/ds/entity/DataSourceInfo.java
+33
-0
DataSourceInfoRepository.java
.../workflowcore/ds/repository/DataSourceInfoRepository.java
+10
-0
DataOperation.java
.../java/com/tykj/workflowcore/ds/service/DataOperation.java
+126
-0
DataSourceManager.java
...a/com/tykj/workflowcore/ds/service/DataSourceManager.java
+66
-0
application.yml
src/main/resources/application.yml
+12
-0
没有找到文件。
pom.xml
浏览文件 @
da3be51d
...
...
@@ -32,7 +32,7 @@
<scope>
test
</scope>
</dependency>
<!-- 下面是我引入的东西 zsp-->
<!-- 下面是我引入的东西 zsp-->
<dependency>
<groupId>
com.github.caspar-chen
</groupId>
<artifactId>
swagger-ui-layer
</artifactId>
...
...
@@ -100,7 +100,7 @@
<artifactId>
junit
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- caffeine缓存 -->
<!-- caffeine缓存 -->
<dependency>
<groupId>
com.github.ben-manes.caffeine
</groupId>
<artifactId>
caffeine
</artifactId>
...
...
@@ -110,30 +110,36 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-cache
</artifactId>
</dependency>
<!--动态数据源组件-->
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
dynamic-datasource-spring-boot-starter
</artifactId>
<version>
3.3.2
</version>
</dependency>
</dependencies>
<build>
<resources>
<!-- <resource>-->
<!-- <directory>src/main/java</directory>-->
<!-- <includes>-->
<!-- <include>**/*</include>-->
<!-- </includes>-->
<!-- <excludes>-->
<!-- <exclude>**/.svn/*</exclude>-->
<!-- </excludes>-->
<!-- <filtering>false</filtering>-->
<!-- </resource>-->
<
resource
>
<directory>
${project.basedir}/src/main/resources
</directory
>
<targetPath>
META-INF/resources/
</targetPath
>
<
/resource
>
<!-- <resource>-->
<!-- <directory>src/main/java</directory>-->
<!-- <includes>-->
<!-- <include>**/*</include>-->
<!-- </includes>-->
<!-- <excludes>-->
<!-- <exclude>**/.svn/*</exclude>-->
<!-- </excludes>-->
<!-- <filtering>false</filtering>-->
<!-- </resource>-->
<
!-- <resource>--
>
<!-- <directory>${project.basedir}/src/main/resources</directory>--
>
<!-- <targetPath>META-INF/resources/</targetPath>--
>
<
!-- </resource>--
>
</resources>
<plugins>
<!-- <plugin>--
>
<!-- <groupId>org.springframework.boot</groupId>--
>
<!-- <artifactId>spring-boot-maven-plugin</artifactId>--
>
<!-- </plugin>--
>
<plugin
>
<groupId>
org.springframework.boot
</groupId
>
<artifactId>
spring-boot-maven-plugin
</artifactId
>
</plugin
>
<plugin>
<artifactId>
maven-surefire-plugin
</artifactId>
...
...
src/main/java/com/tykj/workflowcore/ds/entity/DataSourceInfo.java
0 → 100644
浏览文件 @
da3be51d
package
com
.
tykj
.
workflowcore
.
ds
.
entity
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.persistence.Entity
;
import
javax.persistence.GeneratedValue
;
import
javax.persistence.GenerationType
;
import
javax.persistence.Id
;
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
DataSourceInfo
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Integer
id
;
private
String
name
;
private
String
url
;
private
String
username
;
private
String
password
;
private
String
driverClassName
;
}
src/main/java/com/tykj/workflowcore/ds/repository/DataSourceInfoRepository.java
0 → 100644
浏览文件 @
da3be51d
package
com
.
tykj
.
workflowcore
.
ds
.
repository
;
import
com.tykj.workflowcore.ds.entity.DataSourceInfo
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.stereotype.Repository
;
@Repository
public
interface
DataSourceInfoRepository
extends
JpaRepository
<
DataSourceInfo
,
Integer
>
{
}
src/main/java/com/tykj/workflowcore/ds/service/DataOperation.java
0 → 100644
浏览文件 @
da3be51d
package
com
.
tykj
.
workflowcore
.
ds
.
service
;
import
com.tykj.workflowcore.model_layer.entity.ColumnInfo
;
import
com.tykj.workflowcore.model_layer.entity.TableInfo
;
import
com.tykj.workflowcore.model_layer.entity.vo.ColumnVO
;
import
com.tykj.workflowcore.model_layer.entity.vo.TableVO
;
import
com.tykj.workflowcore.model_layer.service.ModelService
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.jdbc.core.JdbcTemplate
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.stream.Collectors
;
import
static
java
.
lang
.
String
.
format
;
import
static
java
.
util
.
Objects
.
nonNull
;
/**
*
*/
@Service
public
class
DataOperation
{
@Autowired
private
JdbcTemplate
jdbcTemplate
;
@Autowired
private
DataSourceManager
dataSourceManager
;
@Autowired
private
ModelService
modelService
;
public
void
copyTableFromDataSource
(
String
tableName
,
String
dataSourceName
)
{
dataSourceManager
.
switchToDataSource
(
dataSourceName
);
String
sql
=
String
.
valueOf
(
jdbcTemplate
.
queryForMap
(
format
(
"show create table %s"
,
tableName
)).
get
(
"sql"
));
dataSourceManager
.
clear
();
jdbcTemplate
.
execute
(
sql
);
}
public
void
syncAllTablesFromDataSource
(
String
dataSourceName
)
{
dataSourceManager
.
switchToDataSource
(
dataSourceName
);
List
<
String
>
tableNames
=
getAllTableNames
();
for
(
String
tableName
:
tableNames
)
{
TableVO
tableVO
=
new
TableVO
();
tableVO
.
setModelName
(
tableName
);
tableVO
.
setModelType
(
3
);
tableVO
.
setDataList
(
getColumns
(
tableName
));
modelService
.
newTable
(
tableVO
);
}
}
private
List
<
String
>
getAllTableNames
()
{
return
jdbcTemplate
.
queryForList
(
"show tables"
).
stream
()
.
map
(
resultMap
->
String
.
valueOf
(
resultMap
.
get
(
"Tables_in_center"
)))
.
collect
(
Collectors
.
toList
());
}
private
List
<
ColumnVO
>
getColumns
(
String
tableName
)
{
return
jdbcTemplate
.
queryForList
(
format
(
"desc %s"
,
tableName
)).
stream
()
.
map
(
this
::
columnVO
)
.
collect
(
Collectors
.
toList
());
}
private
ColumnVO
columnVO
(
Map
<
String
,
Object
>
columnInfoMap
)
{
String
columnName
=
String
.
valueOf
(
columnInfoMap
.
get
(
"Field"
));
String
typeValue
=
String
.
valueOf
(
columnInfoMap
.
get
(
"Type"
));
//
boolean
hasLength
=
typeValue
.
contains
(
"("
)
&&
typeValue
.
contains
(
")"
);
String
columnType
;
Integer
columnLength
;
if
(
hasLength
)
{
//
columnType
=
typeValue
.
substring
(
0
,
typeValue
.
indexOf
(
"("
));
columnLength
=
Integer
.
valueOf
(
typeValue
.
substring
(
typeValue
.
indexOf
(
"("
)
+
1
,
typeValue
.
indexOf
(
")"
)));
}
else
{
columnType
=
typeValue
;
columnLength
=
0
;
}
String
keyValue
=
String
.
valueOf
(
columnInfoMap
.
get
(
"Key"
));
Integer
isPrimary
=
Objects
.
equals
(
keyValue
,
"PRI"
)
?
0
:
1
;
return
new
ColumnVO
(
null
,
isPrimary
,
columnType
,
columnName
,
Strings
.
EMPTY
,
columnLength
,
Strings
.
EMPTY
);
}
public
void
syncData
(
String
tableName
)
{
List
<
Map
<
String
,
Object
>>
dataList
=
jdbcTemplate
.
queryForList
(
format
(
"select * from %s"
),
tableName
);
for
(
Map
<
String
,
Object
>
data
:
dataList
)
{
String
sql
=
insertSql
(
tableName
,
data
);
}
}
private
String
insertSql
(
String
tableName
,
Map
<
String
,
Object
>
data
)
{
StringBuilder
result
=
new
StringBuilder
();
result
.
append
(
"insert info "
).
append
(
tableName
).
append
(
" "
);
StringBuilder
names
=
new
StringBuilder
();
names
.
append
(
"("
);
StringBuilder
values
=
new
StringBuilder
();
values
.
append
(
"("
);
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
data
.
entrySet
())
{
if
(
nonNull
(
entry
.
getValue
())){
names
.
append
(
entry
.
getKey
()).
append
(
","
);
values
.
append
(
entry
.
getValue
()).
append
(
","
);
}
}
names
.
delete
(
names
.
indexOf
(
","
),
names
.
indexOf
(
","
)
+
1
);
values
.
delete
(
values
.
indexOf
(
","
),
values
.
indexOf
(
","
)
+
1
);
names
.
append
(
")"
);
values
.
append
(
")"
);
result
.
append
(
names
);
result
.
append
(
" values "
);
result
.
append
(
values
);
return
result
.
toString
();
}
}
src/main/java/com/tykj/workflowcore/ds/service/DataSourceManager.java
0 → 100644
浏览文件 @
da3be51d
package
com
.
tykj
.
workflowcore
.
ds
.
service
;
import
com.baomidou.dynamic.datasource.DynamicRoutingDataSource
;
import
com.baomidou.dynamic.datasource.creator.BasicDataSourceCreator
;
import
com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty
;
import
com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder
;
import
com.tykj.workflowcore.ds.entity.DataSourceInfo
;
import
com.tykj.workflowcore.ds.repository.DataSourceInfoRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
javax.sql.DataSource
;
import
java.util.List
;
@Service
public
class
DataSourceManager
{
@Autowired
private
DataSourceInfoRepository
dataSourceInfoRepository
;
@Autowired
private
DataSource
dataSource
;
private
BasicDataSourceCreator
dataSourceCreator
=
new
BasicDataSourceCreator
();
private
void
save
(
DataSourceInfo
dataSourceInfo
)
{
dataSourceInfoRepository
.
save
(
dataSourceInfo
);
}
private
void
deleteById
(
Integer
id
)
{
}
private
List
<
DataSourceInfo
>
findAll
()
{
return
dataSourceInfoRepository
.
findAll
();
}
private
DataSourceInfo
findById
(
Integer
id
)
{
return
dataSourceInfoRepository
.
findById
(
id
).
orElseThrow
(()
->
new
RuntimeException
(
"未找到该id的数据"
));
}
public
void
init
()
{
List
<
DataSourceInfo
>
dataSourceInfos
=
dataSourceInfoRepository
.
findAll
();
dataSourceInfos
.
forEach
(
this
::
initDataSource
);
}
public
void
initDataSource
(
DataSourceInfo
dataSourceInfo
)
{
DataSourceProperty
dataSourceProperty
=
new
DataSourceProperty
();
dataSourceProperty
.
setUrl
(
dataSourceInfo
.
getUrl
());
dataSourceProperty
.
setUsername
(
dataSourceInfo
.
getUsername
());
dataSourceProperty
.
setPassword
(
dataSourceInfo
.
getPassword
());
dataSourceProperty
.
setDriverClassName
(
dataSourceInfo
.
getDriverClassName
());
DataSource
basicDataSource
=
dataSourceCreator
.
createDataSource
(
dataSourceProperty
);
((
DynamicRoutingDataSource
)
dataSource
).
addDataSource
(
dataSourceInfo
.
getName
(),
basicDataSource
);
}
public
void
switchToDataSource
(
String
dataSourceName
)
{
DynamicDataSourceContextHolder
.
push
(
dataSourceName
);
}
public
void
clear
()
{
DynamicDataSourceContextHolder
.
clear
();
}
}
src/main/resources/application.yml
浏览文件 @
da3be51d
...
...
@@ -4,9 +4,21 @@ spring:
password
:
Huang123+
url
:
jdbc:mysql://47.106.142.73:3306/www_hxh?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf-8&nullCatalogMeansCurrent=true
driver-class-name
:
com.mysql.cj.jdbc.Driver
#使用动态数据源组件后所必须添加的配置 若没有则会在初始化数据源时应无法找到primary数据源而报错
dynamic
:
primary
:
master
#设置默认的数据源或者数据源组,默认值即为master
lazy
:
false
#默认立即初始化数据源,true则支持在需要建立连接时再初始化数据源
strict
:
false
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource
:
master
:
url
:
jdbc:mysql://47.106.142.73:3306/www3?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf-8&nullCatalogMeansCurrent=true
username
:
root
password
:
Huang123+
driver-class-name
:
com.mysql.cj.jdbc.Driver
jpa
:
show-sql
:
true
hibernate
:
ddl-auto
:
update
server
:
port
:
8800
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论