文章目录
- 1、数据库 Schema 脚本如下:
- 2、数据库 Data 脚本:
- 3. 实战
现有一张 User 表,其表结构如下:
id | name | age | |
---|---|---|---|
1 | Jone | 18 | test1@gblfy.com |
2 | Jack | 20 | test2@gblfy.com |
3 | Sandy | 28 | test3@gblfy.com |
4 | Jone | 21 | test4@gblfy.com |
5 | Billie | 24 | test5@gblfy.com |
1、数据库 Schema 脚本如下:
DROP TABLE IF EXISTS user;CREATE TABLE user
(id BIGINT(20) NOT NULL COMMENT '主键ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) NULL DEFAULT NULL COMMENT '年龄',email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',create_time DATETIME DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (id)
);
2、数据库 Data 脚本:
DELETE FROM user;INSERT INTO user (id, name, age, email, create_time) VALUES
(1, 'Jone', 18, 'test1@gblfy.com','2019-01-11 14:20:20'),
(2, 'Jack', 20, 'test2@gblfy.com','2019-02-05 11:12:22'),
(3, 'Tom', 28, 'test3@gblfy.com','2019-02-14 08:31:16'),
(4, 'Sandy', 21, 'test4@gblfy.com','2019-01-14 09:15:15'),
(5, 'Billie', 24, 'test5@gblfy.com','2019-01-14 09:48:16');
3. 实战
package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.gblfy.springboot.mybatisplus.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@Slf4j
public class UserSelectTest {@Autowiredprivate UserMapper userMapper;@Testpublic void selectList() {//1.测试是否联通数据库 查询所有List<User> userList = userMapper.selectList(null);//2.断言 查询的数据是否是5条Assert.assertEquals(5, userList.size());//3.循环打印数据到控制台userList.forEach(System.out::println);}@Testpublic void insert() {User user = new User().builder().name("gblfy").age(2).email("gblfy@qq.com").build();int rows = userMapper.insert(user);log.info("影响数据库的条数: {}", rows);}/*** 通过主键id查询用户信息*/@Testpublic void selectUserById() {User user = userMapper.selectById(1238735228017610754l);System.out.println("通过主键id查询用户信息:" + user);}/*sql形式: SELECT id,name,age,email FROM user WHERE id=?*//*** 通过多个主键id查询多个用户信息*/@Testpublic void selectBatchIds() {List<Long> ids = Arrays.asList(1238735228017610754l, 1238735794525503489l);List<User> userList = userMapper.selectBatchIds(ids);userList.forEach(System.out::println);}/*sql形式: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )*//*** 通过map查询一个用户信息*/@Testpublic void selectByMap() {Map<String, Object> map = new HashMap<>();map.put("name", "Tom");map.put("age", 28);List<User> userList = userMapper.selectByMap(map);userList.forEach(System.out::println);}/*sql形式: SELECT id,name,age,email FROM user WHERE name = ? AND age = ?*//*** 通过map查询多个用户信息*/@Testpublic void selectByMap2() {Map<String, Object> map = new HashMap<>();map.put("age", 2);List<User> userList = userMapper.selectByMap(map);userList.forEach(System.out::println);}/*sql形式:SELECT id,name,age,email FROM user WHERE age = ?*/// ---------------------------------------进阶------------------------------------/*** 1. 名字包含雨并且年龄小于40* sql:name like '%雨%' and age < 40* like '%值%'* it <* le =<* gt >* ge >=*/@Testpublic void selectByWrapper() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "雨").lt("age", 40);List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式:SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ?*//*** 2. 名字包含雨并且年龄大于等于20且小于等于40并且邮箱不为空* sql:name like '%雨%' and age between 20 and 40 and email is not null*/@Testpublic void selectByWrapper2() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "雨").between("age", 20, 28).isNotNull("email");List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL*//*** 3. 名字为郭姓或者年龄大于等于25,按照年龄降序排列,年龄相同的按照id升序排列* sql:name like '郭%' or age >= 25 order by age desc,id asc*/@Testpublic void selectByWrapper3() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name", "郭").or().ge("age", 25).orderByDesc("age").orderByAsc("id");List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式: SELECT id,name,age,email FROM user WHERE (name LIKE ? OR age >= ?) ORDER BY age DESC,id ASC*//*** 7. (年龄小于40或者邮箱不为空)并且名字为郭姓* sql:(age < 40 or email id not null) and name like '郭%'*/@Testpublic void selectByWrapper7() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.nested(wq -> wq.lt("age", 40).or().isNotNull("email")).likeRight("name", "郭");List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式: SELECT id,name,age,email FROM user WHERE ((age < ? OR email IS NOT NULL) AND name LIKE ?)sql执行原则:1. 正常sql中,先执行and后执行or2. sql中存在括号(),先执行括号()里面的sql再执行,括号()外边的sql场景1:SELECT id,name,age,email FROM user WHERE age < ? OR email IS NOT NULL AND name LIKE ?)场景2:SELECT id,name,age,email FROM user WHERE ((age < ? OR email IS NOT NULL) AND name LIKE ?)SELECT id,name,age,email FROM user WHERE (age < ? OR email IS NOT NULL) AND name LIKE ?*//*** 8. 年龄为30、31、34、35* age in (30、31、34、35 )*/@Testpublic void selectByWrapper8() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.in("age", Arrays.asList(18, 20, 22, 28));List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式: SELECT id,name,age,email FROM user WHERE (age IN (?,?,?,?))*/// -------------------------------------------Select语句中不列出全部字段---------------------------------------------------/*** 1. 名字包含雨并且年齡小于30* sql:name like '%雨%' and age < 30*/@Testpublic void selectByWrapperSupper() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "雨").lt("age", 30);List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式:SELECT id,name,age,email FROM user WHERE (name LIKE ? AND age < ?)这种情况,你查询什么列,如果有值就会查询出来,没查询的列的值默认为null*//*** 用like的Condition* <p>* 当点击查询按钮时,查询搜索框中默认为null,也支持传入条件* 当传入的条件不为null或者不为空""时,会拼接在where 的后边当做条件** @param name* @param email*/private void condition(String name, String email) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like(StringUtils.isNotEmpty(name), "name", name).like(StringUtils.isNotEmpty(email), "email", email);List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}/*sql形式:SELECT id,name,age,email FROM user WHERE (name LIKE ?)*//*** 测试Condition*/@Testpublic void testCondition() {String name = "郭";String email = "";condition(name, email);}// ---------------------------------建议使用LambdaQueryWrapper,防误写-------------------------------------/*** 这样写的好处防误写* 查询用户名字中包含雨并且年龄小于40*/@Testpublic void selectLambda() {LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();lambdaQuery.like(User::getName, "雨").lt(User::getAge, 40);List<Object> userList = userMapper.selectObjs(lambdaQuery);userList.forEach(System.out::println);}/*** sql形式:* SELECT id,name,age,email FROM user WHERE (name LIKE ? AND age < ?)*//*** 5. 名字为郭姓并且(年龄小于40或者邮箱不为空)* sql:name like '郭%' and (age < 40 or email is not null)* 只返回第一个字段的值 id*/@Testpublic void selectLambda2() {LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();lambdaQuery.likeRight(User::getName, "郭").lt(User::getAge, 40).isNotNull(User::getEmail);List<Object> userList = userMapper.selectObjs(lambdaQuery);userList.forEach(System.out::println);}/*** sql形式:* SELECT id,name,age,email FROM user WHERE (name LIKE ? AND age < ? AND email IS NOT NULL)*/@Testpublic void selectLambda3() {List<User> userList = new LambdaQueryChainWrapper<User>(userMapper).like(User::getName, "雨").ge(User::getAge, 20).list();userList.forEach(System.out::println);}/*** sql形式:* SELECT id,name,age,email FROM user WHERE (name LIKE ? AND age < ? AND email IS NOT NULL)*/// --------------------------------自定义sql------------------------------/*** 自定义sql*/@Testpublic void selectMy() {LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();lambdaQuery.likeRight(User::getName, "郭").and(lqw -> lqw.lt(User::getAge, 40).or().isNotNull(User::getEmail));//调用自定义sqlList<User> userList = userMapper.selectAll(lambdaQuery);userList.forEach(System.out::println);}
// select * from user WHERE (name LIKE ? AND (age < ? OR email IS NOT NULL))}