DQL编程控制
1、条件查询方式
1.1、常见的条件查询
- MyBatisPlus将书写复杂的SQL查询条件进行了封装–Wrapper,使用编程的形式完成查询条件的组合
package com.mannor.mybatis_plus_demo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mannor.mybatis_plus_demo.Dao.UserDao;
import com.mannor.mybatis_plus_demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class MybatisPlusDemoApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetAll() {
//方法一:按条件查询
QueryWrapper qw=new QueryWrapper();
qw.lt("sge",18); //lt:less than(少于18的age字段)
List<User> users = this.userDao.selectList(qw);
System.out.println(users);
//方法二:lambda的格式按条件查询
QueryWrapper<User> qw=new QueryWrapper<User>();
qw.lambda().lt(User::getAge,18);
List<User> users = this.userDao.selectList(qw);
System.out.println(users);
}
//方法三:lambda的格式按条件查询(比法二更精简)
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
lqw.lt(User::getAge,18);//小于
lqw.lt(User::getAge,10);//大于
lqw.lt(User::getAge,18).or().gt(User::getAge,18); //或者
lqw.lt(User::getAge,18).gt(User::getAge,18); //并且
List<User> users = this.userDao.selectList(lqw);
System.out.println(users);
}
按照lambda格式就不会出现字段写错的情况,LambdaQueryWrapper写法要更加精简一些。
1.2、null值判定
- 由于前端在查询时,某些字段的上下限返回给后端的数值为null,查询是不会成功的,所以后台需要处理一下。
- 编写一个模拟查询实体类,将可能会存在null值的(日期、年龄、价格等)放在里面。
package com.mannor.mybatis_plus_demo.query;
import com.mannor.mybatis_plus_demo.pojo.User;
import lombok.Data;
@Data
public class UserQuery extends User {
private Integer age2;
}
- 模拟页面传递的参数
//模拟页面传递过来的查询数据
UserQuery uq = new UserQuery();
uq.setAge(10); //页面传递的参数 可能为null
uq.setAge2(30); //固有设定的参数
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
//先判断第一个参数是否为true,如果为true,连接当前条件
lqw.lt(null!=uq.getAge2(),User::getAge,uq.getAge2());
lqw.gt(null!=uq.getAge(),User::getAge,uq.getAge());//可以链式编程
List<User> users = this.userDao.selectList(lqw);
System.out.println(users);
}
2、查询投影
2.1、查询模型类中的属性–LambdaQueryWrapper
@Test
void testGetAll() {
//查询投影
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.select(User::getId, User::getName, User::getAge);//将需要显示的字段放在里面
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
2.2、查询模型类中的属性–QueryWrapper
@Test
void testGetAll() {
//查询投影
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("id", "name", "age", "tel"); //将需要显示的字段放在里面
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
2.3、特殊查询–查询结果在实体类User中未定义的属性
@Test
void testGetAll() {
//查询投影
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count,sex"); //求总数count *
lqw.groupBy("sex"); //根据性别分组
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
}
有写函数在Mp中不支持,那就只有使用原生mybatis的写法来操作Dao。
3、查询条件设定
3.1、等匹配”eq”
@Test
void testGetAll() {
//查询投影
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();//等同
lqw.eq(User::getName,"mannor ").eq(User::getPassword," mannor ");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
3.2、范围查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//范围查询Lt le gt ge eq between
lqw.between(User::getAge, 10, 30);
List<User> userList = userDao.seLectList(lqw);
System.out.printLn(userList);
3.3、模糊匹配(非全文检索)
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//模糊匹配Like , left和right表示 % 添加的位置
lqw.likeLeft(User::getName, "M");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
更多查询条件设置参看条件构造器:https://mybatis.plus/guide/wrapper.html#abstractwrapper
4、字段映射与表名映射–@TableField注解
在MP中通过@TableField注解可以指定字段的一些属性,常常解决的问题有2个:
- 对象中的属性名和字段名不一致的问题(非驼峰)
- 对象中的属性字段在表中不存在的问题
- 某字段不希望查询的时候被查出
- 表名与编码设计不统一(
@tableName
)
- 相关属性:
- value:设置数据库表字段名称
- exist:设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用
- select:设置属性是否参与查询,此属性与select()映射配置不冲突
使用:
package com.mannor.simple.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
@TableId(type = IdType.AUTO) //指定id类型为自增长
private Long id;
private String userName;
@TableField(select = false)//不希望password字段被查出来
private String password;
private String name;
private Integer age;
@TableField(value = "email")//解决的啥字段名不一致的问题
private String mail;
@TableField(exist = false)
private Integer online;//该字段在数据库表中不存在
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/150348.html