首先在这里写下官方文档的链接位置,官方文档说的很详细。如果还想知道在项目中的具体用法请往下看。
一、条件构造器关系介绍
介绍 :
- 上图绿色框为抽象类abstract
- 蓝色框为正常class类,可new对象
- 黄色箭头指向为父子类关系,箭头指向为父类
wapper介绍 :
- Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
- AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
- LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
- LambdaUpdateWrapper : Lambda 更新封装Wrapper
- QueryWrapper : Entity 对象封装操作类,不是用lambda语法
- UpdateWrapper : Update 条件封装,用于Entity对象更新操作
二、项目实例
在这里我以QueryWrapper和UpdateWrapper为例,进行测试讲解。我会在上篇博客原有的基础上进行测试,如果不喜欢搭建项目的可直接下载我上个项目,上个项目的博客对应上个项目的讲解
上图表格为条件构造器使用中的各个方法格式和说明,如有不懂可参考官方文档内容
代码:
1 package com.lqf.crud; 2 3 import com.baomidou.mybatisplus.core.conditions.Wrapper; 4 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 7 import com.baomidou.mybatisplus.core.metadata.IPage; 8 import com.baomidou.mybatisplus.core.toolkit.Constants; 9 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 10 import com.lqf.crud.bean.crm.User; 11 import com.lqf.crud.dao.crm.UserMapper; 12 import com.sun.org.apache.xerces.internal.util.EntityResolverWrapper; 13 import org.apache.ibatis.annotations.Param; 14 import org.apache.ibatis.session.RowBounds; 15 import org.junit.Test; 16 import org.junit.runner.RunWith; 17 import org.springframework.beans.factory.annotation.Autowired; 18 import org.springframework.boot.test.context.SpringBootTest; 19 import org.springframework.test.context.junit4.SpringRunner; 20 import org.springframework.web.jsf.el.WebApplicationContextFacesELResolver; 21 22 import javax.naming.Name; 23 import java.util.ArrayList; 24 import java.util.HashMap; 25 import java.util.List; 26 import java.util.Map; 27 28 @RunWith(SpringRunner.class) 29 @SpringBootTest 30 public class QueryWrapperTests { 31 32 @Autowired 33 private UserMapper mapper; 34 35 /** 36 * <p> 37 * 根据根据 entity 条件,删除记录,QueryWrapper实体对象封装操作类(可以为 null) 38 * 下方获取到queryWrapper后删除的查询条件为name字段为null的and年龄大于等于12的and email字段不为null的 39 * 同理写法条件添加的方式就不做过多介绍了。 40 * </p> 41 */ 42 @Test 43 public void delete() { 44 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 45 queryWrapper 46 .isNull("name") 47 .ge("age", 12) 48 .isNotNull("email"); 49 int delete = mapper.delete(queryWrapper); 50 System.out.println("delete return count = " + delete); 51 } 52 53 54 /** 55 * <p> 56 * 根据 entity 条件,查询一条记录, 57 * 这里和上方删除构造条件一样,只是seletOne返回的是一条实体记录,当出现多条时会报错 58 * </p> 59 */ 60 @Test 61 public void selectOne() { 62 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 63 queryWrapper.eq("name", "lqf"); 64 65 User user = mapper.selectOne(queryWrapper); 66 System.out.println(user); 67 } 68 69 70 /** 71 * <p> 72 * 根据 Wrapper 条件,查询总记录数 73 * </p> 74 * 75 * @param queryWrapper 实体对象 76 */ 77 @Test 78 public void selectCount() { 79 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 80 queryWrapper.eq("name", "lqf"); 81 82 Integer count = mapper.selectCount(queryWrapper); 83 System.out.println(count); 84 } 85 86 87 /** 88 * <p> 89 * 根据 entity 条件,查询全部记录 90 * </p> 91 * 92 * @param queryWrapper 实体对象封装操作类(可以为 null)为null查询全部 93 */ 94 @Test 95 public void selectList() { 96 List<User> list = mapper.selectList(null); 97 98 System.out.println(list); 99 } 100 101 /** 102 * <p> 103 * 根据 Wrapper 条件,查询全部记录 104 * </p> 105 * 106 * @param queryWrapper 实体对象封装操作类(可以为 null) 107 */ 108 @Test 109 public void selectMaps() { 110 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 111 queryWrapper.isNotNull("name"); 112 List<Map<String, Object>> maps = mapper.selectMaps(queryWrapper); 113 for (Map<String, Object> map : maps) { 114 System.out.println(map); 115 } 116 } 117 118 /** 119 * 打印结果 120 * {name=lqf, id=1046282328366391406, age=12, email=lqf@163.com, status=false} 121 * {name=lqf, id=1046282328366391407, age=12, email=lqf@163.com, status=false} 122 * {name=lqf, id=1046282328366391408, age=12, email=lqf@163.com, status=false} 123 * {name=lqf, id=1046282328366391409, age=12, email=lqf@163.com, status=false} 124 * {name=lqf, id=1046282328366391410, age=12, email=lqf@163.com, status=false} 125 * {name=lqf, id=1046282328366391411, age=12, email=lqf@163.com, status=false} 126 * {name=lqf, id=1046282328366391412, age=12, email=lqf@163.com, status=false} 127 * {name=lqf, id=1046282328366391413, age=12, email=lqf@163.com, status=false} 128 * {name=lqf, id=1046282328366391414, age=12, email=lqf@163.com, status=false} 129 * {name=lqf, id=1046282328366391415, age=12, email=lqf@163.com, status=false} 130 * {name=lqf, id=1046282328366391416, age=12, email=lqf@163.com, status=false} 131 * {name=lqf, id=1046282328366391417, age=12, email=lqf@163.com, status=false} 132 * {name=lqf, id=1046282328366391418, age=12, email=lqf@163.com, status=false} 133 * json类型的键值对模式 134 */ 135 136 /** 137 * <p> 138 * 根据 entity 条件,查询全部记录(并翻页) 139 * </p> 140 * 141 * @param page 分页查询条件(可以为 RowBounds.DEFAULT) 142 * @param queryWrapper 实体对象封装操作类(可以为 null) 143 */ 144 @Test 145 public void selectPage() { 146 Page<User> page = new Page<>(1, 5); 147 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 148 149 IPage<User> userIPage = mapper.selectPage(page, queryWrapper); 150 System.out.println(userIPage); 151 } 152 153 /** 154 * 打印结果 155 * ==> Preparing: SELECT COUNT(1) FROM user 156 * ==> Parameters: 157 * <== Columns: COUNT(1) 158 * <== Row: 100 159 * ==> Preparing: SELECT id,name,age,email,status FROM user LIMIT 0,5 160 * ==> Parameters: 161 * <== Columns: id, name, age, email, status 162 * <== Row: 1046282328366391319, lqf, 12, lqf@163.com, 0 163 * <== Row: 1046282328366391320, lqf, 12, lqf@163.com, 0 164 * <== Row: 1046282328366391321, lqf, 12, lqf@163.com, 0 165 * <== Row: 1046282328366391322, lqf, 12, lqf@163.com, 0 166 * <== Row: 1046282328366391323, lqf, 12, lqf@163.com, 0 167 * <== Total: 5 168 * 169 * 170 * 这里需要在项目中加入分页插件 171 * @Bean 172 * public PaginationInterceptor paginationInterceptor() { 173 * return new PaginationInterceptor(); 174 * } 175 */ 176 177 178 /** 179 * <p> 180 * 根据 Wrapper 条件,查询全部记录(并翻页) 181 * </p> 182 * 183 * @param page 分页查询条件 184 * @param queryWrapper 实体对象封装操作类 185 */ 186 @Test 187 public void selectMapsPage() { 188 Page<User> page = new Page<>(1, 5); 189 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 190 191 IPage<Map<String, Object>> mapIPage = mapper.selectMapsPage(page, queryWrapper); 192 System.out.println(mapIPage); 193 } 194 195 /** 196 * 和上个分页同理只是返回类型不同 197 */ 198 199 200 /** 201 * <p> 202 * 根据 whereEntity 条件,更新记录 203 * </p> 204 * 205 * @param entity 实体对象 (set 条件值,不能为 null) 206 * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) 207 */ 208 @Test 209 public void update() { 210 211 //修改值 212 User user = new User(); 213 user.setStatus(true); 214 user.setName("zhangsan"); 215 216 //修改条件s 217 UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); 218 userUpdateWrapper.eq("name", "lqf"); 219 220 int update = mapper.update(user, userUpdateWrapper); 221 222 System.out.println(update); 223 } 224 225 /** 226 * 打印结果 227 * ==> Preparing: UPDATE user SET name=?, status=? WHERE name = ? 228 * ==> Parameters: zhangsan(String), true(Boolean), lqf(String) 229 * <== Updates: 100 230 * Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@56a4f272] 231 * 100 232 * 2018-10-02 15:08:03.928 INFO 7972 --- [ Thread-2] o.s.w.c.s.GenericWebApplicationContext : Closing org.springframework.web.context.support.GenericWebApplicationContext@37313c65: startup date [Tue Oct 02 15:08:00 CST 2018]; root of context hierarchy 233 * 2018-10-02 15:08:03.937 INFO 7972 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 234 * 2018-10-02 15:08:04.053 INFO 7972 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 235 * 236 * Process finished with exit code 0 237 */ 238 239 }条件构造器
上方代码对通过构造器条件进行的查询、删除、修改进行是演示,构造器方法没有做过多演示,但是所有的构造器方法同理使用,如果还有不会用的点开看官方文档查看并按照上方例子使用即可。