MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
條件構造器
一般都是用service層的方法,因為比mapper層的全。十分重要:Wrapper?記住查看輸出的SQL進行分析
相當于創建一個構造器對象,然后講需要查詢or更新的條件寫在里面,最后打包給mapper?or?service層的插入、更新方法
下圖是Wapper的子類,QueryWrapper和UpdateWrapper是一般的Wrapper,AbstractLambdaWrapper?是lambda語法糖的鏈式操作(兩者選擇一種使用即可)
下圖是wrapper的條件方法,就不一一介紹了,下面舉了六個就基本例子?
1、測試一?
@Test public void testWrapper1() {//參數是一個wrapper ,條件構造器,和剛才的map對比學習!//查詢name不為空,email不為空,age大于18的用戶QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.isNotNull("name").isNotNull("email").ge("age",18);List<User> userList = userMapper.selectList(wrapper);userList.forEach(System.out::println); }測試二
@Test public void testWrapper2() {//查詢name=wsk的用戶QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","wsk");//查詢一個數據selectOne,若查詢出多個會報錯//Expected one result (or null) to be returned by selectOne(), but found: *//若出現多個結果使用list或mapUser user = userMapper.selectOne(wrapper);//查詢一個數據,若出現多個結果使用list或mapSystem.out.println(user); }測試三
@Test public void testWrapper3() {//查詢age在10-20之間的用戶QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.between("age", 10, 20);//區間Integer count = userMapper.selectCount(wrapper);//輸出查詢的數量selectCountSystem.out.println(count); }測試四
@Test public void testWrapper4() {//模糊查詢QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.notLike("name","s").likeRight("email","qq");//qq% 左和右?List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);maps.forEach(System.out::println); }測試五
@Test public void testWrapper5() {//模糊查詢// SELECT id,name,age,email,version,deleted,create_time,update_time //FROM user //WHERE deleted=0 AND id IN //(select id from user where id<5)QueryWrapper<User> wrapper = new QueryWrapper<>();//id 在子查詢中查出來wrapper.inSql("id","select id from user where id<5");List<Object> objects = userMapper.selectObjs(wrapper);objects.forEach(System.out::println); }測試六
@Test public void testWrapper6() {QueryWrapper<User> wrapper = new QueryWrapper<>();//通過id進行降序排序wrapper.orderByDesc("id");List<User> userList = userMapper.selectList(wrapper);userList.forEach(System.out::println); }CRUD接口
基本配置:
0、創建數據庫
DROP TABLE IF EXISTS user;CREATE TABLE user (id BIGINT(20) NOT NULL COMMENT '主鍵ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) NULL DEFAULT NULL COMMENT '年齡',email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',version INT(10) NOT NULL DEFAULT 1 COMMIT '樂觀鎖版本號',DELETED INT(10) NOT NULL DEFAULT 0 COMMIT '邏輯刪除',CREATE_TIME DATE COMMIT '創建時間',modify_time DATE COMMIT '更新時間',PRIMARY KEY (id) );DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES (1, '工藤新一','test1@baomidou.com'), (2, '毛利蘭','est2@baomidou.com'), (3, '柯南', 28, 'test3@baomidou.com'), (4, '灰原哀', 21, 'test4@baomidou.com'), (5, '工藤有希子', 24, 'test5@baomidou.com');1、創建項目,導入依賴
<!--spring-boot--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringBootTest--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mysql 驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency>2、yaml
#設置開發環境 spring:datasource:username: rootpassword: 123456driver-class-name: com.p6spy.engine.spy.P6SpyDriverurl: jdbc:p6spy:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf#配置日志 log-impl:日志實現 mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl3、創建實體類
@Data @AllArgsConstructor @NoArgsConstructor @TableName("user") public class User {@TableId(type = IdType.AUTO)Long id;String name;int age;String email;@Version//樂觀鎖version注解private Integer version;private Integer isDelete;@TableField(fill = FieldFill.INSERT)private Date cTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date upTime; }4、寫Mapper
@Repository public interface UserMapper extends BaseMapper<User> {}5、寫Service接口和實現類
//Service接口 public interface UserService extends IService<User> { //別忘了繼承這個父類}//實現類 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { //記得繼承父類}6、之后就可以測試了
Mapper CRUD接口
顧名思義這個只有mapper層對象才有的方法
Insert
寫數據庫的時候id設置了主鍵自增的話,插入的時候不需要加入id,因為MP會自動添加并且自增的。
注:數據庫寫了id自增的話,在實體類設置主鍵生成策略是沒用的,因為數據庫設置了自增,數據庫優先級高于代碼
@Test//測試插入 public void insertTest(){User user = new User();user.setName("wsk");user.setAge(18);user.setEmail("2803708553@qq.com");Integer result = userMapper.insert(user); //會幫我們自動生成idSystem.out.println(result); //受影響的行數System.out.println(user); //通過日志發現id會自動回填(id是由雪花算法生成的,在主鍵生成策略部分有講到) }數據庫插入的id的默認值為:全局的唯—id
Update
@Test//測試更新 public void updateTest(){User user = new User();user.setId(2L);//怎么改id??//通過條件自動拼接動態Sqluser.setName("root");user.setAge(12);user.setEmail("root@qq.com");int i = userMapper.updateById(user);//updateById,但是參數是個userSystem.out.println(i); }Select
- 通過id查詢單個用戶
- 通過id查詢多個用戶
?
- 條件查詢 通過map封裝
?
Delete
基本的刪除任務:
?
@Test public void testDeleteById(){userMapper.deleteById(1359507762519068681L); } @Test public void testDeleteBatchIds(){userMapper.deleteBatchIds(Arrays.asList(1359507762519068675L,1359507762519068676L)); } @Test public void testD(){HashMap<String, Object> map = new HashMap<>();map.put("age","18");map.put("name","lol");userMapper.deleteByMap(map); }Service CRUD接口
顧名思義這是Service層才有的方法
Save
為了區分mapper層和service層的方法,所以service層的插入方法取名為save
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");//插入單條數據userService.save(user);// 插入(批量)userService.saveBatch(Arrays.asList(user)); }Remove
service層刪除方法取名為remove
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎");userService.remove(wrapper); //根據條件構造器刪除數據userService.removeById(16L); //根據id刪除數據,也可以根據實體類對象刪除數據userService.removeByMap(map); //根據map的條件刪除記錄userService.removeBatchByIds(Arrays.asList(user)); //批量刪除 }Update
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.update(wrapper); //根據條件構造器更新userService.updateById(user); //根據傳入的實體類id確定需要更新的數據,更新為傳入的實體類對象userService.updateBatchById(Arrays.asList(user)); //批量更新}Get
該方法只能查詢一條數據,所以不推薦。查詢用list方法
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.getById(12L); //根據id查詢一條數據userService.getMap(wrapper); //根據構造器查詢一條數據,返回Mapper集合}List
查詢多條數據
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.list(); //查詢全部數據userService.listMaps(); //查詢全部數據,以map形式返回userService.listByMap(map); //根據map查詢數據userService.listByIds(Arrays.asList(10L,15L)); //根據id查詢數據 }SaveOrUpdate
運行邏輯:直接更新,更新0行的話;就select,查詢出來是0行;則就插入
有傳入id的情況會優先更新,如果更新不了,則會插入新的數據
記得在實體類寫上@TableId!!!
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");UpdateWrapper<User> wrapper = new UpdateWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.saveOrUpdate(user); //傳入的對象id存在則更新,否則插入新數據userService.saveOrUpdate(user,wrapper); //根據更新條件構造器,更細數據userService.saveOrUpdateBatch(Arrays.asList(user)); //批量修改插入 }Count
統計符合條件的數據的數量
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.count();userService.count();}Chain
鏈式調用,可以不用條件構造器完成 條件設置和增刪改查。推薦!因為優雅!
Query
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);List<User> userList = userService.query().eq("name", "工藤新一").gt("age", 17).list();for(User user01: userList) {System.out.println(user);} }Update
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.update().eq("name", "工藤新一").gt("age", 17).update(); }總結
以上是生活随笔為你收集整理的MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张宇:2020版数学1000题勘误及公告
- 下一篇: 1077 互评成绩计算