/SqlWrapper

sql查询封装

Primary LanguageJava

###本项目基于mybatis-plus二次封装,致力于简化多表查询,特殊场景查询 ####目前只针对多表查询使用(单表查询plus框架足以胜任)

###使用方式:

场景一: 多表分页查询

Controller

@RequestMapping("/page")
    public R<IPage<SysUserVO>> page(SysUserVO sysUserVO) {
        Page<SysUserVO> page = new Page(1,10);
        return R.ok(sysUserService.findPage(page, sysUserVO));
    }

Service

@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
    @Override
    public IPage<SysUserVO> findPage(Page<SysUserVO> page, SysUserVO sysUserVO) {

        return baseMapper.findPage(page, Condition.get(sysUserVO));
    }

}

Mapper

@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
    @Select("${ew.sqlSelect} " +
            "from sys_user u " +
            "left join sys_user_role ur on ur.user_id=u.id " +
            "left join sys_role r on ur.role_id=r.id " +
            " ${ew.customSqlSegment}")
    IPage<SysUserVO> findPage(Page<SysUserVO> page, @Param(Constants.WRAPPER) Wrapper wrapper);
}

也可以使用xml

 <select id="findPage" resultType="com.example.demo.entity.vo.SysUserVO">
    ${ew.sqlSelect}
    from sys_user u
    left join sys_user_role ur on ur.user_id=u.id
    left join sys_role r on ur.role_id=r.id
    ${ew.customSqlSegment}
 </select>

###注意: 多表查询在查询的字段和条件中通常要使用表别名,避免字段冲突

public class SysUserVO extends SysUser {
   @TableField("r.name")
   private String roleName;
   @TableField("u.id")
   private String id;
   @TableField("u.create_date")
   private String createDate;
   @TableField("u.modify_date")
   private String modifyDate;
   @TableField("u.name")
   private String name;
}

使用plus原生注解@TableField("u.name") 指定别名,如果VO类继承父类的属性中要使用别名需重写该属性,如果觉得麻烦可以不使用自动封装的查询字段(默认查询VO类所有属性字段,包括继承的)

Condition.get(sysUserVO).select("xxxx") 可以覆盖默认的查询字段

场景二

###自定义注解@Conditions灵活性

/**
 * @author ljd
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Conditions {
    SqlKeywords value() default SqlKeywords.EQUAL;
}

类似于plus原生注解@TableField(condition = SqlCondition.LIKE)

封装多条件查询,自定义日期查询方式,格式转化,可扩展== #####例:title字段不包含某字符

    @Conditions(SqlKeywords.NOT_LIKE)
    private String title;

#####创建日期在某个时间区间内

@Conditions(SqlKeywords.BETWEEN)
    private String createDate;

前端传两个时间用‘,’逗号分隔开,这样后台只需要加个注解而不用写其他代码简化了很多

BETWEEN(){
        @Override
        public void approve(QueryWrapper<?> qw, String k, Object v) {
            String[] doubleStr = Convert.toStr(v).split(",");
            qw.between(k,doubleStr[0],doubleStr[1]);
        }

单个日期模糊匹配,查询2020-05-07创建的用户

    @Conditions(SqlKeywords.LIKE_DATE)
    private String createDate;

使用右模糊查询不影响索引使用

LIKE_DATE(){
        @Override
        public void approve(QueryWrapper<?> qw, String k, Object v) {
            qw.likeRight(k, DateUtil.formatDate(Convert.toDate(v)));
        }
    },

有值不想加入查询条件的字段

    @Conditions(SqlKeywords.IGNORE)
    private String name;

加入查询条件但是不加入查询结果的字段,可命名为DTO字段,例:

    private String nameDTO;

其余查询场景可自行扩展

场景三 #####多表查询代码拼接sql

return baseMapper.findPage(page, Condition.get(sysUserVO).from(SysUser.class,"u")
                .leftJoin(SysUserRole.class,"ur","ur.user_id=u.id")
                .leftJoin(SysRole.class,"r","ur.role_id=r.id"));

后续拼接条件改为Lambda 表达式(持续开发中..)

场景四 ####查询用户列表及角色名称以及角色下所拥有的菜单资源列表 。。。。。。。。。。。。。

由于个人能力有限,如果本项目有什么不对的地方欢迎留言指正 #如果本项目对你有帮助请给我一个Star ###相关内容会更新至Blog https://mumudadi.top