MyBatisPlus 第一天

数据库创建表

CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名 ',
`age` int(11) DEFAULT NULL COMMENT '年龄 ',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱 ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

添加数据

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

 

创建SpringBoot项目后进行以下操作

1 pom.xml中导入依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
<!--    SpringBoot整合测试的Start-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

<!--        SpringBoot整合MyBatisPlus的依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--    插件使用 为实体类提供set get以及相关方法    -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
<!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

 补充: mysql 8.0和mysql5.0版本的区别: 1)mysql常用版本5.5 5.6 5.7以及8.0

                                                               2) 5.x的版本可以使用8.0的驱动 具有向上兼容  5.x的没                                                                        有 cj包,8.0有cj包(关系到驱动项和URL)

                                                               3) 你的电脑安装的是8.0的mysql 需要在URL后面加上时                                                                        区,5.x的版本不需要

 2 添加lombok的插件

 文件->设置->插件 搜索LomBok进行安装

 3  application.yml中配置数据源信息

spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf- 8&useSSL=false
username: root
password: 123456

4 在SpringBoot启动类中 记得加上@MapperScan的注解来扫描mapper包

5 创建Mapper接口

@Repository
//自己写的BaseMapper就是基础的CRUD
public interface UserMapper extends BaseMapper<User> {
}

6 创建实体类

@Data //lombok注解  提供所有set get方法
@AllArgsConstructor  //有参构造器方法
@NoArgsConstructor  //无参构造器方法
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;


}

关于LomBok注解的补充

三种方式使SpringBoot测试类正常运行

 

关于BaseMapper中方法的测试

插入

 @Test
    public void insert(){
        User user=new User(null,"张三",23,"123@qq.com");
        int count=userMapper.insert(user);
        System.out.println(user.getId());
    }

输出结果

此处的id是通过雪花算法自动生成的

如果想要主键正常生成 自增的效果可以改动两个地方

1)application.yml中  

global-config:
    db-config:
  # 配置MyBatis-Plus操作表的默认前缀
      table-prefix:
  # 配置MyBatis-Plus的主键策略
      id-type: auto

2)数据库中的表中,一定要勾选自动递增

 

删除

 //通过ID删除
    @Test
    public void deleteById(){
        int result = userMapper.deleteById(1);
        System.out.println(result);
    }

    //通过map删除
    @Test
    public void deleteByMap(){
        Map<String,Object> map=new HashMap<>();
        map.put("name","张三");
        map.put("email","123@qq.com");
        int result = userMapper.deleteByMap(map);
        System.out.println(result);
    }

    //ID批量删除
    @Test
    public void deleteIds(){
        List<Long> list=Arrays.asList(1L,2L,3L);
        int result=userMapper.deleteBatchIds(list);


    }

 修改

  @Test
    public void testUpdateById(){
        User user = new User(4L, "admin", 22, null);
        //UPDATE user SET name=?, age=? WHERE id=?
        int result = userMapper.updateById(user);
        System.out.println("受影响行数:"+result);
    }

查询

  @Test
    public void testSelectById(){
    //根据id查询用户信息
    //SELECT id,name,age,email FROM user WHERE id=?
        User user = userMapper.selectById(4L);
        System.out.println(user);
    }

    @Test
    public void testSelectBatchIds(){
    //根据多个id查询多个用户信息
    //SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
        List<Long> idList = Arrays.asList(4L, 5L);
        List<User> list = userMapper.selectBatchIds(idList);
        list.forEach(System.out::println);
    }

    @Test
    public void testSelectByMap(){
    //通过map条件查询用户信息
    //SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
        Map<String, Object> map = new HashMap<>();
        map.put("age", 22);
        map.put("name", "admin");
        List<User> list = userMapper.selectByMap(map);
        list.forEach(System.out::println);
    }

四种条件构造器:updatewrapper  querywrapper  lambdaquerywrapper  lambdaupdatewrapper

