`

MyBatis批量插入和批量新增。

 
阅读更多

曾在学习Redis时,技术牛画了一个数据库的发展图,Redis最终发展竟是关系型数据库;你恨不得想说个OH ,FUCK!就像IBatis发展到Mybatis,最后发展方向极可能是HIbernate,这个...

 

本次批量新增或者修改功能,数据库类型是Oracle,表是BATCH_INSERT_TEST、POJO类BatchOptionTest、接口BatchOptionTestMapper和配置文件BatchOptionTestMapper.xml。

 

create table BATCH_OPTIONS_TEST
(
  ID                VARCHAR2(50) not null,
  NAME              VARCHAR2(50)
)

 

 

 

public class BatchOptionTest{
	private String id ;
	private String name;
      /**get和set省去**/
}
  
public interface BatchOptionTestMapper {
	int batchInsertTestMethod(@Param(value="list")List<BatchOptionTest> dataList);
	}
 
 

 

 1:MyBatis 批量新增

 

(1)批量新增方式1

 

 

INSERT INTO BATCH_INSERT_TEST (ID,NAME) VALUES('1','SMARTISAN T1');
INSERT INTO BATCH_INSERT_TEST (ID,NAME) VALUES('2','坚果');
 

 

     
   结合MyBatis的foreach标签,BatchInsertTestMapper.xml中的方法可以如下定义。
 
<insert id="batchInsertTestMethod" parameterType="List">
		<if test="list != null and list.size() > 0">
			<foreach collection="list" item="obj" open="BEGIN" separator=";" close=";END;"  >
				INSERT INTO BATCH_OPTIONS_TEST(ID,NAME) VALUES (#{obj.id,jdbcType=VARCHAR},#{obj.name,jdbcType=VARCHAR})
			</foreach>
		</if>
	</insert>
 
 
 测试新增数据成功,返回值是-1(关于返回值,可以参考Oracle Doc 的解释,因为我也没弄清楚,哈哈)。
 
(2)批量新增方式2
 
INSERT INTO BATCH_INSERT_TEST(ID,NAME)
SELECT '1','SMARTISAN T1' FROM DUAL
UNION ALL 
SELECT '2','坚果' FROM DUAL
 
结合MyBatis的foreach标签,BatchOptionTestMapper.xml中的方法可以如下修改。
 
	<insert id="batchInsertTestMethod" parameterType="List">
		<if test="list != null and list.size() > 0">
			INSERT INTO BATCH_OPTIONS_TEST(ID,NAME)
			<foreach collection="list" item="obj" separator="UNION ALL">
				SELECT (#{obj.id,jdbcType=VARCHAR},#{obj.name,jdbcType=VARCHAR}) FROM DUAL
			</foreach>
		</if>
	</insert>
 
 测试新增数据成功,返回值等于list的大小。
 
(3) 总结
      批量新增第二种方式更好,也可以根据实际需求,批次批量新增。

2:MyBatis 批量更新
接口BatchOptionTestMapper新增两个更新方法。
 
public interface BatchOptionTestMapper {
	int batchUpdateTestMethodOne(@Param(value="list")List<String> dataList,@Param(value="name")String name);
	int batchUpdateTestMethodTwo(@Param(value="list")List<BatchOptionTest> dataList);
}
 
(1)批量更新方式1 (比如将ID是1和2的数据name修改为Smartisan T2)
 
<insert id="batchUpdateTestMethodOne" >
		<if test="list != null and list.size() > 0">
			UPDATE BATCH_OPTIONS_TEST 
			<set>
				NAME = #{name,jdbcType=VARCHAR}
			</set>
			<where>
			 ID IN 
				<foreach collection="list" item="id" open="(" separator="," close=")">
					#{id,jdbcType=VARCHAR}
				</foreach>
			</where>
		</if>
	</insert>
 
测试更新数据成功,返回值是list的size大小。
       
(2)批量更新方式2(比如将ID是1的数据name修改为Smartisan T2,ID是2的数据name修改为坚果MINI)
 
<insert id="batchUpdateTestMethodTwo" parameterType="List" >
		<if test="list != null and list.size() > 0">
			<foreach collection="list" item="obj" index="index" open="begin" close=";end;" separator=";">
				UPDATE BATCH_OPTIONS_TEST
					<set>
						<if test=" obj.name != null and obj.name != '' ">
						 	NAME = #{obj.name,jdbcType=VARCHAR}
						</if>
					</set>
					<where>
						ID=#{obj.id,jdbcType=VARCHAR}
					</where>
			</foreach>
		</if>
	</insert>
 
  测试更新数据成功,返回值是-1(关于返回值,可以参考Oracle Doc 的解释,因为我也没弄清楚,哈哈)。
 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics