【SpringBoot专题】整合mybatis-plus之封装查询参数简化查询

【SpringBoot专题】整合mybatis-plus之封装查询参数简化查询

在这里插入图片描述

通常开发过程中,操作数据库是作为后端开发必要掌握的本领,今天分享的是springboot整合mybatis-plus,官网上也有很多栗子,今天整合不是重点,重点是小B今天造了个轮子,想写成博客分享出来。

项目中需要引入pom依赖,如下:

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>1.0.5</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>
        <!-- MySQL Connector -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

接着就是配置,我们可以用yml配置(仅仅是自己的爱好)

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml # 你的mapper sql文件位置
  type-aliases-package: fast.cloud.nacos.mybatis.entity # mybatis 扫遍实体类的位置
  configuration:
    map-underscore-to-camel-case: true  # 驼峰配置

#配置数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver 
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8
    username: root
    password: root
# 打印sql配置
logging:
  level:
     fast.cloud.nacos.mybatis.mapper: debug

#pagehelper 配置
pagehelper:
  helper-dialect: mysql
  reasonable: false
  support-methods-arguments: ture
  params: count=countSql

创建实体类,mapper接口,以及mapper.xml文件,自己可以写一个test类测试,具体代码后面会分享github地址。

在这里插入图片描述

下面要说的就是今天的重点了我们通常在查询的时候通常会写如下的代码:

QueryWrapper<DemoEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq();
        queryWrapper.lt();
        queryWrapper.like();
        .....还有很多查询条件,有时候还要加上参数的非空判断,很繁琐。

于是就造了一个轮子,能不能把这些查询条件给抽取出来呢,先给一个代码,就是封装的一个工具类,下面的代码思想就是,想把这些查询条件封装到一个类里面。

public class MyBaseRequest<T> extends CommonSearchRequest<T> {

