MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)()

  本篇文章为你整理了MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)()的详细内容,包含有 MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器),希望能帮助你了解 MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)。

   Mapper接口继承mybatis-plus的基础类 BaseMappe,Service接口继承IService。从而实现自动化CRUD

  
官方文档:https://baomidou.com/
 

  (建议多看看官方文档,每种功能里面都有讲解)【本文章使用的mybatisplus版本为3.5.2】

  条件构造器

  一般都是用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或map

   User user = userMapper.selectOne(wrapper);//查询一个数据,若出现多个结果使用list或map

   System.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);//输出查询的数量selectCount

   System.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

   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: root

   password: 123456

   driver-class-name: com.p6spy.engine.spy.P6SpyDriver

   url: 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.StdOutImpl

  

 

  3、创建实体类

  

@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); //会帮我们自动生成id

   System.out.println(result); //受影响的行数

   System.out.println(user); //通过日志发现id会自动回填(id是由雪花算法生成的,在主键生成策略部分有讲到)

  

 

  数据库插入的id的默认值为:全局的唯—id

  Update

  

@Test//测试更新

 

  public void updateTest(){

   User user = new User();

   user.setId(2L);//怎么改id??

   //通过条件自动拼接动态Sql

   user.setName("root");

   user.setAge(12);

   user.setEmail("root@qq.com");

   int i = userMapper.updateById(user);//updateById,但是参数是个user

   System.out.println(i);

  

 

  Select

  通过id查询单个用户

  

@Test//通过id查询单个用户

 

  public void testSelectById(){

   User user = userMapper.selectById(1L);

   System.out.println(user);

  

 

  通过id查询多个用户

  

@Test//通过id查询多个用户

 

  public void testSelectBatchIds(){

   List User users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));

   users.forEach(System.out::println);

   //System.out.println(users);

  

 

  条件查询 通过map封装

  

@Test//通过条件查询之一 map(这里的map,相当于where后面的 name="conan"等条件)

 

  public void testMap(){

   HashMap String, Object map = new HashMap ();

   //自定义要查询的

   map.put("name","www"); //查询名字是www的数据

   map.put("name","111"); //查询名字是111的数据 最后的结果是取两者交集

   map.put("age",18);

   List User users = userMapper.selectByMap(map);

   users.forEach(System.out::println);

  

 

  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层才有的方法

  为了区分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

  

 @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","毛利小五郎");

   userService.remove(wrapper); //根据条件构造器删除数据

   userService.removeById(16L); //根据id删除数据,也可以根据实体类对象删除数据

   userService.removeByMap(map); //根据map的条件删除记录

   userService.removeBatchByIds(Arrays.asList(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(wrapper); //根据条件构造器更新

   userService.updateById(user); //根据传入的实体类id确定需要更新的数据,更新为传入的实体类对象

   userService.updateBatchById(Arrays.asList(user)); //批量更新

  

 

  该方法只能查询一条数据,所以不推荐。查询用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.getById(12L); //根据id查询一条数据

   userService.getMap(wrapper); //根据构造器查询一条数据,返回Mapper集合

  

 

  查询多条数据

  

@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

  统计符合条件的数据的数量

  

@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.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增删改查操作 (包含条件构造器)()的详细内容,想要了解更多 MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: