Mybatis-Plus中的DQL编程控制(对数据库的操作)

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 Mybatis-Plus中的DQL编程控制(对数据库的操作),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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,查询是不会成功的,所以后台需要处理一下。
  1. 编写一个模拟查询实体类,将可能会存在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;
}

  1. 模拟页面传递的参数

		//模拟页面传递过来的查询数据
        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个:

  1. 对象中的属性名和字段名不一致的问题(非驼峰)
  2. 对象中的属性字段在表中不存在的问题
  3. 某字段不希望查询的时候被查出
  4. 表名与编码设计不统一(@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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!