2021SC@SDUSC
继续上周对AbstractSQLConfig的分析
后续代码为对
getEqualString()
getCompareString()
getKey()
getSQLKey()
方法的定义
知识学习
SQL中的Equal() 函数
Equal( ) 函数用于比较两个可变长度的不透明类型。此函数实现比较运算符,因此可以通过使用函数名或对应符号在 SQL 语句中使用。
返回:布尔值
语法
Equal(node1,node2)
node
要测试相等性的节点。
node2
要与第一个节点比较以测试相等性的节点。示例
示例 1
SELECT * FROM tablename WHERE Equal(nodecolumn, “1.4”);示例 2
SELECT * FROM tablename WHERE nodecolumn = “1.4”;此示例与示例 1 相同,不同之处是使用了等号。
在getEqualString() 中添加了错误判断和报错信息
if (JSON.isBooleanOrNumberOrString(value) == false && value instanceof Subquery == false)
throw new IllegalArgumentException(key + ":value 中value不合法!非PUT请求只支持 [Boolean, Number, String] 内的类型 !");
boolean not = key.endsWith("!"); // & | 没有任何意义,写法多了不好控制
if (StringUtil.isName(key) == false)
throw new IllegalArgumentException(key + ":value 中key不合法!不支持 ! 以外的逻辑符 !");
后续几个方法定义类似,不再赘述
我们来看下面的代码
private List<Object> preparedValueList = new ArrayList<>();
private Object getValue(@NotNull Object value) {
if (isPrepared()) {
preparedValueList.add(value);
return "?";
}
return getSQLValue(value);
}
public Object getSQLValue(@NotNull Object value) {
// return (value instanceof Number || value instanceof Boolean) && DATABASE_POSTGRESQL.equals(getDatabase()) ? value : "'" + value + "'";
return (value instanceof Number || value instanceof Boolean) ? value : "'" + value + "'"; //MySQL 隐式转换用不了索引
}
@Override
public List<Object> getPreparedValueList() {
return preparedValueList;
}
@Override
public AbstractSQLConfig setPreparedValueList(List<Object> preparedValueList) {
this.preparedValueList = preparedValueList;
return this;
}
使用prepareStatement预编译,值为 ? ,后续动态set进去
知识学习
prepareStatement 的用法和解释
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句&#