MyBatis mapper 注解过程中通过 LanguageDriver 实现动态 SQL

版权声明:本文为大事龙原创文章,未经允许不得转载。 https://blog.csdn.net/w_yunlong/article/details/79201509

使用前,可以先看一下 链接: 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);

猜你喜欢

转载自blog.csdn.net/w_yunlong/article/details/79201509