当前位置: 移动技术网 > IT编程>开发语言>Java > 详解MyBatis直接执行SQL查询及数据批量插入

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

一、直接执行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); 
}

详解mybatis批量插入数据

首先看看批处理的mapper.xml文件

<insert id="insertbatch" parametertype="java.util.list">
<selectkey keyproperty="fetchtime" order="before"
resulttype="java.lang.string">
select current_timestamp()
</selectkey>
insert into kangaiduoyaodian ( depart1, depart2, product_name,
generic_name, img, product_specification, unit,
approval_certificate, manufacturer, marketprice, vipprice,
website, fetch_time, productdesc ) values
<foreach collection="list" item="item" index="index"
separator=",">
( #{item.depart1}, #{item.depart2}, #{item.productname},
#{item.genericname}, #{item.img},
#{item.productspecification}, #{item.unit},
#{item.approvalcertificate}, #{item.manufacturer},
#{item.marketprice}, #{item.vipprice}, #{item.website},
#{fetchtime}, #{item.productdesc} )
</foreach>
</insert>

在批处理中,我发现有几个需要注意的问题

1、主键的自动获取,在insert中添加usegeneratedkeys=”true” keyproperty=”id”这两个属性无效,并且或中断数据插入,如果id是数据库自增的话,可以什么都不写,在插入的语句中去除主键属性,还有就是利用

<selectkey keyproperty="id" order="before"
resulttype="java.lang.integer">
select last_insert_id()
</selectkey>

注意 :<selectkey > 标签在insert下只能存在一个;批处理的时候不适合使用<selectkey >,主键自增最好,或者指定
2,插入时间的获取如上面所示,我用的是mysql,只要是mysql函数都可以拿来使用,插入时间和主键都是mysql函数中的一个。。。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网