iBatis执行非查询语句(CRUD,函数和过程)
CRUD操作中除了查询操作,其他都统一称为更新操作,因为增删改都是更新数据库表的,SqlMap API中对应的方法就是insert,update和delete,我们逐一来看。
insert方法的方法签名为:Object insert(String id, String parameterObject) throws SQLException。那么我们需要传递的参数就是XML文件中的映射语句名称和执行插入操作所需要的参数。返回值为Object类型,也就是说它可以返回一个对象。我们想想通过插入语句我们希望得到什么呢?没错,就是插入这条记录的主键。
这里还不得不多说一下主键的问题。虽然每种数据库都有自己主键的生成方式,但对于这种将数据插入到数据库后立即要知道主键的情况,就会产生问题。iBatis中的insert元素的一个子元素selectKey可以帮助我们获取自动生成的主键并保存在返回对象中,它有两种调用方式:
第一就是数据插入到数据库中之后立即抓取这条记录的主键的值,但此时要注意抓取的值确实是刚插入的记录的,也就是说数据库的驱动支持这么操作。如果有两个线程同时执行insert操作,其可能的顺序为insert #1,insert #2,selectKey #1,selectKey #2,那么在执行selectKey #1时得到的就是第二个记录的主键值了,这显然对程序产生了影响。
第二种方式就是在插入记录之前就获取键,然后连同这个键一同插入到数据库中,这样就不存在第一种情况的风险,是安全的操作。这种方式更倾向于支持序列的数据库。
在MySQL数据库中没有序列的支持,那么可以使用LAST_INSERT_ID()函数来获取自动生成的主键,我们来一段代码:
自动生成的主键userId这里我们就不用写了,然后定义插入语句的映射:
这是订单表,简单做示例,就订单名称和生成订单的时间两项即可。
这是订单项表,字段见名知意,这里就不多解释了。下面来看看实体类的设计:
下面是订单项的实体类,也很简单:
虽然iBatis是SQL映射,但是实体类中我们使用对象类型而不是基本数据类型还是有很多好处的,比如直接和null判断。下面我们来看SQL映射文件,其中使用了简单的动态SQL,这个后面会详细来说明。
在SQL配置中,我们定义一个存储过程和映射参数类型:Map m = new HashMap(2);m.put("a", new Integer(7));m.put("b", new Integer(5));Integer val = (Integer) sqlMap.queryForObject("User.in_example", m);System.out.println(val);
打印的结果就是7。至此iBatis的非查询语句就介绍完了。 1 楼 hellostory 2012-08-27 关于ibats更新update的书写方式,个人愚见:
为什么非得要“<isNotEmpty>”才能更新字段呢?有这样一种情况,用户之前在备注字段写了一些信息,现在想把备注字段清空,那就没法实现了。 2 楼 sarin 2012-08-27 hellostory 写道关于ibats更新update的书写方式,个人愚见:
为什么非得要“<isNotEmpty>”才能更新字段呢?有这样一种情况,用户之前在备注字段写了一些信息,现在想把备注字段清空,那就没法实现了。
那是动态SQL的一部分,用于判断字段逻辑而进行最终SQL的动态拼装