Ibatis基本的sql语句

Ibatis映射文件中,首先要指定一个命名空间来代表自己

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

先写到这 ,以后想到了再补充。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值