MyBatis直接执行SQL查询及批量插入数据

摘要:
换句话说,当MyBatis看到#{}时,它会认为您正在为sql中的变量赋值,就像您在JDBC编程中为问号赋值一样。当MyBatis看到${}时,它将直接用变量的值替换它,而不进行任何处理。因此,我们可以看到有两种方法来定义<select>的返回值。一种是定义resultMap,然后引用resultMap,另一种是直接使用resultType来指定类的路径。

一、直接执行SQL查询:

 1、mappers文件节选

<resultMap id="AcModelResultMap" type="com.izumi.InstanceModel">
  <result column="instanceid" property="instanceID" jdbcType="VARCHAR" />
  <result column="instancename" property="instanceName" jdbcType="VARCHAR" />
</resultMap>

<select id="getInstanceModel" resultType="com.izumi.InstanceModel">
  ${paramSQL} 

</select>

2、DAO类节选

public interface SomeDAO{
  List<InstanceModel> getInstanceModel(@Param("paramSQL")String sql);

3、注意事项 

3.1:传入方法的参数sql必须遵循以下规范"select XXX as instanceid, XXX as instancename ....." ,否则MyBatis无法自动将查询结果变成Java对象。

3.2: mappers文件中的#{}语法与${}语法的区别:

    默认情况下, #{}语法会促使MyBatis生成PreparedStatement属性并且使用PreparedStatement的参数(=?)来设置值。如果你想直接将未更改的字符串代入到sql中,可以使用${}。

    也就是说,MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(比如MyBatis会判断它的类型,并自动在前后加单引号)。而当MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理。

所以在使用${}的时候,不需要像#{}一样写"jdbcType=VARCHAR"之类的属性。 

3.3:resultType和resultMap

按照1中的写法, < resultMap > 部分可以删除不用了,因为在接下来的<select>中没用使用定义的resultMap,而是使用了resultType。

所以我们可以看出,关于<select >返回值的定义有两种写法,一种是定义一个resultMap然后引用这个resultMap,还有一种就是直接使用resultType指定一个类的路径。

二、批量插入数据

1、经验告诉我们,使用insert into XXX values(XX)(XXX)(XXX),比使用insert into XXX values(XX),insert into XXX values(XXX),insert into XXX values(XXX)效率要高。

2、在MyBatis中的用法 

2.1、mappers文件节选 

<insert id="insertBatch">
insert into student (
<include refid="Base_Column_List"/> )
values
<foreach collection="list" item="item" index="index" separator=",">
(null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})
</foreach>

</insert> 

2.2、DAO类节选

 public interface SomeDAO{

public void insertBatch(@Param("list")List<Student> students); 

 }

参考:

1、《MyBatis用户指南中文版》 译者:曾令祝 

2、http://winhack.iteye.com/blog/1522181

免责声明:文章转载自《MyBatis直接执行SQL查询及批量插入数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Php在Window下的安装mybatis 批量插入和where条件使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mybatis一对多分页查询

今天遇到一个问题,当用户关联角色查询翻页时,如果一个用户有多个角色,会认为是多条记录,页面加载的时候就会发现记录数不对。 为了解决这个问题,我打算分两次查询,第一次只按分页查询出当前页应该展示的用户id列表,然后根据这个idlist去关联查询用户和角色的所有要用到的字段 java public Map<String, Object> selec...

Java消息系统简单设计与实现

前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息里包含了有:喜欢和赞、评论、关注、私信这样的一类东西,这样的一个系统应该包含以下的功能: 当用户评论/关注/点赞时能够通知到被评论/关注/点赞的用户,并...

Java之MyBatis

MyBatis中文文档:https://mybatis.org/mybatis-3/zh/index.htmlMyBatis是一款优秀的持久化框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动配置参数以及结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain...

LocalDatetime 与 mybatis、json的坑

总所周知,localdatetime是jdk8 推出的关于日期计算非常方便地一个类,一旦开始用上就欲罢不能。但是在使用的时候,坑还是蛮多的。 一、mybatis与LocalDatetime 如果直接将实体里面所有的Date类型换成LocalDatetime之后,运行程序是会报异常的。此时,可以加入以下依赖: <dependency> <...

干掉mapper.xml!MyBatis新特性动态SQL真香!

干掉mapper.xml!MyBatis新特性动态SQL真香! 当我们使用MyBatis的时候,需要在mapper.xml中书写大量的SQL语句。当我们使用MyBatis Generator(MBG)作为代码生成器时,也会生成大量的mapper.xml文件。其实从MBG 1.3.6版本以后,MyBatis官方已经推荐使用Dynamic SQL,使用这一新特...

[转]Mybatis出现:无效的列类型: 1111 错误

原文地址:http://www.cnblogs.com/sdjnzqr/p/4304874.html 在使用Mybatis时,不同的xml配置文件,有的会提示:无效的列类型: 1111 比如这个sql: updatebase.sys_person t set t.rybh=#{rybh},t.xm=#{xm},t.ry...