Tip:mapper.xml中sql语句不允许出现分号!

1、#和$符号的区别

  • #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  • $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
  • #方式能够很大程度防止sql注入
  • $方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名.

    例如:

    select  *  from  $tableName$  对于不同的表执行统一的查询

    update  $tableName$  set  name = #name#  每个实体一张表,改变不用实体的状态

  • 一般能用#的就别用$.

2、ibatis何时使用CDATA?

  在xml元素中,"<"和"&"是非法的,"<"会产生错误,因为解析器会把该字符解释为新元素的开始,"&"也会产生错误,因为解析器会把该字符解释为字符实体的开始。

所以这时候会用"<![CDATA[    ]]>" 括起来。

3、在ibatis中,批量插入,iterate标签。其中 COMPUTE_MSEL 是FUNCTION

    <insert id="batchInsert" parameterClass="java.util.List">
insert all
<iterate conjunction=" ">
into MONITOR_T_STA_TRACEDAILY
(TXNTRACENUMBER,
TXNCODE,
TXNREQUESTCHANNELID,
TXNBOCBANKREQUESTTIME,
TXNBOCBANKREQUESTDATE,
TXNBOCBANKRESPONSETIME,
TXNBOCBANKRESPONSEDATE,
TXNRETURNCODE,
TXNRETURNMESSAGE,
RESPONSESECONDS,
CREATETIME)
values
<![CDATA[
(#recordList[].txntracenumber#,
#recordList[].txncode#,
#recordList[].txnrequestchannelid#,
#recordList[].txnbocbankrequesttime#,
#recordList[].txnbocbankrequestdate#,
#recordList[].txnbocbankresponsetime#,
#recordList[].txnbocbankresponsedate#,
#recordList[].txnreturncode#,
#recordList[].txnreturnmessage#,
COMPUTE_MSEL(
#recordList[].txnbocbankrequestdate#,
#recordList[].txnbocbankrequesttime#,
#recordList[].txnbocbankresponsedate#,
#recordList[].txnbocbankresponsetime#),
sysdate)
]]>
</iterate>
select * from dual
</insert>

4、ibatis,批量插入时,当插入数据量太大时,会报 Cause: java.sql.SQLException: ORA-01745: 无效的主机/绑定变量名

这时候采用,分批插入的方式,如下:

public Long insertBatch(List<StaTraceDaily> list){
//每批次插入数量
int batchCount = 1000;
//游标
int index = 0;
//批次
int batchNum = 1;
try {
for(;;){
if(index+batchCount>=list.size()){
//一次可全部插入
batchInsert(list.subList(index,list.size()));
System.out.println("第"+batchNum+"批:插入"+(list.size()-index)+"条");
break;
}else {
//需要多次插入
List<StaTraceDaily> staTraceDailyList = list.subList(index, index + batchCount);
batchInsert(staTraceDailyList);
index = index+batchCount;
System.out.println("第"+batchNum+"批:插入"+batchCount+"条");
}
batchNum++;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("over~,总共插入"+list.size()+"条,插入了"+batchNum+"批");
return null;
}

5、事务
Tip:
事务不能嵌套。在调用 commit()或 rollback()之前,从同一线程多次调用.startTransaction,将引起抛出异常。
对于每个 SqlMap 实例,每个线程最多只能打开一个事务。

例:

UserDao.insertUser (user); // Starts transaction

user.setName("wh");

UserDao.updateUser (user); // Starts a new transaction

因为没有显式地启动事务,iBatis会认为这是两次事务,分别从连接池中取两次Connection。

try {

daoManager.startTransaction();

UserDao.insertUser (user);

user.setName("wh");

UserDao.updateUser(user);

otherDao.doSomething(other);

...

daoManager.commitTransaction();

} finally {

daoManager.endTransaction();

}

这样就保持了原子性,整体为一个事务,要么全部执行成功,否则回滚。

最新文章

  1. WinForm------Reflector反编译工具下载
  2. Centos7 修改SSH 端口
  3. Android开发者必须掌握的知识技能清单
  4. VMware 安装CentOS
  5. Matlab实现单(双)极性(不)归零码
  6. L - Fabled Rooks(中途相遇法和贪心)
  7. JSTL标签总结
  8. jQuery自学笔记(五):关于jQuery的遍历
  9. CCI_chapter 1
  10. 原已经安装好的nginx,现在需要添加一个未被编译安装的模块--echo-nginx-module-0.56
  11. NYOJ 252 01串(斐波那契数列变形)
  12. python_如何快速下载安装第三方库?
  13. [ Java学习基础 ] Java对象的创建和销毁
  14. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
  15. 如何创建ChromeApp
  16. python爬虫基础_scrapy
  17. mybatis_generator_逆向工程的使用笔记
  18. 树莓派使用iperf3测量网络带宽
  19. Spring Boot源码分析
  20. uva-704-暴力枚举-双向bfs

热门文章

  1. 用eclipse运行算法第四版的BinarySearch
  2. PHP静态方法和普通方法的区别
  3. 吴裕雄--天生自然 JAVA开发学习:方法
  4. Activiti工作流的入门介绍
  5. Unity中的事件监听
  6. 如何正确理解SQL关联子查询
  7. 痢疾杆菌|SARS
  8. 浅谈那些你不知道的C艹语法
  9. c++语法(2)
  10. document.write的时机