Spring-jt-Day03-MybatisPlus

版权声明:本文为闪耀太阳原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_16804847/article/details/116259283

1.MybatisPlus

1.1 MP介绍

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.2 MP的特点

1.无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
2.损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
3.强大的 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.3 MybatisPlus入门案例

1.3.1 导入jar包

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

1.3.2 编辑POJO对象

说明:MP要求以面向对象的方式操作数据库.其中对象与表 属性与字段必须映射!!!
实现方式: 利用注解进行绑定.
Spring-jt-Day03-MybatisPlus_第1张图片

1.3.3 编辑Mapper接口

Spring-jt-Day03-MybatisPlus_第2张图片

1.3.4 编译YML配置文件

说明: MP增强了Mybatis, MP内部包含了Mybatis 所以将Mybatis的包删除,否则内部jar包异常
修改YML配置文件:
修改mybatis名称为mybatis-plus
Spring-jt-Day03-MybatisPlus_第3张图片

1.3.5 编辑测试案例

利用userMapper 实现以对象的方式操作数据库
Spring-jt-Day03-MybatisPlus_第4张图片

1.4 MP核心原理

1.4.1 需求

说明: 之前操作数据库采用sql(面向过程的语言)方法进行编辑. 但是如果所有的单表操作都由程序员完成.则开发效率低. 能否开发一种机制可以实现以面向对象的方式操作数据库.

1.4.2 原理说明

1.对象与数据表进行关联 @TableName
2.MP采用BaseMapper的方式 将公共的接口方法进行了抽取. 采用泛型T的方式进行约束
3.MP将用户操作的对象在底层自动的转化为Sql语句!!!

1.4.3 对象转化Sql原理

对象方法: userMapper.insert(User对象);
Sql语句: insert into demo_user(id,name…) value(100,xxx…)
步骤:
1.根据userMapper找到对应的class类型
2.根据userMapper的类型通过反射机制获取父级接口类型BaseMapper
3.找到BaseMapper类型之后,获取泛型类型 User.class
4.获取User.class之后,获取class的注解名@TableName注解.获取注解名称. 至此表名获取成功
5.根据User.class获取其中的属性名称.之后获取属性上的@TableField 获取字段名称.
6.之后利用对象的get方法获取属性的值最终实现了Sql语句的拼接过程.
7.MP将整理好的Sql交给Mybatis(jdbc)去处理. 最终实现了以对象的方式操作数据库.

1.5 MP常规操作

1.5.1 添加日志打印

server:
  port: 8090

#SpringBoot 开箱即用
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/jtadmin?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    #检查密码是否正确
    password: root

#SpringBoot整合MybatisPlus配置
mybatis-plus:
  #定义别名包
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

#添加MP日志  打印执行的sql
logging:
  level:
    com.jt.mapper: debug

1.5.2 测试入库操作

package com.jt;

import com.jt.mapper.DemoUserMapper;
import com.jt.pojo.DemoUser;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TestMP {

    @Autowired
    private DemoUserMapper userMapper;

    @Test
    public void insert(){
        DemoUser user = new DemoUser();
        user.setName("MP测试").setSex("男").setAge(19);
        userMapper.insert(user);
    }

}

1.5.2 测试更新操作

 //测试更新操作 修改id=231的数据 name="中午吃什么" age=18
    //原则: 根据对象中不为null的属性当做set条件. set name="xxx"
    //      如果ById的操作,则Id必须赋值 并且ID当做唯一where条件
    @Test
    public void updateById(){
        DemoUser user = new DemoUser();
        user.setName("中午吃什么").setAge(18).setId(231);
        userMapper.updateById(user);
    }

1.5 切换Maven工具

1.5.1 关于Maven说明

程序员操守:
1.Maven不要放到C的系统盘中 不要有中文目录 空格
2.在D盘中复制maven工具 Spring-jt-Day03-MybatisPlus_第5张图片
3).配置settings文件
3.1 切换 自己的本地库
${user.home}/.m5/repository

		 3.2 切换私服镜像
	<mirror>
	<id>aliyun</id>
	<name>aliyun for maven</name>
	<mirrorOf>*</mirrorOf>
	<url>https://maven.aliyun.com/repository/public</url>
   </mirror>
			 
 3.3 切换JDK版本
	 <profile>
   <id>jdk-1.8</id>
   <activation>
	<activeByDefault>true</activeByDefault>
      <jdk>1.8</jdk>
   </activation>
   <properties>
	   <maven.compiler.source>1.8</maven.compiler.source>
	   <maven.compiler.target>1.8</maven.compiler.target>
	   <maven.compiler.compilerVersion>
        1.8
       </maven.compiler.compilerVersion>
	 </properties>
   </profile>	 

1.5.2 配置IDEA

Spring-jt-Day03-MybatisPlus_第6张图片

1.7 MP常规操作

1.7.1 根据对象查询


    /**
     * 1.查询id=21的用户  根据ID查询数据   1条记录
     * 2.查询name="白骨精" sex=女 的用户   List
     * 知识点:
     *      1.queryWrapper  条件构造器  拼接where条件的.
     *      原则: 根据对象中不为null的属性拼接where条件
     */
    @Test
    public void testSelect(){
        //1.根据ID查询
        DemoUser user = userMapper.selectById(21);
        System.out.println(user);
        //2.根据属性查询
        DemoUser user2 = new DemoUser();
        user2.setName("白骨精").setSex("女");
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>(user2);
        List<DemoUser> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

1.7.2 条件构造器查询

说明: 如果查询条件中有特殊关系符,则使用特殊转义字符查询 代码如下.

/**
     * 需求: 查询age>18岁  并且性别为女的用户
     * Sql: select * from demo_user where age > 18 and sex="女"
     * 特殊字符:  > gt   < lt   = eq
     *           >= ge  <= le
     * 默认链接符: and
     *
     * */
    @Test
    public void testSelect2(){
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 18)
                    .eq("sex", "女");
        List<DemoUser> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

1.7.3 关键字like查询

 /**
     * 练习like关键字
     *      查询name中包含"精"字的数据
     * Sql: like "%精%"
     *      以精开头    like "精%"   likeRight
     *      以精结尾    like "%精"   likeleft
      */
    @Test
    public void testSelect3(){
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name", "精");
        List<DemoUser> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

1.7.4 关键字OrderBy

 /**
     * 查询sex=男的数据,以id倒序排列
     * Sql: select * from demo_user where sex='男' order by id desc
     */
    @Test
    public void testSelect4(){
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sex", "男")
                    .orderByDesc("id");
        List<DemoUser> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

1.7.5 In关键字

/**
     * 5.查询id= 1,3,5,6,7的用户
     * Sql: select * from demo_user where id in (xxx,xx,xx)
     */
    @Test
    public void testSelect5(){
        //数组使用包装类型
        Integer[] ids = {1,3,5,6,7};
        //需要将数组转化为集合
        List idList = Arrays.asList(ids);
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();
        //queryWrapper.in("id", idList);    //根据list查询 list集合功能丰富
        queryWrapper.in("id", ids); //数组必须包装类型
        List<DemoUser> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

1.7.6 带判断条件的查询

 /**
     * 需求: 如果根据name属性和age属性查询数据. 有时某个数据可能为null,
     *      要求动态查询!!!
     *      where name=xxx age>xxxx
     * 伪Sql: select * from demo_user
     *              where name!=null name=xxx and age!=null age>xxx
     * condition: 内部编辑一个判断的条件
     *                      如果返回值结果为true 则拼接该字段.
     *                      如果为false 则不拼接该字段
     * StringUtils.hasLength(name) 判断字符串是否有效
     */
    @Test
    public void testSelect6(){
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();
        String name = "";
        int age = 18;
        queryWrapper.eq(StringUtils.hasLength(name),"name",name)
                    .gt(age>0, "age",age);
        List<DemoUser> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

1.7.7 查询第一列数据

/**
     * 需求: 只想查询第一列数据   selectObjs
     * 说明: queryWrapper=null 不需要where条件
     * selectObjs:
     *      1.一般根据条件查询Id的值,查询之后为后续的sql提供数据支持
     *      2. 有时用户只需要查询ID的值,并不需要其他数据项时 使用objs.
    */
    @Test
    public void testSelect7(){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("sex","男");
        List objs = userMapper.selectObjs(queryWrapper);
        System.out.println(objs);
    }

1.7.8 查询指定字段的数据

/**
     * 需求: 想查询name/sex字段
     *  queryWrapper.select("name","sex"); 挑选执行字段
     */
    @Test
    public void testSelect8(){
        QueryWrapper<DemoUser> queryWrapper = new QueryWrapper();
        queryWrapper.select("name","sex");
        List objs = userMapper.selectList(queryWrapper);
        System.out.println(objs);
    }

1.7.9 更新数据

 /**
     * 更新数据
     *      将name="中午吃什么" 改为name="晚上吃什么"
     *      性别: 改为 其他
     * Sql:
     *      update demo_user set name="xxx",sex="其他"
     *          where name="xxxx"
     * 参数说明:
     *      1.entity 实体对象  需要修改的数据进行封装
     *      2.updateWrapper 条件构造器
     */
    @Test
    public void testSelect10(){
        DemoUser user = new DemoUser();
        user.setName("晚上吃什么").setSex("其他");
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.eq("name", "中午吃什么");
        userMapper.update(user,updateWrapper);
    }

解决自动注入警告问题

Spring-jt-Day03-MybatisPlus_第7张图片

作业

1.预习SpringMVC调用流程
2.复习Servlet机制.
3.MybatisPlus 熟练使用

你可能感兴趣的:(spring,java,mybatis,spring)