先說說近期使用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);
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已存在!");
}
備注: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);