- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringBoot+Mybatis plus实现多数据源整合的实践由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
SpringBoot 版本为1.5.10.RELEASE,Mybatis plus 版本为2.1.8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
spring:
aop:
proxy-target-class: true
auto: true
datasource:
druid:
# 数据库 1
db1:
url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
initialSize: 5
minIdle: 5
maxActive: 20
# 数据库 2
db2:
url: jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
initialSize: 5
minIdle: 5
maxActive: 20
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
@Configuration
@MapperScan
({
"com.warm.system.mapper*"
})
public
class
MybatisPlusConfig {
/**
* mybatis-plus分页插件<br>
* 文档:http://mp.baomidou.com<br>
*/
@Bean
public
PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor =
new
PaginationInterceptor();
//paginationInterceptor.setLocalPage(true);// 开启 PageHelper 的支持
return
paginationInterceptor;
}
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
public
PerformanceInterceptor performanceInterceptor() {
return
new
PerformanceInterceptor();
}
@Bean
(name =
"db1"
)
@ConfigurationProperties
(prefix =
"spring.datasource.druid.db1"
)
public
DataSource db1 () {
return
DruidDataSourceBuilder.create().build();
}
@Bean
(name =
"db2"
)
@ConfigurationProperties
(prefix =
"spring.datasource.druid.db2"
)
public
DataSource db2 () {
return
DruidDataSourceBuilder.create().build();
}
/**
* 动态数据源配置
* @return
*/
@Bean
@Primary
public
DataSource multipleDataSource (
@Qualifier
(
"db1"
) DataSource db1,
@Qualifier
(
"db2"
) DataSource db2 ) {
DynamicDataSource dynamicDataSource =
new
DynamicDataSource();
Map< Object, Object > targetDataSources =
new
HashMap<>();
targetDataSources.put(DBTypeEnum.db1.getValue(), db1 );
targetDataSources.put(DBTypeEnum.db2.getValue(), db2);
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(db1);
return
dynamicDataSource;
}
@Bean
(
"sqlSessionFactory"
)
public
SqlSessionFactory sqlSessionFactory()
throws
Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory =
new
MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2()));
//sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml"));
MybatisConfiguration configuration =
new
MybatisConfiguration();
//configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
configuration.setMapUnderscoreToCamelCase(
true
);
configuration.setCacheEnabled(
false
);
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setPlugins(
new
Interceptor[]{
//PerformanceInterceptor(),OptimisticLockerInterceptor()
paginationInterceptor()
//添加分页功能
});
sqlSessionFactory.setGlobalConfig(globalConfiguration());
return
sqlSessionFactory.getObject();
}
@Bean
public
GlobalConfiguration globalConfiguration() {
GlobalConfiguration conf =
new
GlobalConfiguration(
new
LogicSqlInjector());
conf.setLogicDeleteValue(
"-1"
);
conf.setLogicNotDeleteValue(
"1"
);
conf.setIdType(
0
);
conf.setMetaObjectHandler(
new
MyMetaObjectHandler());
conf.setDbColumnUnderline(
true
);
conf.setRefresh(
true
);
return
conf;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
@Component
@Aspect
@Order
(-
100
)
//这是为了保证AOP在事务注解之前生效,Order的值越小,优先级越高
@Slf4j
public
class
DataSourceSwitchAspect {
@Pointcut
(
"execution(* com.warm.system.service.db1..*.*(..))"
)
private
void
db1Aspect() {
}
@Pointcut
(
"execution(* com.warm.system.service.db2..*.*(..))"
)
private
void
db2Aspect() {
}
@Before
(
"db1Aspect()"
)
public
void
db1() {
log.info(
"切换到db1 数据源..."
);
DbContextHolder.setDbType(DBTypeEnum.db1);
}
@Before
(
"db2Aspect()"
)
public
void
db2 () {
log.info(
"切换到db2 数据源..."
);
DbContextHolder.setDbType(DBTypeEnum.db2);
}
}
public
class
DbContextHolder {
private
static
final
ThreadLocal contextHolder =
new
ThreadLocal<>();
/**
* 设置数据源
* @param dbTypeEnum
*/
public
static
void
setDbType(DBTypeEnum dbTypeEnum) {
contextHolder.set(dbTypeEnum.getValue());
}
/**
* 取得当前数据源
* @return
*/
public
static
String getDbType() {
return
(String) contextHolder.get();
}
/**
* 清除上下文数据
*/
public
static
void
clearDbType() {
contextHolder.remove();
}
}
public
enum
DBTypeEnum {
db1(
"db1"
), db2(
"db2"
);
private
String value;
DBTypeEnum(String value) {
this
.value = value;
}
public
String getValue() {
return
value;
}
}
public
class
DynamicDataSource
extends
AbstractRoutingDataSource {
/**
* 取得当前使用哪个数据源
* @return
*/
@Override
protected
Object determineCurrentLookupKey() {
return
DbContextHolder.getDbType();
}
}
|
OK!写个单元测试来验证一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@SpringBootTest
@RunWith
(SpringJUnit4ClassRunner.
class
)
public
class
DataTest {
@Autowired
private
UserService userService;
@Autowired
private
OrderService orderService;
@Test
public
void
test() {
userService.getUserList().stream().forEach(item -> System.out.println(item));
orderService.getOrderList().stream().forEach(item -> System.out.println(item));
}
}
|
如图所示,证明数据源能动态切换了.
具体项目结构和代码参考Github.
踩坑记录:
直接调用Mybatis plus 的service方法AOP不会生效,即数据源不会动态切换,解决方法:在自己的service层中封装一下,调用自定义的service方法AOP即能正常生效了,如下所示:
1
2
3
4
5
6
7
8
|
@Service
public
class
UserServiceImpl
extends
ServiceImpl<UserMapper, User>
implements
UserService {
@Override
public
List<User> getUserList() {
return
selectList(
null
);
}
}
|
application.yml 定义的mybatis plus 配置信息不生效,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#MyBatis
mybatis-plus:
mapper-locations: classpath:/mapper/*/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.jinhuatuo.edu.sys.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
#序列接口实现类配置
#key-generator: com.baomidou.springboot.xxx
#逻辑删除配置
#logic-delete-value: 0
#logic-not-delete-value: 1
#自定义填充策略接口实现
meta-object-handler: com.jinhuatuo.edu.config.mybatis.MyMetaObjectHandler
#自定义SQL注入器
#sql-injector: com.baomidou.springboot.xxx
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
|
解决方法: 所有这些配置在MybatisPlusConfig 类中用代码的方式进行配置,分页插件亦是如此,否则统计列表总数的数据会拿不到,参考代码即可.
在application.yml配置 。
1
2
|
logging:
level: debug
|
控制台也不会打印Mybatis 执行的SQL语句,解决方法:自定义日志输出方案,如在classpath下直接引入日志配置文件如logback-spring.xml即可,同时application.yml无需再配置日志信息.
logback-spring.xml配置参考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!-- scan:配置文件如果发生改变,将会重新加载,默认值为true -->
<
configuration
scan
=
"true"
scanPeriod
=
"10 seconds"
>
<!-- <include resource="org/springframework/boot/logging/logback/base.xml"/> -->
<!-- 日志文件路径 -->
<!-- <springProperty name="logFilePath" source="logging.path"/> -->
<
property
resource
=
"application.yml"
/>
<
substitutionProperty
name
=
"LOG_HOME"
value
=
"${logging.path}"
/>
<
substitutionProperty
name
=
"PROJECT_NAME"
value
=
"${spring.application.name}"
/>
<!--<substitutionProperty name="CUR_NODE" value="${info.node}" />-->
<!-- 日志数据库路径 -->
<!-- <springProperty name="logDbPath" source="spring.datasource.one.url"/>
<springProperty name="logDbDriver" source="spring.datasource.one.driver-class-name"/>
<springProperty name="logDbUser" source="spring.datasource.one.username"/>
<springProperty name="logDbPwd" source="spring.datasource.one.password"/> -->
<!-- 将日志文件 -->
<
appender
name
=
"file"
class
=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<
append
>true</
append
>
<
encoder
>
<
pattern
>
[ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
</
pattern
>
<
charset
>utf-8</
charset
>
</
encoder
>
<
rollingPolicy
class
=
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
>
<
fileNamePattern
>${LOG_HOME}/${PROJECT_NAME}-%d{yyyy-MM-dd}.%i.log</
fileNamePattern
>
<
timeBasedFileNamingAndTriggeringPolicy
class
=
"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"
>
<
maxFileSize
>50 MB</
maxFileSize
>
</
timeBasedFileNamingAndTriggeringPolicy
>
<!--最多保留30天log-->
<
maxHistory
>30</
maxHistory
>
</
rollingPolicy
>
</
appender
>
<!-- 将日志错误文件-->
<
appender
name
=
"file_error"
class
=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<
append
>true</
append
>
<
encoder
>
<
pattern
>
[ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
</
pattern
>
<
charset
>utf-8</
charset
>
</
encoder
>
<
rollingPolicy
class
=
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
>
<
fileNamePattern
>${LOG_HOME}/${PROJECT_NAME}-error-%d{yyyy-MM-dd}.%i.log</
fileNamePattern
>
<
timeBasedFileNamingAndTriggeringPolicy
class
=
"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"
>
<
maxFileSize
>50 MB</
maxFileSize
>
</
timeBasedFileNamingAndTriggeringPolicy
>
<!--最多保留30天log-->
<
maxHistory
>30</
maxHistory
>
</
rollingPolicy
>
<
filter
class
=
"ch.qos.logback.classic.filter.ThresholdFilter"
>
<
level
>ERROR</
level
>
<!-- <onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch> -->
</
filter
>
</
appender
>
<!-- 将日志写入控制台 -->
<
appender
name
=
"console"
class
=
"ch.qos.logback.core.ConsoleAppender"
>
<
encoder
>
<
pattern
>
[ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
</
pattern
>
<!--<charset>utf-8</charset>-->
</
encoder
>
</
appender
>
<!-- 将日志写入数据库 -->
<!-- <appender name="DB-CLASSIC-MYSQL-POOL" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<driverClassName>${logDbDriver}</driverClassName>
<url>${logDbPath}</url>
<username>${logDbUser}</username>
<password>${logDbPwd}</password>
</dataSource>
</connectionSource>
</appender> -->
<!-- spring扩展,分环境配置log信息 -->
<
springProfile
name
=
"dev"
>
<!-- <logger name="sand.dao" level="DEBUG"/> -->
<!-- <logger name="org.springframework.web" level="INFO"/> -->
<
logger
name
=
"org.springboot.sample"
level
=
"TRACE"
/>
<
logger
name
=
"org.springframework.cloud"
level
=
"INFO"
/>
<
logger
name
=
"com.netflix"
level
=
"INFO"
></
logger
>
<
logger
name
=
"org.springframework.boot"
level
=
"INFO"
></
logger
>
<
logger
name
=
"org.springframework.web"
level
=
"INFO"
/>
<
logger
name
=
"jdbc.sqltiming"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.common.jdbc.SimpleDataSource"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.common.jdbc.ScriptRunner"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"
level
=
"debug"
/>
<
logger
name
=
"java.sql.Connection"
level
=
"debug"
/>
<
logger
name
=
"java.sql.Statement"
level
=
"debug"
/>
<
logger
name
=
"java.sql.PreparedStatement"
level
=
"debug"
/>
<
logger
name
=
"java.sql.ResultSet"
level
=
"debug"
/>
<
logger
name
=
"com.warm"
level
=
"debug"
/>
<
root
level
=
"DEBUG"
>
<
appender-ref
ref
=
"console"
/>
<
appender-ref
ref
=
"file"
/>
</
root
>
<
root
level
=
"ERROR"
>
<
appender-ref
ref
=
"file_error"
/>
<!-- <appender-ref ref="DB-CLASSIC-MYSQL-POOL" /> -->
</
root
>
</
springProfile
>
<
springProfile
name
=
"test"
>
<
logger
name
=
"org.springboot.sample"
level
=
"TRACE"
/>
<
logger
name
=
"org.springframework.cloud"
level
=
"INFO"
/>
<
logger
name
=
"com.netflix"
level
=
"INFO"
></
logger
>
<
logger
name
=
"org.springframework.boot"
level
=
"INFO"
></
logger
>
<
logger
name
=
"org.springframework.web"
level
=
"INFO"
/>
<
logger
name
=
"jdbc.sqltiming"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.common.jdbc.SimpleDataSource"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.common.jdbc.ScriptRunner"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"
level
=
"debug"
/>
<
logger
name
=
"java.sql.Connection"
level
=
"debug"
/>
<
logger
name
=
"java.sql.Statement"
level
=
"debug"
/>
<
logger
name
=
"java.sql.PreparedStatement"
level
=
"debug"
/>
<
logger
name
=
"java.sql.ResultSet"
level
=
"debug"
/>
<
logger
name
=
"com.warm"
level
=
"DEBUG"
/>
<
root
level
=
"DEBUG"
>
<!-- <appender-ref ref="console" /> -->
<
appender-ref
ref
=
"file"
/>
</
root
>
<
root
level
=
"ERROR"
>
<
appender-ref
ref
=
"file_error"
/>
<!-- <appender-ref ref="DB-CLASSIC-MYSQL-POOL" /> -->
</
root
>
</
springProfile
>
<
springProfile
name
=
"prod"
>
<
logger
name
=
"org.springboot.sample"
level
=
"TRACE"
/>
<
logger
name
=
"org.springframework.cloud"
level
=
"INFO"
/>
<
logger
name
=
"com.netflix"
level
=
"INFO"
></
logger
>
<
logger
name
=
"org.springframework.boot"
level
=
"INFO"
></
logger
>
<
logger
name
=
"org.springframework.web"
level
=
"INFO"
/>
<
logger
name
=
"jdbc.sqltiming"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.common.jdbc.SimpleDataSource"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.common.jdbc.ScriptRunner"
level
=
"debug"
/>
<
logger
name
=
"com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"
level
=
"debug"
/>
<
logger
name
=
"java.sql.Connection"
level
=
"debug"
/>
<
logger
name
=
"java.sql.Statement"
level
=
"debug"
/>
<
logger
name
=
"java.sql.PreparedStatement"
level
=
"debug"
/>
<
logger
name
=
"java.sql.ResultSet"
level
=
"debug"
/>
<
logger
name
=
"com.warm"
level
=
"info"
/>
<
root
level
=
"DEBUG"
>
<!-- <appender-ref ref="console" /> -->
<
appender-ref
ref
=
"file"
/>
</
root
>
<
root
level
=
"ERROR"
>
<
appender-ref
ref
=
"file_error"
/>
<!-- <appender-ref ref="DB-CLASSIC-MYSQL-POOL" /> -->
</
root
>
</
springProfile
>
</
configuration
>
|
到此这篇关于SpringBoot+Mybatis plus实现多数据源整合的实践的文章就介绍到这了,更多相关SpringBoot+Mybatis plus多数据源内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/u012075383/article/details/79304178 。
最后此篇关于SpringBoot+Mybatis plus实现多数据源整合的实践的文章就讲到这里了,如果你想了解更多关于SpringBoot+Mybatis plus实现多数据源整合的实践的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我试图通过预准备语句使用同一连接执行多个查询,但无法完全实现! 代码片段: public class PostPrReqDaoImpl implements PostPrReqDaoInterface
我目前有一个 2 列宽的 DataGridView,第一列是 DataGridViewTextBoxColumn,第二列是 DataGridViewComboBoxColumn。我还有一个预生成的通用
当我在一台机器上运行以下代码时,我得到了 org.apache.tomcat.dbcp.dbcp.BasicDataSource 的 tomcat 实现,当我在另一台机器上运行它时,我得到了 org.
不确定这是否可行,但这是我的设置。 我有一台带有双启动功能的笔记本电脑。 一个一个分区我有 WinXP 和 MSAccess 2000在另一个分区上,Ubuntu 10.04,带有 apache we
我试过: czmlDataSource.load(czmlurl).then(function(){ viewer.dataSource
我有一个 TableView 和一个数组源。当我在 viewDidLoad 方法中初始化数组时,tableview 显示数组中的数据。当我从 Internet 上的 XML 数据的 URL 填充数组时
我对 DataSource 和 SessionFactory 之间的区别感到困惑。 我认为SessionFactory是一个用于检索 session 的管理器(我猜这实际上是与数据库的连接)。 Dat
我想存储大量(~数千)个字符串并能够使用通配符执行匹配。 例如,这里是一个示例内容: Folder1 文件夹 1/Folder2 Folder1/* Folder1/Folder2/Folder3 文
我有一个 DataGridView 和一个从 SQL 表填充的一些对象的列表。我曾使用两种方法将列表绑定(bind)到网格。 1.直接使用列表到数据源 grdSomeList.DataSource =
我正在尝试在 DataGridView 中设置一些内容。看起来这应该很简单,但我遇到了麻烦。我想显示三列: 代码ID 代号 带有 TypeName 的 DisplayMember 和 TypeID 的
在我的 Config.groovy我把线: grails.config.locations = [ "classpath:app-config.properties"] 我在哪里设置数据源的定义。文件
为了这个问题,假设我有一个包含各种酒类的 Excel 数据源电子表格。 (Cell A) | (Cell B) Bacardi | Rum Smirnoff | Vodka Another Vodka
由于我经常使用第三方 API,我认为创建一些 Magento 模块以实现轻松连接和查询它们会很有帮助。理想情况下,您可以像这样查询 API... $data = Mage::getModel( 'to
将后台线程频繁更新的数据源与 GUI 主线程同步的最佳方法是什么? 我应该在每个方法调用周围放置一个 pthread 互斥体吗?这对我来说似乎也很重。 编辑:我正在寻找 10.5 解决方案 最佳答案
经过几个小时的点击和试用,在查看各种帖子寻求帮助后,这段代码终于起作用了。但我希望有人帮助我理解函数(i,dat),这意味着什么?下面是我的完整代码 - function get_assignedta
我使用的是 Wildfly 10.1 版本,有两个数据源,如下所示, jdbc:mysql://${dbhostn
我正在学习数据源,我想我开始理解它,但我不明白这一段。 据我所知,MySQL 和 PostgreSQL 等数据库供应商编写了自己的不同 DataSource 接口(interface)的实现。现在,这
我有一个关于 TomEE 和使用 tomee.xml 中指定的数据源的奇怪问题。值得注意的是,我使用的是 Netbeans、TomEE 和 MySQL。在 Ubuntu 13.04(Xubuntu 最
WWDC 2019 确实充满了 iOS 的新内容以及 TableViews 和 CollectionView 的新数据源,即 UITableViewDiffableDataSource . 我已成功将
我在独立模式下运行 jboss 并将 standalone.xml 中的数据源设置为以下内容: jdbc:sqlserver://myip:1433;databaseNam
我是一名优秀的程序员,十分优秀!