MySQL数据库 
批量操作主要使用的是Mybatis的foreach,遍历参数列表执行相应的操作,所以批量插入/更新/删除的写法是类似的,只是SQL略有区别而已。MySql批量操作需要数据库连接配置allowMultiQueries=true才可以。

(0)批量查询:

  1. <select id="selectUserDataList" parameterType="list" resultType="String">
  2. select userData from tbl_hbb_user_info where mobile in (
  3. <foreach collection="list" item="item" index="index"
  4. separator=",">
  5. #{item.mobile}
  6. </foreach>
  7. )
  8. </select>

(1)批量插入

  1. <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true">
  2. <foreach close="" collection="list" index="index" item="item" open="" separator=";">
  3. insert into user (name, age,dept_code) values
  4. (#{item.name,jdbcType=VARCHAR},
  5. #{item.age,jdbcType=INTEGER},
  6. #{item.deptCode,jdbcType=VARCHAR}
  7. )
  8. </foreach>
  9. </insert>

上面演示的是MySql的写法(表主键自增的写法),因为MySql支持主键自增,所以直接设置useGeneratedKeys=true,即可在插入数据时自动实现主键自增;不需要自增时就不需要设置useGeneratedKeys,而且插入SQL包含所有字段即可。实际Mysql还有另外一种写法,就是拼接values的写法,这种方法我测试过比多条insert语句执行的效率会高些。不过需要注意一次批量操作的数量做一定的限制。具体写法如下:

  1. <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true">
  2. insert into user (name, age,dept_code) values
  3. <foreach collection="list" index="index" item="item" open="" close="" separator=",">
  4. (#{item.name,jdbcType=VARCHAR},
  5. #{item.age,jdbcType=INTEGER},
  6. #{item.deptCode,jdbcType=VARCHAR}
  7. )
  8. </foreach>
  9. </insert>

对于Oracle不支持主键自增,需要序列替换,所以在SQL写法上略有不同,需要在insert语句前加个
<selectKey>...</selectKey>告知Mybatis主键如何生成(selectKey中间的内容有省略,实际是生成主键的SQL)。

(2)批量更新

  1. <update id="batchUpdate" parameterType="java.util.List">
  2. <foreach close="" collection="list" index="index" item="item" open="" separator=";">
  3. update user set name=#{item.name,jdbcType=VARCHAR},age=#{item.age,jdbcType=INTEGER}
  4. where id=#{item.id,jdbcType=INTEGER}
  5. </foreach>
  6. </update>

(3)批量删除

  1. <delete id="batchDelete" parameterType="java.util.List">
  2. <foreach close="" collection="list" index="index" item="item" open="" separator=";">
  3. delete from user
  4. where id=#{item.id,jdbcType=INTEGER}
  5. </foreach>
  6. </delete>

