福建省建设局网站,中卫网站建设哪家好,网站备案好处,对于网站界面文章目录1. 文章引言2. 代码演示3. 分析LambdaQueryWrapper3.1 引入LambdaQueryWrapper的原因3.2 LambdaQueryWrapper和QueryWapper的区别4. 重要总结1. 文章引言
今天在公司写代码时#xff0c;发现同事使用LambdaQueryWrapper来查询数据#xff0c;而我一直习惯使用QueryW…
文章目录1. 文章引言2. 代码演示3. 分析LambdaQueryWrapper3.1 引入LambdaQueryWrapper的原因3.2 LambdaQueryWrapper和QueryWapper的区别4. 重要总结1. 文章引言
今天在公司写代码时发现同事使用LambdaQueryWrapper来查询数据而我一直习惯使用QueryWrapper。
我对此便来了兴趣决定尝试了解LambdaQueryWrapper。
2. 代码演示
为了分析LambdaQueryWrapper给出如下两段代码
通过LambdaQueryWrapper查询
Test
public void testLambdaQueryWrapper(){//初始化变量Long applicationId 62L;String type pageFrameApp;// LambdaQueryWrapper查询LambdaQueryWrapperAppConfig lambdaQueryWrapper new LambdaQueryWrapper();lambdaQueryWrapper.eq(AppConfig::getAppId, applicationId);if (isNotNull(type)) {lambdaQueryWrapper.eq(AppConfig::getConfigType, type);}long count appConfigService.count(lambdaQueryWrapper);//输出统计数量System.out.println(输出统计结果count);
}输出统计结果如下图 输出mybatis-plus打印的SQL语句如下所示
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl62c02089] will not be managed by SpringPreparing: SELECT COUNT( * ) FROM app_config WHERE (app_id ? AND type ?)Parameters: 62(Long), pageFrameApp(String)Columns: COUNT( * )Row: 1Total: 1通过QueryWrapper查询
Test
public void testQueryWrapper(){//初始化变量Long applicationId 62L;String type pageFrameApp;// LambdaQueryWrapper查询QueryWrapperAppConfig queryWrapper new QueryWrapper();queryWrapper.eq(app_id, applicationId);if (isNotNull(type)) {queryWrapper.eq(type, type);}long count appConfigService.count(queryWrapper);//输出统计数量System.out.println(输出统计结果count);
}输出结果如下图所示 输出mybatis-plus打印的SQL语句如下所示
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl31d09031] will not be managed by SpringPreparing: SELECT COUNT( * ) FROM app_config WHERE (app_id ? AND type ?)Parameters: 62(Long), pageFrameApp(String)Columns: COUNT( * )Row: 1Total: 1
3. 分析LambdaQueryWrapper
由上面两段代码的演示来看你会神奇地发现 输出结果是相同的 mybatis-plus打印的SQL语句也是相同
为什么会相同呢我们不妨去看看它们的源码。
QueryWrapper继承AbstractWrapper这个类如下图所示 LambdaQueryWrapper继承AbstractLambdaWrapper而AbstractLambdaWrapper继承是AbstractWrapper如下图所示。 你会发现不论是LambdaQueryWrapper还是QueryWrapper本质上继承的都是AbstractWrapper这个抽象类。
因而它们的执行结果相同只是查询方式不同而已。
3.1 引入LambdaQueryWrapper的原因
但是既然有了QueryWrapper为什么还要有LambdaQueryWrapper我认为有以下两点
适配jdk1.8
我们都知道现在主流jdk的版本是jdk1.8而jdk1.8引入了Lambda表达式。
MyBatis-Plus为了适配jdk1.8让路走得更宽才引入了LambdaQueryWrapper。
让代码变的更简单
我们再次去看上述QueryWrapper的代码eq方法要手动写如数据表的字段我们偶尔会写错。
同时去看上述LambdaQueryWrapper的代码eq方法是通过对象属性去映射数据表的字段。
基于以上两点我认为有必要引入LambdaQueryWrapper类。
3.2 LambdaQueryWrapper和QueryWapper的区别
QueryWrapper要手动写入数据表的字段千万不要写错数据表的字段比如上述代码中的eq方法。
LambdaQueryWrapper虽然不用引入数据表的字段而是通过对象的属性去映射但这容易出错。
【注意】这里对象的属性是驼峰格式的不然会报出unknown column xxx in where clause
比如数据表的字段是app_id而对象的属性是appid而我们又没有加上TableField(app_id)注解 (注解的value值是数据表的字段)如下代码所示
/** 应用id */
private Long appid;此时启动测试类便报出Unknown column appid in where clause问题如下图所示 若我们加上TableField(app_id)注解如下代码所示
/** 应用id */
TableField(app_id)
private Long appid;此时启动测试类便不会报错如下图所示 当然我们把appid修改为appId即便不添加TableField(app_id)注解通过LambdaQueryWrapper查询也不会出错。
4. 重要总结
我们在使用QueryWrapper时要手动写入数据表的字段注意字段不要写错不然也会报出unknown column xxx in where clause这个错误
此外我们在使用LambdaQueryWrapper时要注意对象的属性和数据表字段的映射不然极容易报出unknown column xxx in where clause这个错误。