您的位置:首页 > 数据库

Ibatis基本的sql语句

2014-05-18 16:44 162 查看
[java] view
plaincopy





<span style="font-family: Arial, Helvetica, sans-serif;">Ibatis映射文件中,首先要指定一个命名空间来代表自己</span>

<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>多折腾一下。

但也查了下用的时候该怎么用:

[java] view
plaincopy





<!-- 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>

[java] view
plaincopy





<!— 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>

[java] view
plaincopy





<!-- 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关键字进行区别,也是猜测。

先写到这 ,以后想到了再补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: