mybatis批量问题

格言:好记性不如烂笔头

最近用到mybatis 批量插入和查询操作,现在把配置文件批量操作部分记录如下,为了日后查阅;

<select id="selectByIds" parameterType="long"
        resultMap="TrackingMessageinfoDOResultMap">
        select
        <include refid="MybatisTrackingMessageinfoDAO_all_column_fields"></include>
        from tracking_messageinfo
        where id in
        <foreach collection="list" item="tmiDOId" index="index" open="("
            close=")" separator=",">
            #{tmiDOId}
        </foreach>

</select>

<insert id="insertBatch" parameterType="java.util.List"
        useGeneratedKeys="true">
        insert into tracking_messageinfo(
        logEvent,resolution,operatorSystem,browser,colorDepth,flashVersion,javaEnabled,device,localIp,trackerCode,categroy,theme,userId,ip,region,sessionId,trackTime,guid,referrer,url,cookieId
        )
        values
        <foreach collection="list" item="tmiDO" index="index"
            separator=",">
            (
            #{tmiDO.logEvent},#{tmiDO.resolution},
            #{tmiDO.operatorSystem},#{tmiDO.browser},#{tmiDO.colorDepth},
            #{tmiDO.flashVersion},#{tmiDO.javaEnabled},#{tmiDO.device},
            #{tmiDO.localIp},#{tmiDO.trackerCode},#{tmiDO.categroy},#{tmiDO.theme},
            #{tmiDO.userId},#{tmiDO.ip},#{tmiDO.region},#{tmiDO.sessionId},#{tmiDO.trackTime},
            #{tmiDO.guid},#{tmiDO.referrer},#{tmiDO.url},#{tmiDO.cookieId}
            )
        </foreach>
    </insert>

<!-- select标签和 insert标签批量插入的区别 :useGeneratedKeys="true" -->
    <!-- <select id="insertBatch" parameterType="java.util.List">
        insert into
        tracking_messageinfo(
        logEvent,resolution,operatorSystem,browser,colorDepth,flashVersion,javaEnabled,device,localIp,trackerCode,categroy,theme,userId,ip,region,sessionId,trackTime,guid,referrer,url,cookieId
        ) values
        <foreach collection="list" item="tmiDO" index="index"
            separator=",">
            ( #{tmiDO.logEvent},#{tmiDO.resolution},
            #{tmiDO.operatorSystem},#{tmiDO.browser},#{tmiDO.colorDepth},
            #{tmiDO.flashVersion},#{tmiDO.javaEnabled},#{tmiDO.device},
            #{tmiDO.localIp},#{tmiDO.trackerCode},#{tmiDO.categroy},#{tmiDO.theme},
            #{tmiDO.userId},#{tmiDO.ip},#{tmiDO.region},#{tmiDO.sessionId},#{tmiDO.trackTime},
            #{tmiDO.guid},#{tmiDO.referrer},#{tmiDO.url},#{tmiDO.cookieId} )
        </foreach>
    </select> -->

<insert id="insertBatch1" parameterType="com.meitun.tracking.domain.TrackingMessageinfoDO"
        useGeneratedKeys="true">
        insert into tracking_messageinfo(
        logEvent,resolution,operatorSystem,browser,colorDepth,flashVersion,javaEnabled,device,localIp,trackerCode,categroy,theme,userId,ip,region,sessionId,trackTime,guid,referrer,url,cookieId
        )values
        <foreach collection="list" item="tmiDO" index="index"
            separator=",">
            (
            <include refid="MybatisTrackingMessageinfoDAO_parameter_fields"></include>
            <!-- 不用 <![CTATA[<include refid="MybatisTrackingMessageinfoDAO_parameter_fields"></include>]]> 也可以
            #{tmiDO.logEvent},#{tmiDO.resolution},
            #{tmiDO.operatorSystem},#{tmiDO.browser},#{tmiDO.colorDepth},
            #{tmiDO.flashVersion},#{tmiDO.javaEnabled},#{tmiDO.device},
            #{tmiDO.localIp},#{tmiDO.trackerCode},#{tmiDO.categroy},#{tmiDO.theme},
            #{tmiDO.userId},#{tmiDO.ip},#{tmiDO.region},#{tmiDO.sessionId},#{tmiDO.trackTime},
            #{tmiDO.guid},#{tmiDO.referrer},#{tmiDO.url},#{tmiDO.cookieId} -->
            )
        </foreach>
    </insert>

以上的每个方法,包括注释掉了的方法都可以正常运行(去掉注释后),只是为了学习,留待以后查阅才这么写。

另外,引入网上找的一篇博客的文章:

http://quinnhe.iteye.com/blog/2068314

要做批量插入数据库,首先得知道该数据库对批量插入所支持的语法。每个数据库批量插入的语法都不一样,我介绍两种。  
 MySQL:1、INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,‘张三‘),(2,‘李四‘)  
               2、INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,‘张三‘);INSERT INTO TABLE_NAME(ID,NAME)VALUES(2,‘李四‘)  
 Oracle:1、INSERT INTO TABLE_NAME (ID,NAME) (SELECT 1,‘张三‘ from dual) union all (SELECT 2,‘李四‘ from dual)  
              2、INSERT INTO TABLE_NAME (ID,NAME) VALUES(1,‘张三‘);INSERT INTO TABLE_NAME(ID,NAME)VALUES(2,‘李四‘)  
 4条SQL都是数据库支持的写法。两者的第二种是不推荐的写法,因为不管效率还是可读性上都远差于第一种  
 当然,还有更重要的一点,Mybatis不支持第二种写法,因为mybatis的一个事务只支持一条SQL  
 所以,Mybatis里写法只能取两者的第一种,代码如下  
 MySQL

