iBATIS非查询标签2

 继续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();

 

#结束

你可能感兴趣的:(oracle,sql,ibatis,SQL Server,Microsoft)