Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
01f5a950
Shardingsphere
项目概览
apache
/
Shardingsphere
通知
56
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Shardingsphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
01f5a950
编写于
5月 25, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor api for generate key, multiple keys => single key 3rd version
上级
fe0765d1
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
132 addition
and
302 deletion
+132
-302
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSet.java
...ang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSet.java
+55
-68
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetMetaData.java
...ame/rdb/sharding/jdbc/GeneratedKeysResultSetMetaData.java
+30
-59
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java
.../ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java
+8
-29
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingStatement.java
...dangdang/ddframe/rdb/sharding/jdbc/ShardingStatement.java
+10
-45
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/GeneratedKeyContext.java
.../sharding/parsing/parser/context/GeneratedKeyContext.java
+5
-44
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/InsertSQLContext.java
...rdb/sharding/parsing/parser/context/InsertSQLContext.java
+1
-1
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetMetaDataTest.java
...rdb/sharding/jdbc/GeneratedKeysResultSetMetaDataTest.java
+7
-25
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetTest.java
...ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetTest.java
+8
-24
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingStatementTest.java
...dang/ddframe/rdb/sharding/jdbc/ShardingStatementTest.java
+7
-6
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/util/SQLUtilTest.java
...a/com/dangdang/ddframe/rdb/sharding/util/SQLUtilTest.java
+1
-1
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSet.java
浏览文件 @
01f5a950
...
...
@@ -19,16 +19,14 @@ package com.dangdang.ddframe.rdb.sharding.jdbc;
import
com.dangdang.ddframe.rdb.sharding.jdbc.unsupported.AbstractUnsupportedGeneratedKeysResultSet
;
import
com.google.common.base.Preconditions
;
import
com.google.common.collect.Table
;
import
com.google.common.collect.TreeBasedTable
;
import
lombok.RequiredArgsConstructor
;
import
java.math.BigDecimal
;
import
java.sql.ResultSetMetaData
;
import
java.sql.SQLException
;
import
java.sql.Statement
;
import
java.util.
HashMap
;
import
java.util.
Map
;
import
java.util.
Collections
;
import
java.util.
Iterator
;
/**
* 生成键结果集.
...
...
@@ -38,46 +36,47 @@ import java.util.Map;
@RequiredArgsConstructor
public
class
GeneratedKeysResultSet
extends
AbstractUnsupportedGeneratedKeysResultSet
{
private
final
Table
<
Integer
,
Integer
,
Object
>
valueTable
;
private
final
Iterator
<
Number
>
generatedKeys
;
private
final
Map
<
String
,
Integer
>
columnNameToIndexMap
;
private
final
String
generatedKeyColumn
;
private
final
Statement
statement
;
private
boolean
isC
losed
;
private
boolean
c
losed
;
private
int
rowIndex
=
-
1
;
private
Number
currentGeneratedKey
;
public
GeneratedKeysResultSet
()
{
valueTable
=
TreeBasedTable
.
create
();
columnNameToIndexMap
=
new
HashMap
<>()
;
generatedKeys
=
Collections
.<
Number
>
emptyList
().
iterator
();
generatedKeyColumn
=
null
;
statement
=
null
;
isC
losed
=
true
;
c
losed
=
true
;
}
@Override
public
boolean
isClosed
()
throws
SQLException
{
return
isC
losed
;
return
c
losed
;
}
@Override
public
boolean
next
()
throws
SQLException
{
if
(
isClosed
())
{
if
(
closed
||
!
generatedKeys
.
hasNext
())
{
currentGeneratedKey
=
null
;
return
false
;
}
rowIndex
++
;
return
rowIndex
+
1
<=
valueTable
.
rowKeySet
().
size
()
;
currentGeneratedKey
=
generatedKeys
.
next
()
;
return
true
;
}
@Override
public
void
close
()
throws
SQLException
{
isC
losed
=
true
;
c
losed
=
true
;
}
@Override
public
ResultSetMetaData
getMetaData
()
throws
SQLException
{
checkState
();
return
new
GeneratedKeysResultSetMetaData
(
valueTable
,
columnNameToIndexMap
);
return
new
GeneratedKeysResultSetMetaData
(
generatedKeyColumn
);
}
@Override
...
...
@@ -88,146 +87,129 @@ public class GeneratedKeysResultSet extends AbstractUnsupportedGeneratedKeysResu
@Override
public
String
getString
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
valueTable
.
get
(
rowIndex
,
columnIndex
-
1
)
.
toString
();
checkState
ForGetData
();
return
currentGeneratedKey
.
toString
();
}
@Override
public
String
getString
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
valueTable
.
get
(
rowIndex
,
findColumn
(
columnLabel
)).
toString
();
return
getString
(
1
);
}
@Override
public
byte
getByte
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
columnIndex
-
1
)
.
byteValue
();
checkState
ForGetData
();
return
currentGeneratedKey
.
byteValue
();
}
@Override
public
byte
getByte
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
findColumn
(
columnLabel
)).
byteValue
();
return
getByte
(
1
);
}
@Override
public
short
getShort
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
columnIndex
-
1
)
.
shortValue
();
checkState
ForGetData
();
return
currentGeneratedKey
.
shortValue
();
}
@Override
public
short
getShort
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
findColumn
(
columnLabel
)).
shortValue
();
return
getShort
(
1
);
}
@Override
public
int
getInt
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
columnIndex
-
1
)
.
intValue
();
checkState
ForGetData
();
return
currentGeneratedKey
.
intValue
();
}
@Override
public
int
getInt
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
findColumn
(
columnLabel
)).
intValue
();
return
getInt
(
1
);
}
@Override
public
long
getLong
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
columnIndex
-
1
)
.
longValue
();
checkState
ForGetData
();
return
currentGeneratedKey
.
longValue
();
}
@Override
public
long
getLong
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
findColumn
(
columnLabel
)).
longValue
();
return
getLong
(
1
);
}
@Override
public
float
getFloat
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
columnIndex
-
1
)
.
floatValue
();
checkState
ForGetData
();
return
currentGeneratedKey
.
floatValue
();
}
@Override
public
float
getFloat
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
findColumn
(
columnLabel
)).
floatValue
();
return
getFloat
(
1
);
}
@Override
public
double
getDouble
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
columnIndex
-
1
)
.
doubleValue
();
checkState
ForGetData
();
return
currentGeneratedKey
.
doubleValue
();
}
@Override
public
double
getDouble
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getNumberValue
(
findColumn
(
columnLabel
)).
doubleValue
();
return
getDouble
(
1
);
}
@Override
public
BigDecimal
getBigDecimal
(
final
int
columnIndex
,
final
int
scale
)
throws
SQLException
{
checkState
();
return
new
BigDecimal
(
getNumberValue
(
columnIndex
-
1
)
.
longValue
()).
setScale
(
scale
,
BigDecimal
.
ROUND_HALF_UP
);
checkState
ForGetData
();
return
new
BigDecimal
(
currentGeneratedKey
.
longValue
()).
setScale
(
scale
,
BigDecimal
.
ROUND_HALF_UP
);
}
@Override
public
BigDecimal
getBigDecimal
(
final
String
columnLabel
,
final
int
scale
)
throws
SQLException
{
checkState
();
return
new
BigDecimal
(
getNumberValue
(
findColumn
(
columnLabel
)).
longValue
()).
setScale
(
scale
,
BigDecimal
.
ROUND_HALF_UP
);
return
getBigDecimal
(
1
,
scale
);
}
@Override
public
BigDecimal
getBigDecimal
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
new
BigDecimal
(
getNumberValue
(
columnIndex
-
1
)
.
longValue
());
checkState
ForGetData
();
return
new
BigDecimal
(
currentGeneratedKey
.
longValue
());
}
@Override
public
BigDecimal
getBigDecimal
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
new
BigDecimal
(
getNumberValue
(
findColumn
(
columnLabel
)).
longValue
());
}
private
Number
getNumberValue
(
final
int
columnIndex
)
{
Object
value
=
valueTable
.
get
(
rowIndex
,
columnIndex
);
Preconditions
.
checkState
(
value
instanceof
Number
);
return
(
Number
)
value
;
return
getBigDecimal
(
1
);
}
@Override
public
byte
[]
getBytes
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
checkState
ForGetData
();
return
getString
(
columnIndex
).
getBytes
();
}
@Override
public
byte
[]
getBytes
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
getString
(
columnLabel
).
getBytes
();
return
getBytes
(
1
);
}
@Override
public
Object
getObject
(
final
int
columnIndex
)
throws
SQLException
{
checkState
();
return
valueTable
.
get
(
rowIndex
,
columnIndex
-
1
)
;
checkState
ForGetData
();
return
currentGeneratedKey
;
}
@Override
public
Object
getObject
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
valueTable
.
get
(
rowIndex
,
findColumn
(
columnLabel
));
return
getObject
(
1
);
}
@Override
public
int
findColumn
(
final
String
columnLabel
)
throws
SQLException
{
checkState
();
return
columnNameToIndexMap
.
get
(
columnLabel
)
;
return
1
;
}
@Override
...
...
@@ -249,6 +231,11 @@ public class GeneratedKeysResultSet extends AbstractUnsupportedGeneratedKeysResu
}
private
void
checkState
()
throws
SQLException
{
Preconditions
.
checkState
(!
isClosed
(),
"ResultSet has closed"
);
Preconditions
.
checkState
(!
closed
,
"ResultSet has closed."
);
}
private
void
checkStateForGetData
()
throws
SQLException
{
Preconditions
.
checkState
(!
closed
,
"ResultSet has closed."
);
Preconditions
.
checkNotNull
(
currentGeneratedKey
,
"ResultSet should call next or has no more data."
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetMetaData.java
浏览文件 @
01f5a950
...
...
@@ -17,175 +17,146 @@
package
com.dangdang.ddframe.rdb.sharding.jdbc
;
import
com.dangdang.ddframe.rdb.sharding.jdbc.adapter.WrapperAdapter
;
import
com.google.common.base.Preconditions
;
import
com.google.common.collect.Table
;
import
lombok.RequiredArgsConstructor
;
import
java.sql.ResultSetMetaData
;
import
java.sql.SQLException
;
import
java.sql.Types
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 生成键结果集元数据.
*
* @author gaohongtao
*/
class
GeneratedKeysResultSetMetaData
implements
ResultSetMetaData
{
@RequiredArgsConstructor
class
GeneratedKeysResultSetMetaData
extends
WrapperAdapter
implements
ResultSetMetaData
{
private
final
Map
<
Integer
,
String
>
indexToColumnNameMap
=
new
HashMap
<>();
private
final
Table
<
Integer
,
Integer
,
Object
>
autoIncrementValueTable
;
GeneratedKeysResultSetMetaData
(
final
Table
<
Integer
,
Integer
,
Object
>
autoIncrementValueTable
,
final
Map
<
String
,
Integer
>
autoIncrementColumnNameToIndexMap
)
{
this
.
autoIncrementValueTable
=
autoIncrementValueTable
;
for
(
Map
.
Entry
<
String
,
Integer
>
each
:
autoIncrementColumnNameToIndexMap
.
entrySet
())
{
indexToColumnNameMap
.
put
(
each
.
getValue
(),
each
.
getKey
());
}
}
private
final
String
generatedKeyColumn
;
@Override
public
int
getColumnCount
()
throws
SQLException
{
return
indexToColumnNameMap
.
size
()
;
return
1
;
}
@Override
public
boolean
isAutoIncrement
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
true
;
}
@Override
public
boolean
isCaseSensitive
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
true
;
}
@Override
public
boolean
isSearchable
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
false
;
}
@Override
public
boolean
isCurrency
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
false
;
}
@Override
public
int
isNullable
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
columnNoNulls
;
}
@Override
public
boolean
isSigned
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
true
;
}
@Override
public
int
getColumnDisplaySize
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
0
;
}
@Override
public
String
getColumnLabel
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
return
indexToColumnNameMap
.
get
(
column
-
1
)
;
Preconditions
.
checkArgument
(
column
==
1
);
return
generatedKeyColumn
;
}
@Override
public
String
getColumnName
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
return
indexToColumnNameMap
.
get
(
column
-
1
)
;
Preconditions
.
checkArgument
(
column
==
1
);
return
generatedKeyColumn
;
}
@Override
public
String
getSchemaName
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
""
;
}
@Override
public
int
getPrecision
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
0
;
}
@Override
public
int
getScale
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
0
;
}
@Override
public
String
getTableName
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
""
;
}
@Override
public
String
getCatalogName
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
""
;
}
@Override
public
int
getColumnType
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Object
value
=
autoIncrementValueTable
.
get
(
0
,
column
-
1
);
return
value
instanceof
Number
?
Types
.
BIGINT
:
Types
.
VARCHAR
;
Preconditions
.
checkArgument
(
column
==
1
);
return
Types
.
BIGINT
;
}
@Override
public
String
getColumnTypeName
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
""
;
}
@Override
public
boolean
isReadOnly
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
true
;
}
@Override
public
boolean
isWritable
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
false
;
}
@Override
public
boolean
isDefinitelyWritable
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Preconditions
.
checkArgument
(
column
==
1
);
return
false
;
}
@Override
public
String
getColumnClassName
(
final
int
column
)
throws
SQLException
{
checkIndex
(
column
);
Object
value
=
autoIncrementValueTable
.
get
(
0
,
column
-
1
);
return
value
.
getClass
().
getName
();
}
@Override
@SuppressWarnings
(
"unchecked"
)
public
<
T
>
T
unwrap
(
final
Class
<
T
>
iface
)
throws
SQLException
{
if
(
isWrapperFor
(
iface
))
{
return
(
T
)
this
;
}
throw
new
SQLException
(
String
.
format
(
"[%s] cannot be unwrapped as [%s]"
,
getClass
().
getName
(),
iface
.
getName
()));
}
@Override
public
boolean
isWrapperFor
(
final
Class
<?>
iface
)
throws
SQLException
{
return
iface
.
isInstance
(
this
);
}
private
void
checkIndex
(
final
int
column
)
{
Preconditions
.
checkArgument
(
column
>=
1
&&
column
<=
indexToColumnNameMap
.
size
());
Preconditions
.
checkArgument
(
column
==
1
);
return
Number
.
class
.
getName
();
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java
浏览文件 @
01f5a950
...
...
@@ -33,6 +33,7 @@ import java.sql.Connection;
import
java.sql.PreparedStatement
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.Statement
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
...
...
@@ -49,11 +50,7 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
private
final
List
<
PreparedStatementExecutorWrapper
>
cachedPreparedStatementWrappers
=
new
ArrayList
<>();
private
Integer
autoGeneratedKeys
;
private
int
[]
columnIndexes
;
private
String
[]
columnNames
;
private
boolean
autoGeneratedKeys
;
private
int
batchIndex
;
...
...
@@ -74,17 +71,17 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
ShardingPreparedStatement
(
final
ShardingConnection
shardingConnection
,
final
String
sql
,
final
int
autoGeneratedKeys
)
{
this
(
shardingConnection
,
sql
);
this
.
autoGeneratedKeys
=
autoGeneratedKeys
;
this
.
autoGeneratedKeys
=
Statement
.
RETURN_GENERATED_KEYS
==
autoGeneratedKeys
;
}
ShardingPreparedStatement
(
final
ShardingConnection
shardingConnection
,
final
String
sql
,
final
int
[]
columnIndexes
)
{
this
(
shardingConnection
,
sql
);
this
.
columnIndexes
=
columnIndexes
;
autoGeneratedKeys
=
true
;
}
ShardingPreparedStatement
(
final
ShardingConnection
shardingConnection
,
final
String
sql
,
final
String
[]
columnNames
)
{
this
(
shardingConnection
,
sql
);
this
.
columnNames
=
columnNames
;
autoGeneratedKeys
=
true
;
}
@Override
...
...
@@ -137,10 +134,6 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
each
.
mapBatchIndex
(
batchIndex
);
}
batchIndex
++;
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
addRow
();
}
}
finally
{
resetBatch
();
}
...
...
@@ -192,23 +185,9 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
protected
BackendStatementWrapper
generateStatement
(
final
Connection
conn
,
final
String
shardingSql
)
throws
SQLException
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
null
!=
autoGeneratedKeys
)
{
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
setAutoGeneratedKeys
(
autoGeneratedKeys
);
}
return
new
BackendPreparedStatementWrapper
(
conn
.
prepareStatement
(
shardingSql
,
autoGeneratedKeys
),
shardingSql
);
}
if
(
null
!=
columnIndexes
)
{
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
setColumnIndexes
(
columnIndexes
);
}
return
new
BackendPreparedStatementWrapper
(
conn
.
prepareStatement
(
shardingSql
,
columnIndexes
),
shardingSql
);
}
if
(
null
!=
columnNames
)
{
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
setColumnNames
(
columnNames
);
}
return
new
BackendPreparedStatementWrapper
(
conn
.
prepareStatement
(
shardingSql
,
columnNames
),
shardingSql
);
if
(
autoGeneratedKeys
&&
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
setAutoGeneratedKeys
(
true
);
return
new
BackendPreparedStatementWrapper
(
conn
.
prepareStatement
(
shardingSql
,
Statement
.
RETURN_GENERATED_KEYS
),
shardingSql
);
}
if
(
0
!=
getResultSetHoldability
())
{
return
new
BackendPreparedStatementWrapper
(
conn
.
prepareStatement
(
shardingSql
,
getResultSetType
(),
getResultSetConcurrency
(),
getResultSetHoldability
()),
shardingSql
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingStatement.java
浏览文件 @
01f5a950
...
...
@@ -31,8 +31,6 @@ import com.google.common.base.Function;
import
com.google.common.base.Optional
;
import
com.google.common.collect.Iterators
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Table
;
import
com.google.common.collect.TreeBasedTable
;
import
lombok.AccessLevel
;
import
lombok.Getter
;
import
lombok.Setter
;
...
...
@@ -47,7 +45,6 @@ import java.util.Deque;
import
java.util.Iterator
;
import
java.util.LinkedList
;
import
java.util.List
;
import
java.util.Map
;
/**
* 支持分片的静态语句对象.
...
...
@@ -138,8 +135,8 @@ public class ShardingStatement extends AbstractStatementAdapter {
return
generateExecutor
(
sql
).
executeUpdate
(
autoGeneratedKeys
);
}
finally
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
setAutoGeneratedKeys
(
autoGeneratedKeys
);
if
(
generatedKeyContext
.
isPresent
()
&&
Statement
.
RETURN_GENERATED_KEYS
==
autoGeneratedKeys
)
{
generatedKeyContext
.
get
().
setAutoGeneratedKeys
(
true
);
}
clearRouteContext
();
}
...
...
@@ -152,7 +149,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
}
finally
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
set
ColumnIndexes
(
columnIndexes
);
generatedKeyContext
.
get
().
set
AutoGeneratedKeys
(
true
);
}
clearRouteContext
();
}
...
...
@@ -165,7 +162,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
}
finally
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
set
ColumnNames
(
columnNames
);
generatedKeyContext
.
get
().
set
AutoGeneratedKeys
(
true
);
}
clearRouteContext
();
}
...
...
@@ -186,8 +183,8 @@ public class ShardingStatement extends AbstractStatementAdapter {
return
generateExecutor
(
sql
).
execute
(
autoGeneratedKeys
);
}
finally
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
setAutoGeneratedKeys
(
autoGeneratedKeys
);
if
(
generatedKeyContext
.
isPresent
()
&&
Statement
.
RETURN_GENERATED_KEYS
==
autoGeneratedKeys
)
{
generatedKeyContext
.
get
().
setAutoGeneratedKeys
(
true
);
}
clearRouteContext
();
}
...
...
@@ -200,7 +197,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
}
finally
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
set
ColumnIndexes
(
columnIndexes
);
generatedKeyContext
.
get
().
set
AutoGeneratedKeys
(
true
);
}
clearRouteContext
();
}
...
...
@@ -213,7 +210,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
}
finally
{
Optional
<
GeneratedKeyContext
>
generatedKeyContext
=
getGeneratedKeyContext
();
if
(
generatedKeyContext
.
isPresent
())
{
generatedKeyContext
.
get
().
set
ColumnNames
(
columnNames
);
generatedKeyContext
.
get
().
set
AutoGeneratedKeys
(
true
);
}
clearRouteContext
();
}
...
...
@@ -232,42 +229,10 @@ public class ShardingStatement extends AbstractStatementAdapter {
}
return
generatedKeysResultSet
=
new
GeneratedKeysResultSet
();
}
if
(
Statement
.
RETURN_GENERATED_KEYS
!=
generatedKeyContext
.
get
().
getAutoGeneratedKeys
()
&&
null
==
generatedKeyContext
.
get
().
getColumnIndexes
()
&&
null
==
generatedKeyContext
.
get
().
getColumnNames
())
{
if
(!
generatedKeyContext
.
get
().
isAutoGeneratedKeys
())
{
return
generatedKeysResultSet
=
new
GeneratedKeysResultSet
();
}
return
generatedKeysResultSet
=
new
GeneratedKeysResultSet
(
generateAutoIncrementTable
(
generatedKeyContext
.
get
()),
generatedKeyContext
.
get
().
getColumnNameToIndexMap
(),
this
);
}
private
Table
<
Integer
,
Integer
,
Object
>
generateAutoIncrementTable
(
final
GeneratedKeyContext
generatedKeyContext
)
{
if
(
null
!=
generatedKeyContext
.
getColumnIndexes
())
{
return
subTable
(
generatedKeyContext
,
generatedKeyContext
.
getColumnIndexes
());
}
else
if
(
null
!=
generatedKeyContext
.
getColumnNames
())
{
List
<
Integer
>
columnIndexes
=
new
ArrayList
<>(
generatedKeyContext
.
getColumnNames
().
length
);
for
(
String
each
:
generatedKeyContext
.
getColumnNames
())
{
if
(!
generatedKeyContext
.
getColumnNameToIndexMap
().
containsKey
(
each
))
{
continue
;
}
columnIndexes
.
add
(
generatedKeyContext
.
getColumnNameToIndexMap
().
get
(
each
)
+
1
);
}
int
[]
parameter
=
new
int
[
columnIndexes
.
size
()];
int
index
=
0
;
for
(
Integer
each
:
columnIndexes
)
{
parameter
[
index
++]
=
each
;
}
return
subTable
(
generatedKeyContext
,
parameter
);
}
return
generatedKeyContext
.
getValueTable
();
}
private
Table
<
Integer
,
Integer
,
Object
>
subTable
(
final
GeneratedKeyContext
generatedKeyContext
,
final
int
[]
columnIndexes
)
{
Table
<
Integer
,
Integer
,
Object
>
result
=
TreeBasedTable
.
create
();
for
(
int
each
:
columnIndexes
)
{
for
(
Map
.
Entry
<
Integer
,
Object
>
eachEntry
:
generatedKeyContext
.
getValueTable
().
column
(
each
-
1
).
entrySet
())
{
result
.
put
(
eachEntry
.
getKey
(),
each
-
1
,
eachEntry
.
getValue
());
}
}
return
result
;
return
generatedKeysResultSet
=
new
GeneratedKeysResultSet
(
generatedKeyContext
.
get
().
getValues
().
iterator
(),
generatedKeyContext
.
get
().
getColumn
(),
this
);
}
protected
final
Optional
<
GeneratedKeyContext
>
getGeneratedKeyContext
()
{
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/GeneratedKeyContext.java
浏览文件 @
01f5a950
...
...
@@ -17,15 +17,13 @@
package
com.dangdang.ddframe.rdb.sharding.parsing.parser.context
;
import
com.google.common.collect.Table
;
import
com.google.common.collect.TreeBasedTable
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
lombok.Setter
;
import
lombok.ToString
;
import
java.util.
HashMap
;
import
java.util.
Map
;
import
java.util.
LinkedList
;
import
java.util.
List
;
/**
* 自动生成键上下文.
...
...
@@ -33,51 +31,14 @@ import java.util.Map;
* @author gaohongtao
*/
@RequiredArgsConstructor
@Getter
@ToString
public
final
class
GeneratedKeyContext
{
@Getter
private
final
String
column
;
@Getter
private
final
Map
<
String
,
Integer
>
columnNameToIndexMap
=
new
HashMap
<>();
@Getter
private
final
Table
<
Integer
,
Integer
,
Object
>
valueTable
=
TreeBasedTable
.
create
();
private
int
rowIndex
;
private
int
columnIndex
;
@Setter
@Getter
private
int
autoGeneratedKeys
;
@Setter
@Getter
private
int
[]
columnIndexes
;
private
final
List
<
Number
>
values
=
new
LinkedList
<>();
@Setter
@Getter
private
String
[]
columnNames
;
/**
* 放入生成的键值.
*
* @param columnName 列名称
* @param value 键值
*/
public
void
putValue
(
final
String
columnName
,
final
Number
value
)
{
valueTable
.
put
(
rowIndex
,
columnIndex
,
value
);
columnNameToIndexMap
.
put
(
columnName
,
columnIndex
);
columnIndex
++;
}
/**
* 结果集增加一行.
*/
public
void
addRow
()
{
rowIndex
++;
columnIndex
=
0
;
}
private
boolean
autoGeneratedKeys
;
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/InsertSQLContext.java
浏览文件 @
01f5a950
...
...
@@ -98,7 +98,7 @@ public final class InsertSQLContext extends AbstractSQLContext {
generatedKey
=
null
;
}
result
.
put
(
generatedKeyContext
.
getColumn
(),
generatedKey
);
generatedKeyContext
.
putValue
(
generatedKeyContext
.
getColumn
(),
generatedKey
);
generatedKeyContext
.
getValues
().
add
(
generatedKey
);
return
result
;
}
...
...
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetMetaDataTest.java
浏览文件 @
01f5a950
...
...
@@ -19,11 +19,14 @@ package com.dangdang.ddframe.rdb.sharding.jdbc;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.mockito.Mockito
;
import
javax.sql.rowset.RowSetMetaDataImpl
;
import
java.sql.ResultSetMetaData
;
import
java.sql.SQLException
;
import
java.sql.Statement
;
import
java.sql.Types
;
import
java.util.Arrays
;
import
static
org
.
hamcrest
.
core
.
Is
.
is
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
...
...
@@ -37,132 +40,112 @@ public class GeneratedKeysResultSetMetaDataTest {
@Before
public
void
init
()
throws
SQLException
{
actualMetaData
=
GeneratedKeysResultSetTest
.
createMock
(
).
getMetaData
();
actualMetaData
=
new
GeneratedKeysResultSet
(
Arrays
.<
Number
>
asList
(
1L
,
2L
).
iterator
(),
"order_id"
,
Mockito
.
mock
(
Statement
.
class
)
).
getMetaData
();
}
@Test
public
void
getColumnCount
()
throws
Exception
{
assertThat
(
actualMetaData
.
getColumnCount
(),
is
(
2
));
assertThat
(
actualMetaData
.
getColumnCount
(),
is
(
1
));
}
@Test
public
void
isAutoIncrement
()
throws
Exception
{
assertTrue
(
actualMetaData
.
isAutoIncrement
(
1
));
assertTrue
(
actualMetaData
.
isAutoIncrement
(
2
));
}
@Test
public
void
isCaseSensitive
()
throws
Exception
{
assertTrue
(
actualMetaData
.
isCaseSensitive
(
1
));
assertTrue
(
actualMetaData
.
isCaseSensitive
(
2
));
}
@Test
public
void
isSearchable
()
throws
Exception
{
assertFalse
(
actualMetaData
.
isSearchable
(
1
));
assertFalse
(
actualMetaData
.
isSearchable
(
2
));
}
@Test
public
void
isCurrency
()
throws
Exception
{
assertFalse
(
actualMetaData
.
isCurrency
(
1
));
assertFalse
(
actualMetaData
.
isCurrency
(
2
));
}
@Test
public
void
isNullable
()
throws
Exception
{
assertEquals
(
actualMetaData
.
isNullable
(
1
),
ResultSetMetaData
.
columnNoNulls
);
assertEquals
(
actualMetaData
.
isNullable
(
2
),
ResultSetMetaData
.
columnNoNulls
);
}
@Test
public
void
isSigned
()
throws
Exception
{
assertTrue
(
actualMetaData
.
isSigned
(
1
));
assertTrue
(
actualMetaData
.
isSigned
(
2
));
}
@Test
public
void
getColumnDisplaySize
()
throws
Exception
{
assertEquals
(
actualMetaData
.
getColumnDisplaySize
(
1
),
0
);
assertEquals
(
actualMetaData
.
getColumnDisplaySize
(
2
),
0
);
}
@Test
public
void
getColumnLabel
()
throws
Exception
{
assertThat
(
actualMetaData
.
getColumnLabel
(
1
),
is
(
"order_id"
));
assertThat
(
actualMetaData
.
getColumnLabel
(
2
),
is
(
"order_no"
));
}
@Test
public
void
getColumnName
()
throws
Exception
{
assertThat
(
actualMetaData
.
getColumnName
(
1
),
is
(
"order_id"
));
assertThat
(
actualMetaData
.
getColumnName
(
2
),
is
(
"order_no"
));
}
@Test
public
void
getSchemaName
()
throws
Exception
{
assertThat
(
actualMetaData
.
getSchemaName
(
1
),
is
(
""
));
assertThat
(
actualMetaData
.
getSchemaName
(
2
),
is
(
""
));
}
@Test
public
void
getPrecision
()
throws
Exception
{
assertEquals
(
actualMetaData
.
getPrecision
(
1
),
0
);
assertEquals
(
actualMetaData
.
getPrecision
(
2
),
0
);
}
@Test
public
void
getScale
()
throws
Exception
{
assertEquals
(
actualMetaData
.
getScale
(
1
),
0
);
assertEquals
(
actualMetaData
.
getScale
(
2
),
0
);
}
@Test
public
void
getTableName
()
throws
Exception
{
assertThat
(
actualMetaData
.
getTableName
(
1
),
is
(
""
));
assertThat
(
actualMetaData
.
getTableName
(
2
),
is
(
""
));
}
@Test
public
void
getCatalogName
()
throws
Exception
{
assertThat
(
actualMetaData
.
getCatalogName
(
1
),
is
(
""
));
assertThat
(
actualMetaData
.
getCatalogName
(
2
),
is
(
""
));
}
@Test
public
void
getColumnType
()
throws
Exception
{
assertEquals
(
actualMetaData
.
getColumnType
(
1
),
Types
.
BIGINT
);
assertEquals
(
actualMetaData
.
getColumnType
(
2
),
Types
.
VARCHAR
);
assertThat
(
actualMetaData
.
getColumnType
(
1
),
is
(
Types
.
BIGINT
));
}
@Test
public
void
getColumnTypeName
()
throws
Exception
{
assertThat
(
actualMetaData
.
getColumnTypeName
(
1
),
is
(
""
));
assertThat
(
actualMetaData
.
getColumnTypeName
(
2
),
is
(
""
));
}
@Test
public
void
isReadOnly
()
throws
Exception
{
assertTrue
(
actualMetaData
.
isReadOnly
(
1
));
assertTrue
(
actualMetaData
.
isReadOnly
(
2
));
}
@Test
public
void
isWritable
()
throws
Exception
{
assertFalse
(
actualMetaData
.
isWritable
(
1
));
assertFalse
(
actualMetaData
.
isWritable
(
2
));
}
@Test
public
void
isDefinitelyWritable
()
throws
Exception
{
assertFalse
(
actualMetaData
.
isDefinitelyWritable
(
1
));
assertFalse
(
actualMetaData
.
isDefinitelyWritable
(
2
));
}
@Test
public
void
getColumnClassName
()
throws
Exception
{
assertThat
(
actualMetaData
.
getColumnClassName
(
1
),
is
(
"java.lang.Long"
));
assertThat
(
actualMetaData
.
getColumnClassName
(
2
),
is
(
"java.lang.String"
));
assertThat
(
actualMetaData
.
getColumnClassName
(
1
),
is
(
"java.lang.Number"
));
}
@Test
...
...
@@ -179,5 +162,4 @@ public class GeneratedKeysResultSetMetaDataTest {
public
void
isWrapperFor
()
throws
Exception
{
assertTrue
(
actualMetaData
.
isWrapperFor
(
GeneratedKeysResultSetMetaData
.
class
));
}
}
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/GeneratedKeysResultSetTest.java
浏览文件 @
01f5a950
...
...
@@ -17,8 +17,6 @@
package
com.dangdang.ddframe.rdb.sharding.jdbc
;
import
com.google.common.collect.Table
;
import
com.google.common.collect.TreeBasedTable
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.mockito.Mockito
;
...
...
@@ -26,8 +24,7 @@ import org.mockito.Mockito;
import
java.math.BigDecimal
;
import
java.sql.ResultSet
;
import
java.sql.Statement
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Arrays
;
import
static
org
.
hamcrest
.
MatcherAssert
.
assertThat
;
import
static
org
.
hamcrest
.
core
.
Is
.
is
;
...
...
@@ -41,21 +38,9 @@ public class GeneratedKeysResultSetTest {
private
GeneratedKeysResultSet
actualResultSet
;
static
GeneratedKeysResultSet
createMock
()
{
Map
<
String
,
Integer
>
columnMap
=
new
HashMap
<>();
columnMap
.
put
(
"order_id"
,
0
);
columnMap
.
put
(
"order_no"
,
1
);
Table
<
Integer
,
Integer
,
Object
>
valueTable
=
TreeBasedTable
.
create
();
valueTable
.
put
(
0
,
0
,
1L
);
valueTable
.
put
(
0
,
1
,
"OL_1"
);
valueTable
.
put
(
1
,
0
,
2L
);
valueTable
.
put
(
1
,
1
,
"OL_2"
);
return
new
GeneratedKeysResultSet
(
valueTable
,
columnMap
,
STATEMENT
);
}
@Before
public
void
init
()
{
actualResultSet
=
createMock
(
);
actualResultSet
=
new
GeneratedKeysResultSet
(
Arrays
.<
Number
>
asList
(
1L
,
2L
).
iterator
(),
"order_id"
,
STATEMENT
);
}
@Test
...
...
@@ -87,9 +72,9 @@ public class GeneratedKeysResultSetTest {
@Test
public
void
getString
()
throws
Exception
{
assertTrue
(
actualResultSet
.
next
());
assertThat
(
actualResultSet
.
getString
(
2
),
is
(
"OL_
1"
));
assertThat
(
actualResultSet
.
getString
(
1
),
is
(
"
1"
));
assertTrue
(
actualResultSet
.
next
());
assertThat
(
actualResultSet
.
getString
(
"order_
no"
),
is
(
"OL_
2"
));
assertThat
(
actualResultSet
.
getString
(
"order_
id"
),
is
(
"
2"
));
assertFalse
(
actualResultSet
.
next
());
}
...
...
@@ -161,18 +146,18 @@ public class GeneratedKeysResultSetTest {
@Test
public
void
getBytes
()
throws
Exception
{
assertTrue
(
actualResultSet
.
next
());
assertThat
(
actualResultSet
.
getBytes
(
2
),
is
(
"OL_
1"
.
getBytes
()));
assertThat
(
actualResultSet
.
getBytes
(
1
),
is
(
"
1"
.
getBytes
()));
assertTrue
(
actualResultSet
.
next
());
assertThat
(
actualResultSet
.
getBytes
(
"order_
no"
),
is
(
"OL_
2"
.
getBytes
()));
assertThat
(
actualResultSet
.
getBytes
(
"order_
id"
),
is
(
"
2"
.
getBytes
()));
assertFalse
(
actualResultSet
.
next
());
}
@Test
public
void
getObject
()
throws
Exception
{
assertTrue
(
actualResultSet
.
next
());
assertThat
(
actualResultSet
.
getObject
(
2
),
is
((
Object
)
"OL_1"
));
assertThat
(
actualResultSet
.
getObject
(
1
),
is
((
Object
)
1L
));
assertTrue
(
actualResultSet
.
next
());
assertThat
(
actualResultSet
.
getObject
(
"order_
no"
),
is
((
Object
)
"OL_2"
));
assertThat
(
actualResultSet
.
getObject
(
"order_
id"
),
is
((
Object
)
2L
));
assertFalse
(
actualResultSet
.
next
());
}
...
...
@@ -190,5 +175,4 @@ public class GeneratedKeysResultSetTest {
public
void
getStatement
()
throws
Exception
{
assertThat
(
actualResultSet
.
getStatement
(),
is
(
STATEMENT
));
}
}
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingStatementTest.java
浏览文件 @
01f5a950
...
...
@@ -27,7 +27,6 @@ import java.sql.SQLException;
import
java.sql.Statement
;
import
static
org
.
hamcrest
.
CoreMatchers
.
is
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
static
org
.
junit
.
Assert
.
assertFalse
;
import
static
org
.
junit
.
Assert
.
assertThat
;
import
static
org
.
junit
.
Assert
.
assertTrue
;
...
...
@@ -198,17 +197,19 @@ public final class ShardingStatementTest extends AbstractShardingDataBasesOnlyDB
assertFalse
(
stmt
.
getGeneratedKeys
().
next
());
assertFalse
(
stmt
.
execute
(
String
.
format
(
sql
,
1
,
"init"
),
Statement
.
RETURN_GENERATED_KEYS
));
assertTrue
(
stmt
.
getGeneratedKeys
().
next
());
assert
Equals
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
3
);
assert
That
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
is
(
3L
)
);
assertFalse
(
stmt
.
execute
(
String
.
format
(
sql
,
1
,
"init"
),
new
int
[]{
1
}));
assertTrue
(
stmt
.
getGeneratedKeys
().
next
());
assert
Equals
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
4
);
assert
That
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
is
(
4L
)
);
assertFalse
(
stmt
.
execute
(
String
.
format
(
sql
,
1
,
"init"
),
new
String
[]{
"user_id"
}));
assertTrue
(
stmt
.
getGeneratedKeys
().
next
());
assert
Equals
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
5
);
assert
That
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
is
(
5L
)
);
assertFalse
(
stmt
.
execute
(
String
.
format
(
sql
,
1
,
"init"
),
new
int
[]{
2
}));
assertFalse
(
stmt
.
getGeneratedKeys
().
next
());
assertTrue
(
stmt
.
getGeneratedKeys
().
next
());
assertThat
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
is
(
6L
));
assertFalse
(
stmt
.
execute
(
String
.
format
(
sql
,
1
,
"init"
),
new
String
[]{
"no"
}));
assertFalse
(
stmt
.
getGeneratedKeys
().
next
());
assertTrue
(
stmt
.
getGeneratedKeys
().
next
());
assertThat
(
stmt
.
getGeneratedKeys
().
getLong
(
1
),
is
(
7L
));
}
}
}
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/util/SQLUtilTest.java
浏览文件 @
01f5a950
...
...
@@ -19,7 +19,7 @@ package com.dangdang.ddframe.rdb.sharding.util;
import
org.junit.Test
;
import
static
org
.
hamcrest
.
CoreMatcher
s
.
is
;
import
static
org
.
hamcrest
.
core
.
I
s
.
is
;
import
static
org
.
junit
.
Assert
.
assertThat
;
public
class
SQLUtilTest
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录