添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
低调的梨子  ·  JMeter vs LoadRunner: ...·  1 周前    · 
近视的橙子  ·  Java Review - ...·  1 周前    · 
爱喝酒的橙子  ·  Laravel PEST Test ...·  1 周前    · 
发怒的芒果  ·  android.os.BadParcelab ...·  15 小时前    · 
绅士的灭火器  ·  周虹 - 图片搜索·  4 月前    · 
高大的毛衣  ·  PHP·  5 月前    · 

先说说近期使用mybatis-plus踩的坑:

坑点一:mybatis-plus会默认不更新字段为null的字段,但是当必须将某个字段设置为null时(尤其在日期/时间上),需要在对应的实体类的属性上上添加注释: 例如表单字段 DEMO_ID

@TableField(value = "DEMO_ID", strategy = FieldStrategy.IGNORED)

坑点二:当添加了上述注释后,尤其在做某些操作(比如区块链上链-更新),后端默认只将前端传过来的数据(部分数据)——区块链信息进行数据上链-更新,在本地库更新数据时,会直接用丢失添加注释的数据,此时解决办法是重新在本地库查询一条或多条数据重新赋值再更新。

数据库进行操作 1:sql语句 2:通过Dao接口继承BaseMapper(构造器导入)

对于使用mybatis plus对数据库以每个实例为单位进行操作时:但实体类属性没有对应的数据库字段问题

//该注解在实体类上指定映射数据库表名 数据库名与实体类名一样时可以不写
@TableName("user")
//注解是指定非字段名映射 字段名不相同时使用
@TableField("name")
private String name;
//exist默认为true(对应数据库字段) false为数据库中未有与之对应的字段,仅是后端操作便利
@TableField(exist=false)
private static String remake;

Service层利用mybatis-plus操作:
在service层插入操作为insert()
控制层插入:save(Entity)/saveBatch(List)

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); 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::getId,insertDemoEntity.getId()));
if(null!=demoEntity){
   return Result(false,"插入数据的ID已存在!");

在使用mybatisPlus时,有时需要一些负责的sql条件拼接,这时,我们可以利用 QueryWrapper的and(Consumer consumer) 和 or(Consumer consumer) 来对条件进行拼接。

// 查询条件拼接, 例如:support = ? AND type_id = ? AND ( (id = ? OR id = ? OR id = ?) )
QueryWrapper<Bean> wrapper = new QueryWrapper();
        wrapper.eq("support", support);
        wrapper.eq("type_id", typeId);
        wrapper.and(wr->{
            String[] deviceIds = StringUtils.split(deviceIdArr, ",");
            Arrays.stream(deviceIds).forEach(e->{
                wr.eq("id", e).or();

备注:BaseMapper接口方法

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);