最近公司有几个项目的数据库用的oracle,有段时间没用,然后果断就掉坑里面了,记录几个比较有代表性的。
1:关于oracle的批量数据插入,我用TK通用mapper的insertList方法自动拼接出来的sql是这样的
insert into table(column1,column2)values
(value1,value2),
(value3,value4)。。。
咋一看没啥问题啊,然后就一直报 sql未正确结束,出于对自己sql的过于自信,导致一直都在思考是否是参数问题,浪费了好几个小时,后来把sql拼好直接丢到数据库跑了跑才发现,这种sql确实是不能在oracle跑的,oracle批量插入的语法应该是:
INSERT ALL
INTO A(field_1,field_2) VALUES (value_1,value_2)
INTO A(field_1,field_2) VALUES (value_3,value_4)
INTO A(field_1,field_2) VALUES (value_5,value_6)
粗略的瞅了下TK的代码,貌似确实没有校验数据库驱动就直接开始拼sql了
public String insertList(MappedStatement ms) {
Class> entityClass = this.getEntityClass(ms);
StringBuilder sql = new StringBuilder();
sql.append(SqlHelper.insertIntoTable(entityClass, this.tableName(entityClass)));
sql.append(SqlHelper.insertColumns(entityClass, true, false, false));
sql.append(" VALUES ");
sql.append("");
sql.append("");
Set columnList = EntityHelper.getColumns(entityClass);
Iterator var5 = columnList.iterator();
while(var5.hasNext()) {
EntityColumn column = (EntityColumn)var5.next();
if (!column.isId() && column.isInsertable()) {
sql.append(column.getColumnHolder("record") + ",");
}
}
sql.append(" ");
sql.append(" ");
return sql.toString();
}
不过我觉得这种插件肯定是有兼容方案的,并且使用了这个插件跟使用源生mybatis并不冲突,所以实际对开发并没有影响,算是复习一下oracle的基础并提醒下自己,程序员还是老老实实先run起来,自以为是的经验有时候也很坑的。
2:关于oracle的比较符号(<> =)和null
先复习一下
一般数据库查询某某字段为空或者不为空的时候都是用is null或者is not null
如果查询条件使用=null或者<>null是查不出来数据的
但是赋值却可以用=null如
update BUS_PLATFORM.bus_trans set return_code = null where return_msg= 'tac验证通过';
这个是可以执行成功的,不过这个都是表外的值操作,那么当表内的数据有null时,又有啥坑呢,比如
select * from table1 where name <>'zhansan'
查询表中name字段不为zhangsan的数据,当表中有name为null的数据时,这些数据也是查不出来的.比如表中有100条数据,一条数据的name值为zhangsan ,九条数据的name值为null,那么这条sql只能查出90条数据,所以如果确切的需求要查询name值不为zhangsan的数据且包括name值为null的数据,sql应该为
select * from table1 where name <>'zhansan' or name is null
3:这个是mybatis的一个规范,基本是凑数的,不过也坑过我
先上内容:mybatis插入null值时需要指定该值的类型(jdbctype),不然会报错。
因为不指定类型的话mybatis会自己去适配匹配的数据库字段类型,null适配不了。搞不定就报错,很稳。不过一般使用xml配置sql的话一般都不会有这个问题,写的时候顺手都会写上。这个也是我使用TK的时候暴露出来的问题,在使用insert方法的时候有null就挂了,不过TK有个insertSelective方法做插入的时候会自动过滤掉空值。
end