二、模糊查询

  1. <select id="selectLikeName" parameterType="java.lang.String" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List" />
  4. from user
  5. where name like CONCAT('%',#{name},'%' )
  6. </select>

上面的模糊查询语句是Mysql数据库的写法示例,用到了Mysql的字符串拼接函数CONCAT,其它数据库使用相应的函数即可。

三、多条件查询

多条件查询常用到Mybatis的if判断,这样只有条件满足时,才生成对应的SQL。

  1. <select id="selectUser" parameterType="map" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List" />
  4. from user
  5. <where>
  6. <if test="name != null">
  7. name = #{name,jdbcType=VARCHAR}
  8. </if>
  9. <if test="age != null">
  10. and age = #{age,jdbcType=INTEGER}
  11. </if>
  12. </where>
  13. </select>

四、联表查询 
联表查询在返回结果集为多张表的数据时,可以通过继承resultMap,简化写法。例如下面的示例,结果集在User表字段的基础上添加了Dept的部门名称

  1. <resultMap id="ExtResultMap" type="com.research.mybatis.generator.model.UserExt" extends="BaseResultMap">
  2. <result column="name" jdbcType="VARCHAR" property="deptName" />
  3. </resultMap>
  4.  
  5. <select id="selectUserExt" parameterType="map" resultMap="ExtResultMap">
  6. select
  7. u.*, d.name
  8. from user u inner join dept d on u.dept_code = d.code
  9. <where>
  10. <if test="name != null">
  11. u.name = #{name,jdbcType=VARCHAR}
  12. </if>
  13. <if test="age != null">
  14. and u.age = #{age,jdbcType=INTEGER}
  15. </if>
  16. </where>
  17. </select>
  1. <update id="stockDetailOkBatchUpdate" parameterType="map">
  2. <foreach collection="items" index="index" item="item" open="begin" close=";end;" separator=";">
  3. update T_MM_ADD_STOCK_DETAIL t
  4. set
  5. t.REMARK=#{item.remark},
  6. t.modify_time=sysdate,
  7. t.modify_user_code=#{currentUser}
  8. where t.id=#{item.id}
  9. <if test="index==items.size-1">
  10. ;
  11. update T_MM_ADD_STOCK t
  12. set
  13. t.modify_time=sysdate,
  14. t.modify_user_code=#{currentUser},
  15. t.remark=#{remark},
  16. t.STORAGE_STATE='待录价'
  17. where t.id=#{mainId}
  18. </if>
  19. </foreach>
  20. </update>

mybatis结合mysql批量操作及查询sql的更多相关文章

  1. Mybatis使用MySQL进行模糊查询时输入中文检索不到结果

    Mybatis使用MySQL进行模糊查询时输入中文检索时,需要在jdbcURL后增加参数   ?useUnicode=true&characterEncoding=UTF-8

  2. MySQL 的分页查询 SQL 语句

    MySQL一般使用 LIMIT 实现分页.基本语句为: SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... 在中小数据量的情况下,这样的SQL足够 ...

  3. mysql表名查询sql

    select table_schema,table_name,engine from information_schema.tables where table_schema not in('info ...

  4. MySQL锁表查询SQL

    // 查看进程 SHOW PROCESSLIST; // 查看是否锁表 SHOW OPEN TABLES WHERE In_use > 0; // 查看正在锁的事务 SELECT * FROM ...

  5. 使用mybatis从mysql里进行模糊查询的编码问题

    关于这个问题,记录下我的解决方法,希望对有同样困惑的朋友,有所帮助. 问题描述: 我在做mybatis从mysql里模糊查询时,如果模糊的关键词是字母的话,可以查出来.如果模糊的关键词是汉字的话,查不 ...

  6. Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm

    这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下   项目开发中,在做Mybatis动态查询时,遇到了 ...

  7. mybatis 多表查询sql

    在使用spring,spring mvc,mybatis时,mybatis链接数据库做多表查询的时候,sql语句中直接使用left join等链接字符就可以 链接多个表,参数类型是parameterT ...

  8. 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...

  9. MySQL、Oracle和SQL Server的分页查询语句

    假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...

随机推荐

  1. C++笔试题2(基础题)

    温馨提醒:此文续<C++笔试题(基础题)> (112)请写出下列程序的输出内容 代码如下: #include <iostream> using namespace std; c ...

  2. 输出列表为字符串,并在最后一个值前加上and 4.10.1

    逗号代码: def test4(lis): str1='' for i in range(len(lis)-1): str1+=(str(val[i])+', ') str1+=('and '+str ...

  3. bash 替换特殊字符

    bash 替换特殊字符 PID=`netstat -tpln|grep `;PID=${PID#*LISTEN};PID=`echo $PID | sed -s "s/\/java//g&q ...

  4. 设计模式之Chain of Responsibility(职责链)(转)

    Chain of Responsibility定义 Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  5. c# 静态方法和数据

    c#所有方法都必须在类的内部声明,但如果把方法或者字段声明为static就可以使用,类名代用方法或者访问字段. 在方法中声明一个静态变量a 和一个静态的aFun方法.下面是在主函数中调用. 从上图可以 ...

  6. C# 声明隐式类型的局部变量

    在c#中赋值给变量的值必须具有和变量相同的类型.如int值赋给int变量,c#编译器可以迅速判断变量初始化表达式的类型,如果变量类型不符,就会明确告诉你. 提示需要强制转换(例如在char中不允许使用 ...

  7. 囤币一族,被中国市场遗忘的价值币ADA

    囤币一族,被中国市场遗忘的价值币ADA ==========================长期囤币目标:trx十万个,ada一万个,eos五千个,nas一千个,ont一千个,eth一百个,比特币十个 ...

  8. byte & 0xff char 转换

    https://blog.csdn.net/lixingtao0520/article/details/75450883 版权声明:本文为博主原创文章,转载请注明作者与出处,http://blog.c ...

  9. Pony 编程语言介绍

    Pony,一种“Rust 遇上 Erlang”的语言,让开发快捷.安全.高效.高并发的程序更简单. 在 Wallaroo Labs,我是工程副总裁,我们正在构建一个用 Pony 编程语言编写的 高性能 ...

  10. 每日linux命令学习-grep模式检索

    grep模式检索指令包括grep,egrep,和fgrep,.Linux系统使用正则表达式优化文本检索,所以在此,笔者首先学习了一下正则表达式. 1. 正则表达式 正则表达式使用被称为元字符(Meta ...