IBatisNet XML 特殊配置
4 特殊配置
4.1 XML转义字符
很多时候在SQL语句中会用到大于或者下于符号(即:><),这个时候就与XML规范相冲突,影响XML映射文件的合法性。通过加入CDATA节点来避免这种情况的发生,如:
<statement id="SelectPersonsByAge" parameterClass="int" resultClass="Person">
<![CDATA[
SELECT * FROM PERSON WHERE AGE > #value#
]]>
</statement>
4.2自动生成主键
目前很多数据库都支持为新插入的记录自动生成主键,Oracle也提供这种功能,通过序列加触发器来解决。这当然很方便,但是当希望在插入一条记录后立即获得该记录的主键值,问题就出现了,因为很可能为此不得不新写一条语句去获取该主键值。iBatis.Net提供了一种比较好的解决方式。通过在XML数据映射文件中的<selectKey>元素来获取这些自动生成的主键值并将其保存在对象中。
如上面的"添加"操作配置信息修改为:
<insert id="InsertSysuser" parameterClass="Sysuser">
<selectKey resultClass="int32" property="Userid" type="pre">
SELECT DEAN.SEQ_SYSUSER_USERID.NEXTVAL AS Userid FROM DUAL
</selectKey>
INSERT INTO DEAN.SYSUSER (USERID,PASSWORD,LOGINNAME,SEX,BIRTHDAY,IDCARD,OFFICEPHONE,FAMILYPHONE,MOBILEPHONE,EMAIL,ADDRESS,ZIPCODE,REMARK,STATUS)
VALUES (#Userid#,#Password#,#Loginname#,#Sex#,#Birthday#,#Idcard#,#Officephone#,#Familyphone#,#Mobilephone#,#Email#,#Address#,#Zipcode#,#Remark#,#Status#)
</insert>
粗体部分为新加的selectKey节点。#Userid#参数将使用节点中从序列里选出的值进行填充。修改调用的代码:
ISqlMapper mapper = Mapper.Instance(); //得到ISqlMapper实例
Int32 result = (Int32)mapper.Insert("SysuserMap.InsertSysuser", model);//调用Insert方法
Label1.Text = "添加用户成功,result返回UserID为" + Convert.ToString(result) + ",Sysuser实例model的UserID为" + Convert.ToString(model.Userid);
运行程序,这样result就得到想要获取的键值,同时Sysuser的实例化对象model的UserID属性也返回了该条新记录的键值。
4.3 #与$的选择
在XML数据映射文件中,参数用#号来表示。如前面提到的#Userid#,同时也可以使用$来标识。两者有什么区别,以及如何选择呢?
(1)#是把传入的数据当作参数,如 order by #field# ,如果#field#传入的值是字符型,传入值为id, 则sql语句会生成order by "id",很明显生成的sql语句提交给数据库执行会报错。#参数往往用在需传入实际变量值的情况,如where id=#id#,变量#id#传入10,则sql语句会生成where id=10。
(2)$采用拼接方式生成sql语句,即传入的数据直接生成在sql语句里,如 order by $field$,如$field$传入的是id,则sql语句会生成order by id。$参数方式一般用于传入数据库对象。例如传入表名。不过要特别提醒,因为使用该参数是直接组成sql语句,所以需注意防止sql注入。
4.4 LIKE语句处理
在查询处理过程中,模糊查询经常会用到。iBatis如何处理这种模糊查询呢?处理Like模糊查询iBatis提供以下两种方法:
(1)使用#参数: 配置如Where UserName Like #param#||'%', 采用参数传递的方式,如#param#传入字符d,生成的sql语句为Where UserName Like 'd%',其他模糊情况同理可以相应配置出来。
(2)使用$参数:配置如Where UserName Like '$param$%' ,采用字符串替换,就是用参数的值替换param,如$param$传入字符d,也可以生成相同的语句。