ORM(object relational mapping)框架的作用是将程序中的对象与数据库中的关系型数据表之间建立映射关系,大大简化了开发难度。lambdaQuery作为一款优秀的ORM框架,其最大的特点就是简单易用,支持链式调用,让编程更加优雅。下面我们将从几个方面来阐述lambdaQuery的特点和优势。
一、lambdaQuery()
lambdaQuery()是lambdaQuery框架的入口方法,用于开启一个查询。lambdaQuery()方法返回一个Query对象,通过链式调用可以简单方便地构造查询条件。
List<User> list = lambdaQuery(User.class)
.eq(User::getUserName, "admin")
.ne(User::getStatus, 0)
.like(User::getRealName, "张三")
.list();
上述代码演示了利用lambdaQuery()方法进行查询的基本用法,首先指定查询的实体类User,然后通过链式调用指定查询条件,最后通过list()方法获取查询结果。
二、lambdaQuery if else
lambdaQuery支持类似Java流程控制语句的if-else条件判断,可以根据不同的条件指定不同的查询条件。
QueryWrapper<User> wrapper = lambdaQueryWrapper(User.class)
.eq(User::getUserName, "admin")
.eq(User::getStatus, 1)
.ifPresent(username, p -> p.like(User::getRealName, "%张三%"))
.ifPresent(status, p -> p.lt(User::getCreateTime, LocalDateTime.now()))
.ifPresent(StringUtils::isNotBlank, password, p -> p.like(User::getPassword, password));
List<User> list = wrapper.list();
在以上代码中,利用QueryWrapper对象的ifPresent()方法实现了if-else条件判断,当username不为空时,添加like(User::getRealName, "%张三%")条件;当status不为空时,添加lt(User::getCreateTime, LocalDateTime.now())条件;当password不为空时,添加like(User::getPassword, password)条件。
三、lambdaQueryWrapper多表查询
除了基本的单表查询之外,lambdaQuery还支持多表查询,可以根据不同的关联关系构造查询条件。
List<UserOrderVO> list = lambdaQueryWrapper(UserOrderVO.class)
.leftJoin(User.class, UserOrderVO::getUserId, User::getId)
.eq(User::getUserName, "admin")
.select(User::getId, UserOrderVO::getTotalPrice)
.groupBy(User::getId)
.list();
以上代码演示了利用lambdaQueryWrapper对象进行多表联合查询的基本用法,通过leftJoin()方法指定左连接的表和关联关系,然后通过链式调用指定查询条件和查询字段,最后通过groupBy()指定分组条件。
四、lambdaQuery if else条件
与单表查询类似,lambdaQueryWrapper对象也支持if-else条件判断,根据不同的条件指定不同的查询条件。
QueryWrapper<UserOrderVO> wrapper = lambdaQueryWrapper(UserOrderVO.class)
.eq(UserOrderVO::getStatus, 0)
.eq(UserOrderVO::getOrderType, 1)
.ifPresent(StringUtils::isNotBlank, userName, w -> w.like(User::getUserName, userName))
.ifPresent(StringUtils::isNotBlank, realName, w -> w.like(User::getRealName, realName));
List<UserOrderVO> list = wrapper.list();
在以上代码中,利用QueryWrapper对象的ifPresent()方法实现了if-else条件判断,当userName不为空时,添加like(User::getUserName, userName)条件;当realName不为空时,添加like(User::getRealName, realName)条件。
五、lambdaQueryWrapper查询指定字段
在实际开发中,有时候我们并不需要查询表中所有的字段,这时候可以利用lambdaQueryWrapper的select()方法指定查询的字段。
List<UserVO> list = lambdaQueryWrapper(User.class)
.eq(User::getUserName, "admin")
.select(User::getRealName, User::getPhone)
.listAs(UserVO.class);
在以上代码中,通过select()方法指定查询的字段,只查询了User表中的realName和phone字段,最后通过listAs()方法指定返回类型为UserVO,即只返回实体类中指定的字段。
六、lambdaQueryWrapper方法
除了上述方法外,lambdaQueryWrapper还提供了一些常用的方法,如orderBy()、likeLeft()、likeRight()等。
List<User> list = lambdaQueryWrapper(User.class)
.ne(User::getStatus, 0)
.orderByDesc(User::getCreateTime)
.likeLeft(User::getRealName, "张")
.list();
在以上代码中,通过orderByDesc()方法指定查询结果按createTime降序排列,通过likeLeft()方法指定查询realName以“张”开头的记录。
七、lambdaQuery trim
在SQL语句中,有时候会出现多余的空格和换行符,这样会导致SQL语句的可读性下降,影响代码的维护性。lambdaQuery提供了trim()方法,可去掉SQL语句中的前缀、后缀和多余的空格和换行符。
String sql = lambdaQueryWrapper(User.class)
.select(User::getId, User::getUserName)
.eq(User::getStatus, 1)
.eq(User::getGender, 1)
.orderByAsc(User::getCreateTime)
.trim()
.getSql();
在以上代码中,利用lambdaQueryWrapper对象的getSql()方法获取查询的SQL语句,然后通过trim()方法去除SQL语句中的多余空格和换行符。
八、lambdaQueryWrapper查询空字符
在查询时,可能需要查询某个字段为空的记录,lambdaQueryWrapper提供了isNull()和isNotNull()方法,用于查询空值和非空值。
List<User> list = lambdaQueryWrapper(User.class)
.isNull(User::getRealName)
.list();
在以上代码中,通过isNull()方法查询realName字段为空的记录。
总结
本文从lambdaQuery()、lambdaquery if else、lambdaquerywrapper多表查询、lambdaquery if else条件、lambdaquerywrapper查询指定字段、lambdaquerywrapper方法、lambdaquery trim、lambdaQueryWrapper查询空字符等多个方面详细阐述了lambdaQuery框架的特点和优势,其简单易用、支持链式调用等特点让开发更加高效、优雅。感兴趣的读者可以去GitHub上查看其源码,学习更多高级用法。