MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
條件構(gòu)造器
一般都是用service層的方法,因?yàn)楸萴apper層的全。十分重要:Wrapper?記住查看輸出的SQL進(jìn)行分析
相當(dāng)于創(chuàng)建一個(gè)構(gòu)造器對(duì)象,然后講需要查詢or更新的條件寫在里面,最后打包給mapper?or?service層的插入、更新方法
下圖是Wapper的子類,QueryWrapper和UpdateWrapper是一般的Wrapper,AbstractLambdaWrapper?是lambda語(yǔ)法糖的鏈?zhǔn)讲僮?#xff08;兩者選擇一種使用即可)
下圖是wrapper的條件方法,就不一一介紹了,下面舉了六個(gè)就基本例子?
1、測(cè)試一?
@Test public void testWrapper1() {//參數(shù)是一個(gè)wrapper ,條件構(gòu)造器,和剛才的map對(duì)比學(xué)習(xí)!//查詢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); }測(cè)試二
@Test public void testWrapper2() {//查詢name=wsk的用戶QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","wsk");//查詢一個(gè)數(shù)據(jù)selectOne,若查詢出多個(gè)會(huì)報(bào)錯(cuò)//Expected one result (or null) to be returned by selectOne(), but found: *//若出現(xiàn)多個(gè)結(jié)果使用list或mapUser user = userMapper.selectOne(wrapper);//查詢一個(gè)數(shù)據(jù),若出現(xiàn)多個(gè)結(jié)果使用list或mapSystem.out.println(user); }測(cè)試三
@Test public void testWrapper3() {//查詢age在10-20之間的用戶QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.between("age", 10, 20);//區(qū)間Integer count = userMapper.selectCount(wrapper);//輸出查詢的數(shù)量selectCountSystem.out.println(count); }測(cè)試四
@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); }測(cè)試五
@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); }測(cè)試六
@Test public void testWrapper6() {QueryWrapper<User> wrapper = new QueryWrapper<>();//通過id進(jìn)行降序排序wrapper.orderByDesc("id");List<User> userList = userMapper.selectList(wrapper);userList.forEach(System.out::println); }CRUD接口
基本配置:
0、創(chuàng)建數(shù)據(jù)庫(kù)
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 '樂觀鎖版本號(hào)',DELETED INT(10) NOT NULL DEFAULT 0 COMMIT '邏輯刪除',CREATE_TIME DATE COMMIT '創(chuàng)建時(shí)間',modify_time DATE COMMIT '更新時(shí)間',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、創(chuàng)建項(xiàng)目,導(dǎo)入依賴
<!--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 驅(qū)動(dòng)--><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
#設(shè)置開發(fā)環(huán)境 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:日志實(shí)現(xiàn) mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl3、創(chuàng)建實(shí)體類
@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接口和實(shí)現(xiàn)類
//Service接口 public interface UserService extends IService<User> { //別忘了繼承這個(gè)父類}//實(shí)現(xiàn)類 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { //記得繼承父類}6、之后就可以測(cè)試了
Mapper CRUD接口
顧名思義這個(gè)只有mapper層對(duì)象才有的方法
Insert
寫數(shù)據(jù)庫(kù)的時(shí)候id設(shè)置了主鍵自增的話,插入的時(shí)候不需要加入id,因?yàn)镸P會(huì)自動(dòng)添加并且自增的。
注:數(shù)據(jù)庫(kù)寫了id自增的話,在實(shí)體類設(shè)置主鍵生成策略是沒用的,因?yàn)閿?shù)據(jù)庫(kù)設(shè)置了自增,數(shù)據(jù)庫(kù)優(yōu)先級(jí)高于代碼
@Test//測(cè)試插入 public void insertTest(){User user = new User();user.setName("wsk");user.setAge(18);user.setEmail("2803708553@qq.com");Integer result = userMapper.insert(user); //會(huì)幫我們自動(dòng)生成idSystem.out.println(result); //受影響的行數(shù)System.out.println(user); //通過日志發(fā)現(xiàn)id會(huì)自動(dòng)回填(id是由雪花算法生成的,在主鍵生成策略部分有講到) }數(shù)據(jù)庫(kù)插入的id的默認(rèn)值為:全局的唯—id
Update
@Test//測(cè)試更新 public void updateTest(){User user = new User();user.setId(2L);//怎么改id??//通過條件自動(dòng)拼接動(dòng)態(tài)Sqluser.setName("root");user.setAge(12);user.setEmail("root@qq.com");int i = userMapper.updateById(user);//updateById,但是參數(shù)是個(gè)userSystem.out.println(i); }Select
- 通過id查詢單個(gè)用戶
- 通過id查詢多個(gè)用戶
?
- 條件查詢 通過map封裝
?
Delete
基本的刪除任務(wù):
?
@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
為了區(qū)分mapper層和service層的方法,所以service層的插入方法取名為save
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");//插入單條數(shù)據(jù)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("毛利偵探事務(wù)所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎");userService.remove(wrapper); //根據(jù)條件構(gòu)造器刪除數(shù)據(jù)userService.removeById(16L); //根據(jù)id刪除數(shù)據(jù),也可以根據(jù)實(shí)體類對(duì)象刪除數(shù)據(jù)userService.removeByMap(map); //根據(jù)map的條件刪除記錄userService.removeBatchByIds(Arrays.asList(user)); //批量刪除 }Update
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.update(wrapper); //根據(jù)條件構(gòu)造器更新userService.updateById(user); //根據(jù)傳入的實(shí)體類id確定需要更新的數(shù)據(jù),更新為傳入的實(shí)體類對(duì)象userService.updateBatchById(Arrays.asList(user)); //批量更新}Get
該方法只能查詢一條數(shù)據(jù),所以不推薦。查詢用list方法
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.getById(12L); //根據(jù)id查詢一條數(shù)據(jù)userService.getMap(wrapper); //根據(jù)構(gòu)造器查詢一條數(shù)據(jù),返回Mapper集合}List
查詢多條數(shù)據(jù)
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.list(); //查詢?nèi)繑?shù)據(jù)userService.listMaps(); //查詢?nèi)繑?shù)據(jù),以map形式返回userService.listByMap(map); //根據(jù)map查詢數(shù)據(jù)userService.listByIds(Arrays.asList(10L,15L)); //根據(jù)id查詢數(shù)據(jù) }SaveOrUpdate
運(yùn)行邏輯:直接更新,更新0行的話;就select,查詢出來是0行;則就插入
有傳入id的情況會(huì)優(yōu)先更新,如果更新不了,則會(huì)插入新的數(shù)據(jù)
記得在實(shí)體類寫上@TableId!!!
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");HashMap<String,Object> map = new HashMap<>();map.put("name","Conan");UpdateWrapper<User> wrapper = new UpdateWrapper<>();wrapper.eq("name","毛利小五郎").ge("age",18);userService.saveOrUpdate(user); //傳入的對(duì)象id存在則更新,否則插入新數(shù)據(jù)userService.saveOrUpdate(user,wrapper); //根據(jù)更新條件構(gòu)造器,更細(xì)數(shù)據(jù)userService.saveOrUpdateBatch(Arrays.asList(user)); //批量修改插入 }Count
統(tǒng)計(jì)符合條件的數(shù)據(jù)的數(shù)量
@Testvoid test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");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
鏈?zhǔn)秸{(diào)用,可以不用條件構(gòu)造器完成 條件設(shè)置和增刪改查。推薦!因?yàn)閮?yōu)雅!
Query
@Test void test(){User user = new User();user.setName("Conan");user.setAge(18);user.setEmail("毛利偵探事務(wù)所");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("毛利偵探事務(wù)所");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(); }總結(jié)
以上是生活随笔為你收集整理的MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张宇:2020版数学1000题勘误及公告
- 下一篇: 1077 互评成绩计算