Mybatis的实用技巧
1、模糊查询
MySQL模糊查询一般是使用like条件,我们经常使用传入的变量作为like的条件。在MyBatis里面,like使用变量需要用到$或者concat。建议使用concat,#{}可以防止SQL注入。
like '%${value}%' like concat('% ',#{value}, '%')
2、插入:存在则忽略
数据不存在则插入,数据已存在则忽略,可以使用MySQL ignore来实现。当primary key 或者unique key重复时会自动忽略本次插入操作。
insert ignore into webVisit (ip ) values(#{ipl})
3、插入:不存在则插入,存在则更新
数据不存在则插入,数据已存在则更新,可以使用MySQL on duplicate key update来实现。当primary key 或者unique key重复时会自动执行update。
insert into webVisit ( date , ip ,uri, count) values(#{date}, #{ip}, #{uri}, 1) ON DUPLICATE KEY update count= count + 1
4、插入:存在则更新
数据不存在则插入,数据已存在则替换,可以使用MySQL replace into来实现。当primary key或者unique key重复时会自动替换已存在的数据。实际上是先删除原有数据,然后插入新数据。
replace into webVisit(date, ip, url, count) values(#{date}, #{ip}, #{url}, 1)
5、MyBatis新增insert语句执行完返回该条记录自增的ID
<insert id="xxxxxxxx" parameterType="com.example.ProductPo"> insert into product (name, type_id, price, create_time, update_time) value (#{name}, #{type_id}, #{price}, #{create_time}, #{update_time}) <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Long" order="AFTER"> select LAST_INSERT_ID() as id </selectKey> </insert>
6、设置超时时间
通过timeout属性可以设置超时时间,也就是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。
<update id="demo" timeout="100"></update>
7、复用SQL片段
用sql标签可以定义SQL片段,用于SQL语句复用。
<sql id="Base_Column_List"> userld, email</sql> <select id="selectByld" parameterType="java.lang.Long" resultMap="ResultMap"> select <include refid="Base_Column_List" /> from user where userld = #{userld} </select>
8、批量插入数据
批量插入数据能够极大提升性能,曾经测试过多条数据插入时间从分钟级降低到秒级完成。批量插入主要用到 forEach标签,把批量数据转换成values语句。
foreach标签的属性主要有item,index,collection,open,separator,close。
item:集合中元素迭代时的别名;
index: 集合中元素迭代时的索引;
open:常用语where语句中,表示以什么开始,比如以('开始;
separator:表示在每次进行迭代时的分隔符;
close:用语where语句中,表示以什么结束;
collection:集合值;
<insert id="batchInsert" parameterType="java.util.List"> insert into 'demo(userld, url) values <foreach collection="list" item="item" separator=","> (#{item.userld}, #{item.url}) </foreach> </insert>