Mybatis通用Join的实现

你是否还在为mybatis的多表关联查询而写xml烦恼,是否还在为动态组装查询条件烦恼,是否还在为此没有合适的解决方案烦恼?

mybatis-extension插件,解决开发过程中需要多表关联时需手写xml或者注解sql的烦恼。同样支持通过传入自定义sql返回结果集。
纯mybatis原生支持,轻量级无侵入,可用于辅助mybatis-plus、tk.mybatis或者mybatis-generator使用。

1.运行依赖:
* mybatis>=3.5.2
* jdk>=1.8

2.特性:
2.1. 支持多表自定义join关联查询
2.2. 支持自定义AND/OR混合条件,排序,分页等
2.3. 支持GROUPBY/HAVING聚合查询
2.4. 支持自定义sql查询
2.5. 所有的列名选择功能支持lambda写法和字符串输入两种方式
2.6. 自动判断表名、列名与实体类名、字段名对应,多表关联时自动给表名起别名
2.7. 内置多种mybatis generator常用插件,例如批量新增、分页等

3.性能:
比mybatis-generator性能提高约30%,甚至比navicat中直接执行查询还快,与其他插件的对比待测试。

4.不足:
不支持单表多次重复关联
不支持复杂的三层嵌套AND/OR
不支持多表UNION

5.最佳实践:
轻量级扩展,无其他依赖,可辅助其他mybatis插件使用,为解决JOIN关联为生,并持续提供各种特性

6.使用说明(springboot示例,代码在本文下方下载)

6.1pom.xml中引入mybatis-extension的依赖

<dependency>
    <groupId>priv.rexsheng</groupId>
    <artifactId>mybatis-extension</artifactId>
    <version>1.2.1</version>
</dependency>

6.2 在启动类或者配置类上加入扫描mapper包

@MapperScan(basePackages = {"priv.rexsheng.mybatis.mapper"})

6.3配置mybatis拦截器

import priv.rexsheng.mybatis.interceptor.ResultTypeInterceptor;

@Configuration
public class InterceptorConfig {
    @Bean
    public ResultTypeInterceptor resultTypeInterceptor() {
        return new ResultTypeInterceptor();
    }
}

6.4正常使用mapper接口查询即可

import priv.rexsheng.mybatis.extension.TableQueryBuilder;
import priv.rexsheng.mybatis.mapper.DynamicMapper;
import priv.rexsheng.mybatis.test.dto.UserRoleQueryDto;
import priv.rexsheng.mybatis.test.entity.TUser;
import priv.rexsheng.mybatis.test.entity.UserRole;

@SpringBootTest
public class MapperTest {
    @Autowired
    private DynamicMapper dao;
    
    /**
     * 单表简单查询
     */
    @Test
    public void simpleSelect() {
        //定义要查询的表的构建器
        TableQueryBuilder<TUser> userQuery=TableQueryBuilder.from(TUser.class);
        //定义要查询的字段
        userQuery.select(TUser::getUserId,TUser::getUserName).and().like(TUser::getUserName, "%王二小%");
        //执行查询
        List<TUser> userList=dao.selectByBuilder(userQuery.build());
        log.info("用户列表:{}",userList);
    }
}

7. 各种查询使用说明

7.1单表查询

    @Test
    public void simpleUserList() {
        TableQueryBuilder<TUser> userQuery=TableQueryBuilder.from(TUser.class);
        //只查询user_id与user_name两个字段,
        userQuery.select(TUser::getUserId,TUser::getUserName)
        .where().gt(TUser::getUserId, 3)
        .or().isNotNull(TUser::getUpdateUser).isNotNull(TUser::getCreateTime);
        //按照创建时间倒序取前10条
        userQuery.orderByDesc(TUser::getCreateTime).take(10);
        List<TUser> userList=dao.selectByBuilder(userQuery.build());
        logger.info("用户列表:{}",userList);
    }
2020-09-03 06:45:32.272 DEBUG 18496 --- [           main] p.r.m.m.D.selectByBuilder_TUser          : ==>  Preparing: SELECT user_id AS userId, user_name AS userName FROM t_user WHERE (user_id > ?) AND (update_user IS NOT NULL OR create_time IS NOT NULL) ORDER BY create_time DESC LIMIT ? 
2020-09-03 06:45:32.293 DEBUG 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值