MyBatisPlus对sql多条件查询
先说说近期使⽤mybatis-plus踩的坑:
坑点⼀:mybatis-plus会默认不更新字段为null的字段,但是当必须将某个字段设置为null时(尤其在⽇期/时间上),需要在对应的实体类的属性上上添加注释:例如表单字段 DEMO_ID
@TableField(value = "DEMO_ID", strategy = FieldStrategy.IGNORED)
坑点⼆:当添加了上述注释后,尤其在做某些操作(⽐如区块链上链-更新),后端默认只将前端传过来的数据(部分数据)——区块链信息进⾏数据上链-更新,在本地库更新数据时,会直接⽤丢失添加注释的数据,此时解决办法是重新在本地库查询⼀条或多条数据重新赋值再更新。
例:
数据库进⾏操作 1:sql语句 2:通过Dao接⼝继承BaseMapper<Xxx>(构造器导⼊)
对于使⽤mybatis plus对数据库以每个实例为单位进⾏操作时:但实体类属性没有对应的数据库字段问题
@TableName("user") //该注解在实体类上指定映射数据库表名数据库名与实体类名⼀样时可以不写
@TableField("name") //注解是指定⾮字段名映射字段名不相同时使⽤
private String name;
@TableField(exist=false) //exist默认为true(对应数据库字段) false为数据库中未有与之对应的字段,仅是后端操作便利
private static String remake;
Service层利⽤mybatis-plus操作:在service层插⼊操作为insert() 控制层插⼊:save(Entity)/saveBatch(List<Entity>)
新增:
User user = new User();
user.setId(null)
.setName("张三")
.setAge(23)
.setSex("男");
int rows = userMapper.insert(user);
if(rows >0) {
System.out.println("⽤户⼊库成功!");
}
删除:
/**
* 删除数据
* 1. 删除Id=53 54
*/
@SuppressWarnings("rawtypes")
@Test
public void deleteUsers() {
//1.根据主键删除数据
//userMapper.deleteById(53);
//userMapper.deleteById(54);
Integer[] ids = {53,54};
//2.批量删除
List list = Arrays.asList(ids);
userMapper.deleteBatchIds(list);
}
修改:
/
**
* 修改操作要求将55号数据改为 name=A班 age=10 sex="男"
*/
@Test
public void updateUser() {
User user = new User();
user.setId(55)
.setName("A班")
.setAge(10)
.setSex("男");
userMapper.updateById(user);
}
/**
* 修改name为null的元素,name=张三age=18 sex="⼥"
* entity: 要修改后的数据
* updateWrapper: 修改条件构造器
*/
@Test
public void updateUser2() {
User user = new User();
user.setName("张三").setAge(18).setSex("⼥");
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.isNull("name");
userMapper.update(user, updateWrapper);
}
对于修改的总结:
如果已经主键,⼀般使⽤updateById.
如果获取的是其他属性字段,则使⽤update
Demo: //User对象(40个属性) 修改id=10号元素.
User user = userMapper.selectById(10);
//修改bir的⽣⽇改为今天 date
user.setBir(new Date);
userMapper.updateById(user);
//修改了除id之外的所有字段.
User userTemp = new User();
userTemp.setBir(new Date());
userTemp.setId(10);
userMapper.updateById(userTemp);
注意:只修改1个字段的原则是:
如果利⽤Mybatisplus的操作过于繁琐时.则使⽤sql语句⽅式操作更快
查询:
/**
* 1.根据主键Id查询
*/
@Test
public void findById() {
User user = userMapper.selectById(12);
System.out.println(user);
}
/**
* 2.按照name属性查询 A班
* QueryWrapper条件构造器:
* ⽬的:利⽤对象中不为null的属性充当where条件构建
*/
@Test
public void findByName() {
User user = new User();
user.setName("A班");
QueryWrapper<User> queryWrapper =
new QueryWrapper<User>(user);
List<User> userList =
userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* 多条件查询
* name=1907班 and age < 20
* = (等于⽤“eq”)
* > (⼤于⽤“gt”)
* <(⼩于⽤" lt")
* >=(⼤于等于⽤"ge")
* <=(⼩于等于⽤"le")
*/
@Test
public void findByMore() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(); queryWrapper.eq("name", "A班")
.lt("age", 20);
List<User> userList =
userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* name=A班 or age < 20
*/
@Test
public void findByOr() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(); queryWrapper.eq("name", "A班")
.or()
.lt("age", 20);
List<User> userList =
userMapper.selectList(queryWrapper);
System.out.println(userList);
}
//查询年龄 age⼤于18 age<45 sex="男"
@Test
public void findByBet() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(); queryWrapper.eq("sex","男")
.between("age", 18, 45);
List<User> userList =
userMapper.selectList(queryWrapper);批量更新sql语句
System.out.println(userList);
}
/**
* 模糊查询名称中包含乔字
*/
@Test
public void findByLike() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(); queryWrapper.like("name", "%乔%");
List<User> userList =
userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* 查询名称为null的数据
*/
@Test
public void findByNull() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(); queryWrapper.isNull("name");
List<User> userList =
userMapper.selectList(queryWrapper);
System.out.println(userList);
}
mybatis-plus与mybatis相⽐最核⼼点是-------------lambda
举例说明:校验新增的数据的id是否已存在
//假定insertDemoEntity 为前端传递过来的数据
DemoEntity insertDemoEntity = new DemoEntity();
DemoEntity demoEntity = demoMapper.selectOne(Wrappers.<DemoEntity>query().lambda()
.eq(DemoEntity::Id()));
if(null!=demoEntity){
return Result(false,"插⼊数据的ID已存在!");
}
备注:BaseMapper<T>接⼝⽅法
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论