我这样写代码,比直接使用 MyBatis 效率提高了 100 倍

对一个 Java 后端程序员来说,mybatishibernatedata-jdbc 等都是我们常用的 ORM 框架。它们有时候很好用,比如简单的 CRUD,事务的支持都非常棒。但有时候用起来也非常繁琐,比如接下来我们要聊到的一个常见的开发需求,最后本文会给出一个比直接使用这些 ORM 开发效率至少会提高 100 倍的方法(绝无夸张)。

在这里插入图片描述

首先数据库有两张表

用户表(user):(简单起见,假设只有 4 个字段)

字段名 类型 含义
id bitint 用户 ID
name varchar(45) 用户名
age int 年龄
role_id int 角色 ID

角色表(role):(简单起见,假设只有 2 个字段)

字段名 类型 含义
id int 角色 ID
name varchar(45) 角色名

接下来我们要实现一个用户查询的功能

这个查询有点复杂,它的要求如下:

  • 可按用户名字段查询,要求:
    • 可精确匹配(等于某个值)
    • 可全模糊匹配(包含给定的值)
    • 可后模糊查询(以...开头)
    • 可前模糊查询(以.. 结尾)
    • 可指定以上四种匹配是否可以忽略大小写
  • 可按年龄字段查询,要求:
    • 可精确匹配(等于某个年龄)
    • 可大于匹配(大于某个值)
    • 可小于匹配(小于某个值)
    • 可区间匹配(某个区间范围)
  • 可按角色ID查询,要求:精确匹配
  • 可按用户ID查询,要求:同年龄字段
  • 可指定只输出哪些列(例如,只查询 ID用户名 列)
  • 支持分页(每次查询后,页面都要显示满足条件的用户总数)
  • 查询时可选择按 ID用户名年龄 等任意字段排序

后端接口该怎么写呢?

试想一下,对于这种要求的查询,后端接口里的代码如果用 mybatishibernatedata-jdbc 直接来写的话,100 行代码 能实现吗?

反正我是没这个信心,算了,我还是直接坦白,面对这种需求后端如何 只用一行代码搞定 吧(有兴趣的同学可以 mybatis 等写个试试,最后可以对比一下)

手把手:只一行代码实现以上需求

首先,重点人物出场啦:Bean Searcher, 它就是专门来对付这种列表检索的,无论简单的还是复杂的,统统一行代码搞定!而且它还非常轻量,Jar 包体积仅不到 100KB,无第三方依赖。

假设我们项目使用的框架是 Spring Boot(当然 Bean Searcher 对框架没有要求,但在 Spring Boot 中使用更加方便)

添加依赖

Maven :

<dependency>
    <groupId>com.ejlchina</groupId>
    <artifactId>bean-searcher-boot-starter</artifactId>
    <version>3.0.1</version>
</dependency>

Gradle :

implementation 'com.ejlchina:bean-searcher-boot-starter:3.0.1'

然后写个实体类来承载查询的结果

@SearchBean(tables="user u, role r", joinCond="u.role_id = r.id", autoMapTo="u") 
public class User {

    private Long id;		// 用户ID(u.id)
    private String name;	// 用户名(u.name)
    private int age;		// 年龄(u.age)
    private int roleId;		// 角色ID(u.role_id)
    @DbField("r.name")		// 指明这个属性来自 role 表的 name 字段
    private int role;		// 角色名(r.name)

    // Getter and Setter ...
}

接着就可以写用户查询接口了

接口路径就叫 /user/index 吧:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private MapSearcher mapSearcher;  // 注入检索器(由 bean-searcher-boot-starter 提供)

    @GetMapping("/index")
    public SearchResult<Map<String, Object>> index(HttpServletRequest request) {
    	// 这里咱们只写一行代码
        return mapSearcher.search(User.class, MapUtils.flat(request.getParameterMap()));
    }

}

上述代码中的

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
MyBatis 可以通过使用缓存来提高查询效率MyBatis 内置了一个事务性查询缓存机制,它能够方便地配置和定制。为了进一步增强和简化缓存功能,MyBatis 3 在缓存实现方面进行了多项改进。 在 MyBatis 中,存在一级缓存和二级缓存。一级缓存是默认开启的,它是基于会话的缓存,存储在会话级别,可以减少与数据库的交互次数。而二级缓存是基于命名空间的缓存,可以被多个会话共享,提高了查询的效率。可以使用 EhCache 作为 MyBatis 的二级缓存,它是一个纯 Java 的缓存框架,具有快速和精简的特点。 此外,还可以通过懒加载来提高查询效率。在 MyBatis 中,可以使用 resultMap 来实现高级映射,其中的 association 和 collection 具有延迟加载功能。通过设置 fetchType=lazy,在查询主表时,不会将关联的子集查询出来,只有在使用子集时才会进行查询。这样可以避免不必要的数据加载,提高查询效率。 总的来说,提高 MyBatis 的查询效率可以通过使用缓存机制、选择适合的缓存产品,以及使用懒加载等技术手段来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MyBatis---缓存-提高检索效率的利器](https://blog.csdn.net/weixin_54107527/article/details/127849578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis提高查询效率的方式](https://blog.csdn.net/zhaojunwei666/article/details/98207956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值