您的位置:首页 > 其它

ibatis注意要点

2016-08-08 14:23 155 查看


ibatis注意要点

一、ibatis的关键字like查询
select * from t_student where s_name '%张%';
这种like语句在ibatis中怎么写,他们现在的项目是用ibatis作为持久层的框架。
我的第一反应是这样写:

<select id="showOneStudentByName" parameterClass="String" resultMap="studentORM">

     select * from t_student where s_name like #name#

</select>
但是在调用中需要在参数的前后加上%,比如这样:

return sqlMapper.queryForList("showOneStudentByName", "%"+name+"%");
虽然这样可行,但总显得有些不协调。仔细看了ibaitis的文档后发现最好的写法是这样

<select id="showOneStudentByName" parameterClass="String" resultMap="studentORM">

   select * from t_student where s_name like '%'||#name#||'%' 

</select>
在调用的时候就不用去前后加%了。
注意:sql语句不要写成select * from t_student where s_name like '%$name$%',这样极易受到注入攻击。

网上搜了一下ibatis的关于like的使用,撇开 '%$xxx$%' 不讲。网上的解决方法如下:

select *
from user
where username like '%'||#username#||'%'


其实上面的语句是针对Oracle 的,对于不同数据库字符串连接符不一样。 现列举mysql

select *
from user
where username like concat('%', #username#, '%')


            
二、ibatis操作陷阱

在使用iBatis操作数据的时候,容易跌入陷阱。
1、保存insert方法

在保存数据方面,iBatis的insert方法返回的是新增记录的主键,类型为Object,但实为整型,有时候会让人误解为实体类型,也并非任何表的insert操作都会返回主键----这是一个陷阱。

要返回这个新增记录的主键,前提是表的主键是自增型的,或者是Sequence的。否则获取新增记录主键的值为0或者null。

对于oracle这样来写:

<selectKey resultClass="int" keyProperty="id">

<![CDATA[

select hibernate_seq.nextval as id from dual

]]>

</selectKey>

对比Hibernate返回的Serializable类型,实际上也是主键。
2、更新删除update/delete方法

返回影响的记录行数。
3、对DAO/Service设计时候的影响

1)、对于自增主键类型表,DAO的save方法可以返回主键、或者实体对象(该对象的标识符域会填充上主键值)。

2)、对于非自增主键类型表,DAO的save方法,在保存之前就指导整个实体对象的所有值(包括主键),因此返回什么 都可以,也可以不返回值。

3)、对于Service的,不管表如何,一般都返回保存的实体对象。
------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: