使用前,可以先看一下 链接: http://www.mybatis.org/mybatis-3/dynamic-sql.html 详细说明了 mybatis 的动态 sql 实现方式,这里将重点关注 Pluggable Scripting Languages For Dynamic SQL 一节。
因为懒,所以更追求极致
这里使用一个 UserMapper 做为 Demo 进行演示
- 查询一个用户
@Select("SELECT * FROM id = #{id}")
UserEntity get(@ParamVariable("id") long id);
- 新增用户
@Insert("INSERT INTO user (name, age, sex, edu, created_at, updated_at) VALUES (#{name}, #{age}, #{sex}, #{edu}, #{created_at}, #{updated_at})")
boolean insert(
@ParamVariable("name") long name,
@ParamVariable("age") long age,
@ParamVariable("sex") long sex,
@ParamVariable("edu") long edu,
@ParamVariable("created_at") long created_at,
@ParamVariable("updated_at") long updated_at,
);
可以发现,上面新增用户这个过程很痛苦,特别是字段越多,过程越难受,幸运的是 mybatis 为我们提供了动态 SQL 的功能,下面将上述代码进行修改,并通过实现 LanguageDriver 来提供一个动态数据赋值的过程
- InsertByMapLanguageDriver.java
package com.test.driver;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.scripting.LanguageDriver;
import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
import org.apache.ibatis.session.Configuration;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class InsertByMapLanguageDriver extends XMLLanguageDriver {
private final Pattern pattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");
@Override
public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {
Matcher matcher = pattern.matcher(script);
if (matcher.find()) {
String field = "<foreach collection=\"$1\" index=\"__key\" separator=\",\">\\${__key}</foreach>";
String value = "<foreach collection=\"$1\" item=\"__value\" separator=\",\">#{__value}</foreach>";
script = matcher.replaceAll("("+ field +") VALUES ("+ value +")");
}
script = "<script>" + script + "</script>";
return super.createSqlSource(configuration, script, parameterType);
}
}
使用方法:
@Insert("INSERT INTO user (#{map})")
boolean insert(@PathVariable("map") Map<String, Object> map);
有时候,我们还会对表名进行动态设置,上面部分还可以如此修改:
@Insert("INSERT INTO ${table} (#{map})")
boolean insert(@PathVariable("map") Map<String, Object> map, @PathVariable("table") String table);
- 更新用户
@Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")
boolean update(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("id") long id);
注: Update 方法可以同 Insert 一样进行修改,如下:
- 删除用户
@Delete("DELETE FROM user WHERE id = #{id}")
void delete(@ParamVariable("id") long id);