<select id="batchSave" parameterType="java.util.List">
                INSERT INTO TABLE_NAME(ID,NAME) VALUES                <foreach collection="list"  item="itm" separator=",">
                        (#{itm.id},#{itm.name})                </foreach>
        </select>

ORACLE:

<select id="batchSave" parameterType="java.util.List">
                INSERT INTO TABLE_NAME(ID,NAME) 
                <foreach collection="list"  item="itm" separator="union all">
                        (SELECT #{itm.id},#{itm.name} FROM DUAL)                </foreach>
        </select>

注意事项: 这里要注意了,标签一定得是<SELECT>,不能是<INSERT>或者<UPDATE>,否则就要报错。。

引文结束。

对于上面引文中的主意事项,我用的是mysql数据库,经过验证<select> 和<insert> 标签都可以完成批量插入操作,批量更新没有试验过,想来也是一样的。

还有,经别人验证,oracle数据库必须是<select>标签,否则报错。

这个问题留待以后再研究。

时间: 2025-01-18 17:50:57

mybatis批量问题的相关文章

Mybatis批量Insert及水平分表

首先是Mybatis批量insert 说一下核心部分,整个工程参考我的github,运行的main方法在org/xiongmaotailang/mybatis/batchinsert/DbUtil.java中,涉及到的脚本是sql.txt 需要的数据表示例,包括4个字段. CREATE TABLE `newspvuv` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `pv` bigint(11) DEFAULT NULL,   `uv`

MyBatis批量插入数据(MySql)

由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,应该要比循环插入的效果更好,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来.供以后查阅和学习. java代码: 注意:这里循环的时候需new 出来新的对象,而不能通过循环改变属性的值就认为这是一个新的对象了,通俗的说就是new ReddemCode()要放在for循环的里面.

mybatis批量删除,亲测可用

以前看了理论以为很容易就可以实现批量删除,谁知道自己写了才发现错误百出!百度mybatis批量删除,列出来的我没一个跑的通的(不排除是我自己的原因) 下面这种写法我自己测试是通过的! mybatis配置什么的这里不多提了,不懂也不会看到这个知识点 首先是mapper: <delete id="delStu" parameterType="java.util.List"> DELETE FROM STUDENT WHERE stuId IN <for

Mybatis批量更新数据

Mybatis批量更新数据 第一种方式 [html] view plain copy print? <update id="updateBatch" parameterType="Map"> update aa   set a=#{fptm}, b=#{csoftrain} where c in <foreach collection="cs" index="index" item="item&qu

myBatis批量添加,修改和删除

摘自: http://blog.csdn.net/myjlvzlp/article/details/8434376 1.批量添加元素session.insert(String string,Object o) public void batchInsertStudent(){ List<Student> ls = new ArrayList<Student>(); for(int i = 5;i < 8;i++){ Student student = new Student(

mybatis批量插入、批量删除

mybatis 批量插入 int addBatch(@Param("list")List<CustInfo> list); <insert id="addBatch" parameterType="java.util.List"> INSERT INTO CUSTINFO( SERIALID, CUSTID, INVNM, UPDATETIMESTAMP ) <foreach collection="lis

Mybatis批量删除之Error code 1064, SQL state 42000;

(一)小小的一次记载. (二):最近的项目都是使用MyBatis,批量新增自己都会写了,但是一次批量删除可把我给折腾了下,写法网上都有,但是照着做就是不行,最后问公司的人,问网友才得到答案,那就是jdbc中需要在url中指定允许进行进行多条语句同时执行. 自己在写批量更新的时候也把相应的语句打印出来了的,复制出来执行是没问题,但是用junit测试的时候一直报错如下 Error code 1064, SQL state 42000: You have an error in your SQL sy

解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置. (3)collection:根据传入的参数值确定. (4)open:表示该语句以什么开始. (5)separator:表示在每次进行迭代之间以什么符号作为分隔 符. (6)close:表示以什么结束. 首先,错误的xml配置文件如下: <insert id="save" da

mybatis批量更新

mybatis批量更新 以前做的东西,怕忘了随手做一个记录 首先在配置数据库连接字符串后面加上 &allowMultiQueries=true 我的完整的是这样的 jdbc:mysql://192.168.1.200:3306/huasheng?characterEncoding=utf-8&allowMultiQueries=true Controller层把一个JSON字符串转换成list集合 @RequestMapping(value = "/update") p