美文网首页
Mybatis - 自定义BaseMapper SQLProvi

Mybatis - 自定义BaseMapper SQLProvi

作者: 33d31a1032df | 来源:发表于2017-05-21 21:40 被阅读1574次

SQL Provider

  • @InsertProvider
  • @UpdateProvider
  • @DeleteProvider
  • @SelectProvider

这些可选的SQL注解允许你指定一个类名和一个方法,在执行时来返回动态的SQL。

@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")
List<User> getUsersByName(String name);

class UserSqlBuilder {
    public String buildGetUsersByName(final String name) {
        return new SQL(){{
            SELECT("*");
            FROM("users");
            if (name != null) {
                WHERE("name like #{value} || '%'");
            }
            ORDER_BY("id");
        }}.toString();
    }
}

BaseMapper

我们可以使用 SQLProvider 构建属于自己的BaseMapper。

public interface BaseMapper<T, K> {
    @InsertProvider(type = SqlSourceBuilder.class, method = "build")
    public Long insert(T model);

    @UpdateProvider(type = SqlSourceBuilder.class, method = "build")
    public Long updateById(T model);

    @DeleteProvider(type = SqlSourceBuilder.class, method = "build")
    public Long deleteById(@Param("id") K id);

    @SelectProvider(type = SqlSourceBuilder.class, method = "build")
    public T getById(@Param("id") K id);

    @SelectProvider(type = SqlSourceBuilder.class, method = "build")
    public Boolean existById(@Param("id") K id);
}

SqlSourceBuilder

把用SQLProvider生成的ProviderSqlSource替换成DynamicSqlSource

public class SqlSourceBuilder {
    public static String build(Configuration configuration) {
        for (MappedStatement mappedStatement : configuration.getMappedStatements()) {
            if (mappedStatement.getSqlSource() instanceof ProviderSqlSource) {
                Class<?> providerClass = getProviderClass(mappedStatement);
                if (providerClass != SqlSourceBuilder.class)
                    continue;

                Class<?> mapperClass = getMapperClass(mappedStatement);
                Class<?>[] generics = getMapperGenerics(mapperClass);
                Class<?> modelClass = generics[0];
                Class<?> primaryFieldClass = generics[1];
                ResultMap resultMap = getResultMap(mappedStatement, modelClass);

                String sqlScript = getSqlScript(mappedStatement, mapperClass, modelClass, primaryFieldClass, resultMap);
                SqlSource sqlSource = createSqlSource(mappedStatement, sqlScript);
                setSqlSource(mappedStatement, sqlSource);
            }
        }
        return "sql";
    }
    ...
}

MapperTest 测试

public class MapperTest {
    @Test
    public void test() throws Exception {
        SqlSessionFactory sessionFactory = MybatisConfig.getSessionFactory();
        SqlSession session = sessionFactory.openSession();

        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = null;

        // 新增测试
        System.out.println("------------ 新增测试 ------------");
        user = new User();
        user.setId(1L);
        user.setAccount("conanli");
        user.setPassword("123456");
        System.out.println("insert: " + userMapper.insert(user));

        // 更新测试
        System.out.println("------------ 更新测试 ------------");
        user = new User();
        user.setId(1L);
        user.setPassword("111111");
        System.out.println("update: " + userMapper.updateById(user));

        // 获取测试
        System.out.println("------------ 获取测试 ------------");
        System.out.println("user: " + userMapper.getById(1L));

        // 删除测试
        System.out.println("------------ 删除测试 ------------");
        System.out.println("delete: " + userMapper.deleteById(1L));

        // 存在测试
        System.out.println("------------ 存在测试 ------------");
        System.out.println("exist: " + userMapper.existById(1L));

        session.commit();
        session.close();
    }
}

完整示例:GitHub
PS:本文使用的是mybatis-3.4.4

相关文章

  • Mybatis - 自定义BaseMapper SQLProvi

    SQL Provider @InsertProvider @UpdateProvider @DeleteProvi...

  • 自定义xxMapper继承mybatis-plus的BaseMa

    如果自定义xxMapper继承了mybatis-plus的BaseMapper时,xxMapper中不能有inse...

  • Mybatis - 自定义BaseMapper Language

    LanguageDriver MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动...

  • SpringBoot整合Mybatis-Plus

    1、引入mybatis-plus的包 2、编写mapper层,继承mybatis-plus中的BaseMapper...

  • mockito mybatis-plus 批处理 NullPoi

    mybatis-plus 中的批处理继承自ServiceImpl,...

  • mybatisplus分页插件踩坑

    1.如何使用 MyBatis Plus自带分页插件(即BaseMapper接口中的selectPage()方法),...

  • mybatis-plus无法使用BaseMapper的公用方法

    记录一次mybatis-plus无法使用BaseMapper的公用方法问题 1.因为项目中同时使用了mybatis...

  • MyBatis Plus之注解实现动态SQL

    使用MyBatis,所有的Dao层方法继承基类BaseMapper 一、使用