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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM