java学习笔记----Mybatis-Plus

Mybatis-Plus

Mybatis-Plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为了简化开发提高效率而生

img

特性

重点说明:MP适用于单表操作,如果遇到多表操作,则手写SQL会效率更高

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

MP入门案例

注意事项

1.编辑pojo 添加注解 @tableName @tableId
2.实现接口继承BaseMapper
3.编辑YML文件配置信息 将mybatis改为mybatis-plus

导入jar包

说明:由于MP内部兼容了Mybatis则引入MP之后将原来的mybatis的依赖包删除。

删除mybatis的依赖包

<!--spring整合mybatis  暂时  -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

导入MP的依赖包

  <!--spring整合mybatis-plus  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis0plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

对象与表映射

在这里插入图片描述

继承公共的Mapper接口

在这里插入图片描述

修改YML配置文件

说明:springBoot应该由原来的Mybatis数据库连接转换成MP的数据库连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRy9ylT6-1622599384584)(C:\Users\MTA\AppData\Roaming\Typora\typora-user-images\image-20210528113405293.png)]

编辑MP入门案例

对比Sql写法/MP写法的区别…

@SpringBootTest
public class TestMybatis {
    
    
    // sprign容器 <userMapper,代理对象>
    // 面向接口编程 扩展性好
    @Autowired
    private UserMapper userMapper;//JDK动态代理

    //报错说明:com.jt.mapper.UserMapper.findAll  不匹配!!!!
    //关于测试类代码说明: 要求: public   返回值void  方法名称不能叫test
    @Test
    public void test01(){
    
    
        System.out.println(userMapper.getClass());
        List<User> userList = userMapper.findAll();   //接口的方法  数据库只能识别Sql语句
        System.out.println(userList);
    }

    //查询 用户的全部记录 面向对象的方式操作数据库.
    //只能用于单表查询
    @Test
    public void testFind(){
    
    
        //暂时不需要任何where条件  查询的是全部记录.
        List<User> userList = userMapper.selectList(null);
        System.out.println(userList);
    }
}

Mybatis CURD操作练习

编辑测试代码

  @Test
    public void insert(){
    
    
        User user = new User();
        user.setName("星期五").setAge(18).setSex("男");
        userMapper.insertUser(user);
        System.out.println("新增用户成功");
    }

    //根据name="星期五",将name="星期六"
    @Test
    public void update(){
    
    
        String oldName = "星期五";
        String newName = "星期六";
        userMapper.updateByName(oldName,newName);
        System.out.println("更新用户成功");
    }

    //删除用户信息 根据name属性删除数据
    @Test
    public void delete(){
    
    
        String name = "星期六";
        userMapper.deleteByName(name);
        System.out.println("删除用户成功");
    }

编辑Mapper接口

@Insert("insert into demo_user(id,name,age,sex) " +
            "value (null,#{name},#{age},#{sex})")
    void insertUser(User user);
    @Update("update demo_user set name = #{newName} where name=#{oldName}")
    void updateByName(String oldName, String newName);
    //Mybatis中如果传递的参数只有一个,则名称任意 一般不用.
    @Delete("delete from demo_user where name=#{name}")
    void deleteByName(String name);

MP工作原理

1)通过注解 实现对象与表一一映射

2)通过属性注解 实现对象的属性与表中的字段一一映射

3)将公共的方法进行抽取,抽取到BaseMapper接口中

4)将用户操作的方法对象,转换为数据库能够识别的SQL语句

demo1:userMapper.insert(user对象)

SQL1:insert into 表名(字段名…) value(属性值…)

拼接过程:

insert into 表名(字段名…) value(属性值…)

1)通过userMapper 查找父级接口BaseMapper

2)根据BaseMapper 查找泛型对象 User对象

3)根据user对象 查找指定的注解 @TableName 获取表名

4)根据user对象 动态获取表中的字段 @TableField

5)在获取字段的同时 获取属性的值,最后进行SQL拼接

6)MP将拼接的SQL交给Mybaits框架处理执行

insert into demo|_user(id,name…) value(value1,value2…)

MP练习

根据ID查询

 /**
     * 1.根据Id=23数据
     */
    @Test
    public void select01(){
    
    
       User user = userMapper.selectById(23);
       System.out.println(user);
    }

对象查询

配置日志

在这里插入图片描述

 /**
     * 查询 name="潘凤"  sex="男"
     * 结果: 1项 userMapper.selectOne()
     *      多项 userMapper.selectList()
     * Sql: where name="xxx" and sex="xxx"
     * queryWrapper: 条件构造器  拼接where条件
     * 如果遇到多条件查询,则默认的连接符and
     * 方式1: 可以通过对象的方式进行控制
     */
    @Test
    public void select02(){
    
    
        User user = new User();
        user.setName("潘凤").setSex("男");
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

特殊字符练习

 /**
     * 要求: age>18岁  or sex=男的用户
     * 转义字符:   > gt,   < lt , = eq
     *            >= ge , <= le
     */
    @Test
    public void select03(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //编辑的是数据库字段信息
        queryWrapper.gt("age", 18)
                    .or()
                    .eq("sex","男");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

linke关键字

 /**
     * 要求: 查询name中包含"精" 并且按照age 降序排列
     * Sql: like "%精%"  包含精
     *      like "精%"   以精开头
     *      like "%精"   以精结尾
     */
    @Test
    public void select04(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name","精")
                    .orderByDesc("age");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

In关键字

 /**
     * 要求: 查询name中包含"精" 并且按照age 降序排列
     * Sql: like "%精%"  包含精
     *      like "精%"   以精开头
     *      like "%精"   以精结尾
     */
    @Test
    public void select04(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name","精")
                    .orderByDesc("age");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

不为Null查询

 /**
     * 要求: 查询name中包含"精" 并且按照age 降序排列
     * Sql: like "%精%"  包含精
     *      like "精%"   以精开头
     *      like "%精"   以精结尾
     */
    @Test
    public void select04(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name","精")
                    .orderByDesc("age");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

动态SQL语句查询

 /**
     * 要求: 查询name中包含"精" 并且按照age 降序排列
     * Sql: like "%精%"  包含精
     *      like "精%"   以精开头
     *      like "%精"   以精结尾
     */
    @Test
    public void select04(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name","精")
                    .orderByDesc("age");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

挑选字段查询

 /**
     * 要求: 查询name中包含"精" 并且按照age 降序排列
     * Sql: like "%精%"  包含精
     *      like "精%"   以精开头
     *      like "%精"   以精结尾
     */
    @Test
    public void select04(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name","精")
                    .orderByDesc("age");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

MP更新操作

更新操作

@SpringBootTest
public class TestMP2 {
    
    

    @Autowired
    private UserMapper userMapper;

    /**
     * 将ID=229的用户名称 改为六一儿童节
     */
    @Test
    public void updateUser(){
    
    
        User user =  new User();
        user.setId(229).setName("六一儿童节");
        //set name="xxx" where id = 229
        userMapper.updateById(user);
    }

    /**
     * 更新操作2
     *      将name="六一儿童节" 改为"端午节"
     *  参数说明:
     *         1.实体对象  封装修改后的数据 set结构
     *         2.UpdateWrapper 修改的条件构造器
     *  Sql: update demo_user set name="端午节" where name="61"
     */
    @Test
    public void updateUser2(){
    
    
        User user = new User();
        user.setName("端午节");
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.eq("name", "六一儿童节");
        userMapper.update(user,updateWrapper);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_54177999/article/details/117461081