    public <ENTITY> QueryWrapper<ENTITY> getQuery(Class<ENTITY> entityClass) {
        QueryWrapper<ENTITY> queryWrapper = new QueryWrapper<>();
        //添加sort
        if (this != null && this.getSortBy() != null) {
            queryWrapper.orderBy(true, this.getSortBy().getDirection() == 1 ? true : false, this.getSortBy().getField());
        }

        MyBaseRequest request = this;
        if (request.getCondition() == null) {
            return queryWrapper;
        }
        Class clazz = request.getCondition().getClass();

        //获取查询类Query的所有字段,包括父类字段
        List<Field> fields = getAllFieldsWithRoot(clazz);

        for (Field field : fields) {

            //获取字段上的@QueryWord注解
            QueryCondition qw = field.getAnnotation(QueryCondition.class);
            if (qw == null) {
                continue;
            }

            // 获取字段名
            String column = qw.column();
            //如果主注解上colume为默认值"",则以field为准
            if (column.equals("")) {
                column = field.getName();
            }

            field.setAccessible(true);

            try {
                Object value = field.get(request.getCondition());
                //如果值为null,注解未标注nullable,跳过
                if (value == null && !qw.nullable()) {
                    continue;
                }

                // can be empty
                if (value != null && String.class.isAssignableFrom(value.getClass())) {
                    String s = (String) value;
                    //如果值为"",且注解未标注emptyable,跳过
                    if (s.equals("") && !qw.emptyable()) {
                        continue;
                    }
                }

                //通过注解上func属性,构建路径表达式
                column = UnderlineToHump(column);
                switch (qw.func()) {
                    case equal:
                        queryWrapper.eq(column, value);
                        break;
                    case like:
                        queryWrapper.like(column, "%" + value + "%");
                        break;
                    case gt:
                        queryWrapper.gt(column, value);
                        break;
                    case lt:
                        queryWrapper.lt(column, value);
                        break;
                    case ge:
                        queryWrapper.ge(column, value);
                        break;
                    case le:
                        queryWrapper.le(column, value);
                        break;
                    case notEqual:
                        queryWrapper.ne(column, value);
                        break;
                    case notLike:
                        queryWrapper.notLike(column, "%" + value + "%");
                        break;
                }


            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
        return queryWrapper;
    }

    public static String UnderlineToHump(String para) {
        StringBuilder result = new StringBuilder();
        String a[] = para.split("_");
        for (String s : a) {
            if (!para.contains("_")) {
                result.append(s);
                continue;
            }
            if (result.length() == 0) {
                result.append(s.toLowerCase());
            } else {
                result.append(s.substring(0, 1).toUpperCase());
                result.append(s.substring(1).toLowerCase());
            }
        }
        return result.toString();
    }

    //获取类clazz的所有Field,包括其父类的Field
    private List<Field> getAllFieldsWithRoot(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        Field[] dFields = clazz.getDeclaredFields();//获取本类所有字段
        if (null != dFields && dFields.length > 0) {
            fieldList.addAll(Arrays.asList(dFields));
        }

        // 若父类是Object,则直接返回当前Field列表
        Class<?> superClass = clazz.getSuperclass();
        if (superClass == Object.class) {
            return Arrays.asList(dFields);
        }

        // 递归查询父类的field列表
        List<Field> superFields = getAllFieldsWithRoot(superClass);

        if (null != superFields && !superFields.isEmpty()) {
            superFields.stream().
                    filter(field -> !fieldList.contains(field)).//不重复字段
                    forEach(field -> fieldList.add(field));
        }
        return fieldList;
    }
}

封装请求类的代码如下

@EqualsAndHashCode(callSuper = true)
@Data
public class DemoCondition extends PageCondition {
    @QueryCondition(func = MatchType.like)
    private String name;
}

基于这样我们就可以写下测试代码了,如果想加查询条件的话,直接请求里面加上就好了。

MyBaseRequest<DemoCondition> request = new MyBaseRequest<>();
        DemoCondition demoCondition = new DemoCondition();
        request.setCondition(demoCondition);
        CommonSearchRequest.Sort sort = new CommonSearchRequest.Sort();
        sort.setDirection(1);
        sort.setField("name");
        request.setSortBy(sort);
        Page<DemoEntity> demoEntityPage = demoService.initPage(request);
        demoMapper.selectDemoPage(demoEntityPage);

比如我们在开发的时候,需求是一直在变的,比如产品经理一会相加个查询条件,我们只需要在我们的请求类里面添加就好了,至于其他的我们不用动了,正所谓,拥抱变化吧,哈哈~ 最后奉上github地址

https://github.com/fafeidou/fast-cloud-nacos/tree/master/fast-common-examples/fast-common-example-web

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!要在Spring Boot中整合MyBatis-Plus,你可以按照以下步骤进行操作: 步骤1:添加依赖 在你的Spring Boot项目的pom.xml文件中,添加MyBatis-Plus的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 请确保将`最新版本号`替换为MyBatis-Plus最新的版本号。 步骤2:配置数据源 在application.properties(或application.yml)文件中,配置数据库连接信息,例如: ```yaml spring.datasource.url=jdbc:mysql://localhost:3306/db_example spring.datasource.username=db_username spring.datasource.password=db_password spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 请将`db_example`、`db_username`和`db_password`分别替换为你的数据库名称、用户名和密码。 步骤3:创建实体类和Mapper接口 创建对应的实体类,并使用`@TableName`注解指定数据库表名。然后创建Mapper接口,继承自`BaseMapper`。 ```java import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { private Long id; private String username; private String email; // getters and setters } ``` ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> { } ``` 步骤4:编写Service和Controller层代码 在Service层中,可以通过注入Mapper对象来使用MyBatis-Plus提供的便捷方法。例如: ```java import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class UserServiceImpl implements UserService { @Resource private UserMapper userMapper; @Override public User getUserById(Long id) { return userMapper.selectById(id); } // 其他业务逻辑方法 } ``` 在Controller层中,可以直接调用Service层的方法来处理请求。例如: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController public class UserController { @Resource private UserService userService; @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } // 其他请求处理方法 } ``` 这样,你就完成了Spring Boot与MyBatis-Plus整合。你可以根据自己的需求,使用MyBatis-Plus提供的便捷方法来进行数据库操作。 希望对你有所帮助!如果还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值