继续iBATIS非查询标签
1 自动生成的键<selectKey>
每个插入的记录都会生成一个主键用于区分不同的记录,在各种数据库里提供了不同生成主键的方式,iBATIS很好地解决了重复取得同一键值的问题
<!-- 自动生成的键 --> <insert id="insertOneUser" parameterClass="User"> INSERT INTO USER ( USERID,USERNAME, PASSWORD, DEPARTMENT )VALUES( #userid#, #username#, #password#, #department# ) <selectKey keyProperty="userid" resultClass="int"> SELECT LAST_INSERT_ID() </selectKey> </insert>
keyProperty 那个对应数据库里对应主键的属性,resultClass返回的类型,SELECT LAST_INSERT_ID() 获得键值的方法,不同的数据库方法不同
< !—Oracle SEQUENCE Example --> <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> <selectKey resultClass="int" keyProperty="id" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectKey> 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>
insert语句可以放在主键生成之前也可以放在之后
Integer returnValue=(Integer)sqlMap.insert("insertOneUser",user) 可以返回插入的主键
2 存储过程
在使用的数据库里已有生成的存储过程,配置文件里配置如下:
<!-- 存储过程 --> <parameterMap id="pro" class="java.util.Map"> <parameter property="name" jdbcType="VARCHAR" javaType="string" mode="IN"/> </parameterMap> <procedure id="pro_insert" parameterMap="pro"> {call new_proc(?)} </procedure>
new_proc为已定义好的存储过程名,用call调用,传入一个参数就传一个?
测试类:
//调用存储过程 Map m=new HashMap(1); m.put("name", new String("LISI")); sqlMap.update("pro_insert",m); Integer i=(Integer)sqlMap.queryForObject("pro_insert",m);
3 批量处理
一次将多条语句提交给数据库而不是一条一条提交,可以提升优势和性能
sqlMap.startBatch(); sqlMap.insert("insertOneUser",user1); sqlMap.insert("insertOneUser",user2); sqlMap.executeBatch();
#结束