<sqlMap namespace="xuesheng"></sqlMap>
1、在<sqlMap>元素内包含的就都是一些sql语句了,这些sql语句是由不同的元素“包裹”起来的,这些元素有<select> <insert> <update> <delete> <procedure>。 看这些元素名
字就知道他们分别是用来包裹哪一类sql语句的。还有一个元素<statement> 这个元素是通用的,可以包裹任意的sql语句,但是不怎么招人待见,反正我是一次没用过,据说他
也不是完全通用(据官方文档说 的) ,有些特性在这个元素下还是不好使的,例如<insert>元素下可以有<selectKey>元素,换成<statement>就不好使。
说到这个主键,我平时用sql server 做添加操作的时候并且主键还是自增长类型的我就在数据库里设置,用oracle的时候就用 seq_tableName.nextnvl 获取,一般不用他提供
的那个<selectKey>多折腾一下。
但也查了下用的时候该怎么用:
<!-- Oracle SEQUENCE -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" type="pre">
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
</selectKey>
<![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>
</insert>
<!— Microsoft SQL Server IDENTITY Column Example -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
<!-- Mysql 这个例子测试了,可以用-->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
insert into PRODUCT(PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
2、写这些基本的sql语句需要注意的地方
(1)、首当其冲的就是sql语句结束之后不要写分号
(2)、Ibatis不支持sql语句中的某些特殊字符 例如> < 需要用<![CDATA[ ]]>将那部分包起来。
(3)、查询的字段一定要跟resultClass或者resultMap中的字段名称对应上,如果字段名字不对应,请 as 起别名。
(4)、## $$ 两种引用参数的方式是有区别的:
$$ 的实际作用是进行字符串拼接 等效于StringBuffer类的append方法。
## 的作用是用来做变量替换的。
举几个开发中遇到的例子:
A、
String tableName=t_apply;
select * from $tableName$ 这里就是拼接了一个字符串吗,这种情况下用##是会报错的,因为##只用来做变量替换的。
B、
String idStr="1,2,3,4,5";
select * from tableName where id in ($idStr$) 这里用## 也会报错 你用##的话他会把idStr的值当成一个
C、
String sql="select pid from t_table where t_table_id=1"
select * from tableName where id=($sql$) 这里你用##同样会报错的
说白了 ##里面传的字符串值到了数据库里是带着单引号的,$$传递的字符值到了数据库里 不会再加个单引号
也就是说A例子中如果用了## 那么执行的sql语句将是 select * from 't_applu' 想想 能用吗?
$$传参数会带来sql注入的问题 , 不需要用的时候千万别用。
(5)、突然想起来Ibatis的一个bug,不是关于写sql方面的,刚想起来就先放在这里了:
sqlMapConfig.xml中 引入映射文件的时候一定要注意顺序, 例如A映射文件中用到了B映射文件的内容 ,那么A一定要放在B的下面,否则启动程序报错,不信你去试一下。
(6)、写sql的时候给表起别名的时候有时候会加个as 例如 select a.* from apply as a 这句话在sql server 和 Mysql中都支持 ,在Oracle中竟然不支持,Oracle中给字段
起别名可以用as 给表起别名不可以用 就是select a.* from apply a; 想了一想应该是为了与存储过程、函数、视图中的as关键字进行区别,也是猜测。
先写到这 ,以后想到了再补充。