以下为示例

  @Autowired
    private UserMapper userMapper;

    //测试selectList()用wrapper做条件构造器来查询
    @Test
    public void test1(){
        //查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息
        //创建条件构造器对象
        //==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
        // 执行的sql
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        queryWrapper.like("name","a")
                .between("age",20,30)
                .isNotNull("email");
        userMapper.selectList(queryWrapper).forEach(System.out::println);
    }


    //测试条件加上排序
    @Test
    public void test2(){
        //查询用户信息,按照年龄的降序排序  如年龄相同,则按照id升序排序
        //创建条件构造器对象
        //==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user WHERE is_deleted=0 ORDER BY age DESC,uid ASC
        // 执行sql
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        queryWrapper.orderByDesc("age").orderByAsc("id");
        userMapper.selectList(queryWrapper).forEach(System.out::println);
    }

    //使用wrapper进行删除
    @Test
    public void test3(){
        //删除有邮箱地址为null的用户信息
        //创建条件构造器对象
        //==>  Preparing: UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
        //        // 执行sql
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        queryWrapper.isNull("email");
        userMapper.delete(queryWrapper);
    }

    @Test
    public void test4(){
        //修改将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
        //注意2点  1.使用QueryWrapper<User>目的是查询符合条件的数据修改  2.使用userMapper的update方法去修改(user,wrapper)
        //参数1  修改的内容   参数2 查找需改数据的条件
        //==>  Preparing: UPDATE user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND
        User user=new User();
        user.setName("小明");
        user.setEmail("xiaoming@qcby.cn");
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        queryWrapper.gt("age",20)
                .like("name","a")
                .or()
                .isNull("email");
        int result=userMapper.update(user,queryWrapper);
    }

    @Test
    public void test5(){
        //修改//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        //条件构造器注意  AND和or的优先级以及使用   此时的AND和or需要加还要lambda表达式
        QueryWrapper<User> wrapper=new QueryWrapper<>();
        wrapper.like("user_name","a" ).and(i->i.gt("age", 20).or().isNull("email"));
        User user=new User();
        user.setName("小红");
        user.setEmail("xiaohong@qcby.cn");
        int update = userMapper.update(user, wrapper);
        System.out.println("满足条件修改的值个数:"+update);
    }

    @Test
    public void test6(){
//        select查询指定的字段而不是所有字段
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        queryWrapper.select("name","age");
        List<Map<String,Object>> mapList=userMapper.selectMaps(queryWrapper);
        mapList.forEach(System.out::println);
    }

    @Test
    public void test7(){
        //查询id小于等100的用户信息
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        //首先使用insql来构建子查询语句
        queryWrapper.inSql("age","select age from user where age<20");
        //在使用userMapper的selectList查询结果
        List<User> list=userMapper.selectList(queryWrapper);
    }

    @Test
    public void test8(){
        //修改将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
        UpdateWrapper<User> updateWrapper=new UpdateWrapper<User>();
        updateWrapper.gt("age",20)
                .and(i->i.like("name","a"))
                .or()
                .isNull("email");
        updateWrapper.set("name","张三").set("email","qcby@2021");
        userMapper.update(null,updateWrapper);
    }


    /**
     * MP中的组装的条件情况
     * 实现前端用户选择条件然后进行判断
     * 满足加入到构造器  不满足不加入
     * 第一种方式:使用字符串工具类判断
     * sql
     * ==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user
     * WHERE is_deleted=0 AND (age >= ? AND age <= ?
     * Parameters: 20(Integer), 30(Integer)
     */
    //第一种方式
    @Test
    public  void test9(){
        String username="";
        Integer start=20;
        Integer end=10;
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        if(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(username)){
            queryWrapper.like("name","username");
        }
        if(start!=null){
            queryWrapper.ge("age",start);
        }
        if(end!=null){
            queryWrapper.le("age",end);
        }
        List<User> list=userMapper.selectList(queryWrapper);
    }

    //第二种方式
    @Test
    public  void test10(){
        String username="";
        Integer start=20;
        Integer end=10;
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();

        queryWrapper.like(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(username),"name","username");

        queryWrapper.ge(start!=null,"age",start);
        queryWrapper.le(end!=null,"age",end);
        List<User> list=userMapper.selectList(queryWrapper);
    }

    /**
     * MP演示避免字段写错的方式
     * 可以根据当前实体类的属性找到对应的字段名
     * 使用LambdaQueryWrapper的构造器
     * sql
     * ==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user
     * WHERE is_deleted=0 AND (user_name LIKE ? AND age >= ? AND age <= ?)
     */
    @Test
    public  void test11(){
        String username="";
        Integer start=20;
        Integer end=10;
        LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();

        lambdaQueryWrapper.like(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(username),User::getName,"username")
                            .le(start!=null,User::getAge,start)
                             .ge(end!=null,User::getAge,end);
        List<User> list=userMapper.selectList(lambdaQueryWrapper);
        list.forEach(System.out::println);
    }

    /**
     * MP演示避免字段写错的方式
     * 可以根据当前实体类的属性找到对应的字段名
     * 使用LambdaUpdateWrapper的构造器
     * sql
     * ==>  Preparing: UPDATE user SET user_name=?,email=?
     * WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ?) OR email IS NULL)
     */
    @Test
    public void test12(){
        LambdaUpdateWrapper<User> lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.ge(User::getAge,20)
                .and(i->i.like(User::getName,"a"))
                .or()
                .isNull(User::getEmail);
        lambdaUpdateWrapper.set(User::getName, "张亮").set(User::getEmail, "abc@qcby.com");
        int update = userMapper.update(null, lambdaUpdateWrapper);
        System.out.println(update);
    }

最后讲解下 @Mapper和@Repository的区别

相同点:都作用在mapper层接口 生成对象Bean 交给spring容器管理

不同点: @Mapper可以单独使用 不需要配置扫描地址  @Repository需要配置扫描地址 和@MapperScan联用 否则没有任何用处

MyBatis-Plus是一个基于MyBatis的增强工具,它提供了一系列的CRUD操作的封装。通过引入MyBatis-Plus,我们可以简化数据库操作的代码,提高开发效率。 MyBatis-Plus通过封装BaseMapper接口来实现通用的CRUD操作。BaseMapper接口内置了常见的增删改查方法,我们可以直接使用这些方法来进行数据库操作,无需手动编写SQL语句。同时,MyBatis-Plus还提供了自动解析实体表关系映射的功能,将实体对象的属性与数据库表的字段进行自动映射,极大地简化了开发过程。 对于插入操作,我们可以使用MyBatis-Plus提供的方法来进行插入数据。需要注意的是,如果数据库表定义了某个字段为非空,那么在插入数据时,该字段必须有值。如果使用MyBatis-Plus自动生成的雪花算法值作为唯一值,可以在实体类的属性上加上@TableId注解。 总结起来,MyBatis-Plus是一个用于简化数据库操作的增强工具,通过封装BaseMapper接口提供通用的CRUD操作,同时提供自动解析实体表关系映射的功能。对于插入操作,需要保证非空字段有值,可以使用MyBatis-Plus自动生成的雪花算法值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SSM框架的学习与应用JavaEE(第二天)Mybatis的深入学习](https://download.csdn.net/download/m0_53659738/88241458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MyBatisPlus——CRUD](https://blog.csdn.net/weixin_52467834/article/details/122647960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Mybatis-Plus的CRUD](https://blog.csdn.net/qq_43223307/article/details/121439592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值