MP从入门到精通

1.MP

dy同名: cgblpx

1.1 概述

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生.简单的SQL几乎是不需要再写了

1.2 特性

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

1.3 支持数据库

mysql 、 mariadb 、 oracle 、 db2 、 postgresql 、 sqlserver 等等…

1.4 常用注解

@TableName(“表名”) :当表名与实体类名不一致时,可以在实体类上加入@TableName()声明
@TableId(type = IdType.AUTO):声明属性为表中的主键(若属性名称不为默认id)
@TableFieId(“字段名”) :当实体类属性与表字段不一致时,可以用来声明

1.5 pom坐标

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

1.6 入门案例

1.6.1 改造实体类

使用注解开发,类上,属性上都要用MP提供的注解

package cn.tedu.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
@Data
@Accessors(chain = true)
@TableName("user") //这是表名,表明实体对象和表之间的映射关系
public class User extends BasePojo implements Serializable {
    @TableId(type = IdType.AUTO) //这是主键,且自增,表明字段和主键的映射关系
    private Integer id;
//    @TableField("user_name") //非主键的字段使用,当属性名和字段名不一样时,要写明字段名,表明字段和属性的映射关系
    @TableField  //非主键的字段使用,如果属性名和字段名能映射成功(驼峰规则)就可以这样简写
    private String username;
    private String password;
    private String phone;
    private String email;
    private Integer status; //1是启动,0是停用

}
1.6.2 修改Mapper层接口

Mapper层的接口,需要继承BaseMapper,并使用泛型!MP简化了单表CRUD的SQL操作,多表最好还是要自己写SQL的

package cn.tedu.dao;

import cn.tedu.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.*;

import java.util.List;

//继承BaseMapper,并使用泛型!MP简化了单表CRUD的SQL操作,多表最好还是要自己写SQL的!!!!!
public interface UserMapper extends BaseMapper<User> {
    List<User> findAll();//查找所有用户
    User findByNP(User user);//登录,根据账号密码查用户

    //MP,省略了去mapper.xml文件中,写SQL的过程
    @Select("select count(1) from user")
    Long count();//查询总记录数
    //根据分页条件,查询分页的数据,多个数据,进行封装,@Param,可以把参数自动封装成map结构,key就是括号里的值
    List<User> findUserList(@Param("start") int start,@Param("num")  int num,@Param("query")  String query);

    //删除用户
    @Delete("delete from user where id=#{id}")
    void deleteById(Integer id);
    //添加用户
    @Insert("INSERT INTO USER VALUES(NULL,#{username},#{password},#{phone},#{email},#{status},#{created},#{updated})")
    void addUser(User user);
    //修改用户的 查询回显
    @Select("select * from user where id=#{id}")
    User findById(Integer id);
    /** 修改用户信息--手机号/邮箱/修改时间  */
    @Update("update user set phone=#{phone},email=#{email},updated=now() where id=#{id}")
    void updateUser(User user);
}
1.6.3 修改核心配置文件

当前yml中,配置的是Mybatis的信息,要改成Mybatis-Plus就可以了,就是把mybatis: 改成mybatis-plus:

server:
  port: 8091
#SpringBoot配置mysql信息
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///cgbtest?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: root
#SpringBoot整合Mybatis配置
#mybatis:
# 1. SpringBoot整合MybatisPlus配置!!!!
mybatis-plus:
  #别名包
  type-aliases-package: cn.tedu.pojo
  #指定UserMapper.xml文件的位置
  mapper-locations: classpath:mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 2. 打印MP自动生成的SQL
1.6.4 测试MP

MP最大的优势就是省略了SQL语句的编写,甚至Mapper.xml文件都可以不存在了,直接调用MP提供的接口,MP会自动发起SQL来执行,我们的学习任务就是把MP提供的方法用熟练就可以了.

package cn.tedu.vo;

import cn.tedu.dao.UserMapper;
import cn.tedu.pojo.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SsmApplicationTests {

    @Autowired
    private UserMapper userMapper;

    //测试mp提供的接口,直接调接口,自动发起SQL,不需要自己写简单的SQL了
    @Test
    void contextLoads() {
        User user1 = new User(null,"haha","123","13233335555","11@qq.com",1);
        userMapper.insert(user1); //新增

        userMapper.deleteById(11);//删除

        User user = userMapper.selectById(2); //查一个
        System.out.println(user+"===========");

        List<User> users = userMapper.selectList(null); //查所有
        for (User u : users) {
            System.out.println(u+"~~~~~~~~~~~~~~");
        }

        //按条件查询= , SELECT * FROM user WHERE email='11@qq.com'
        User uu = new User();
        uu.setEmail("11@qq.com");//set的设置就相当于是=的设置
        //需用一个条件构造器,他会根据不为空的属性,自动发起查询语句(email='11@qq.com')
        QueryWrapper<User> qw = new QueryWrapper(uu);//这里表示where email='11@qq.com'
        userMapper.selectList(qw);//按条件查到多个

        //按条件查询>= , SELECT * FROM user WHERE id>=3
        QueryWrapper<User> qw2 = new QueryWrapper<>();
        //>gt <lt =eq >=ge <=le !=ne
        qw2.ge("id",3);//这里表示where id>=3
        userMapper.selectList(qw2);

        //模糊查询,like
        QueryWrapper<User> qw3 = new QueryWrapper<>();
//        qw3.likeRight("username","a");//这里表示where username like 'a%'
//        qw3.likeLeft("username","a");//这里表示where username like '%a'
        qw3.like("username","a");//这里表示where username like '%a%'
        qw3.orderByDesc("id");//排序,可以升序 降序
        userMapper.selectList(qw3);

        //in查询
        QueryWrapper<User> qw4 = new QueryWrapper<>();
//        int[] arr = {1,2,3}; //要用引用类型
        Integer[] arr = {1,2,3}; //要用引用类型
//        qw4.in("id",arr); //这里表示where id in(1,2,3)
        //也可以添加判断条件,这里表示arr不为空时,才会拼接查询条件
        qw4.in(arr!=null&&arr.length!=0,"id",arr);
        userMapper.selectList(qw4);
       
        //更新操作
        QueryWrapper<User> qw5 = new QueryWrapper<>();
        User uu2 = new User();
        uu2.setId(1).setEmail("11@163.com").setPhone("110");
        userMapper.updateById(uu2);//只会把id的值作为查询条件,其他的都用来set

        //批量删
        List<Integer> list = Arrays.asList(new Integer[]{21,22,23,24,25,26,27,28,29,30,31,32});
        userMapper.deleteBatchIds(list);

    }

}

1.7 ?

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg 是一个开源的跨平台音视频处理工具,它包含了非常多的音视频编解码器、过滤器和工具,能够完成许多音视频处理任务。下面是 FFmpeg 的从入门到精通的学习路径: ## 入门篇 ### 1. 安装 FFmpeg FFmpeg 的官方网站是 https://ffmpeg.org/,你可以在这个网站上下载对应平台的 FFmpeg 安装包,也可以通过包管理器安装。 ### 2. 基本命令行使用 学习 FFmpeg 的第一步是掌握它的基本命令行使用方法。以下是一些常用的命令: - 查看 FFmpeg 版本信息: ``` ffmpeg -version ``` - 将一个视频文件转换为另一个格式: ``` ffmpeg -i input.mp4 output.avi ``` - 对视频进行裁剪: ``` ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 output.mp4 ``` - 对视频进行压缩: ``` ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4 ``` ### 3. 媒体格式和编解码器 FFmpeg 支持的媒体格式和编解码器非常多,学习 FFmpeg 的第二步是了解这些媒体格式和编解码器的基本知识。 - 媒体格式:FFmpeg 支持的媒体格式包括 AVI、MP4、FLV、MKV、MOV 等,其中 MP4 是最常见的一种格式。 - 编解码器:FFmpeg 支持的编解码器包括 H.264、HEVC、VP8、VP9、AAC、MP3 等,其中 H.264 是最常见的一种编解码器。 ### 4. FFmpeg 过滤器 FFmpeg 过滤器是 FFmpeg 中非常强大的一部分,可以实现各种音视频处理任务,例如裁剪、剪辑、旋转、调整音量等。 以下是一些常用的过滤器: - 翻转视频: ``` ffmpeg -i input.mp4 -vf "hflip" output.mp4 ``` - 裁剪视频: ``` ffmpeg -i input.mp4 -vf "crop=640:480:0:0" output.mp4 ``` - 调整音量: ``` ffmpeg -i input.mp3 -af "volume=2" output.mp3 ``` ## 进阶篇 ### 1. FFmpeg 的 API 如果你想在自己的程序中使用 FFmpeg,你需要了解它的 API。FFmpeg 提供了 C 语言的 API,可以让你在自己的程序中使用 FFmpeg 的各种功能。 以下是一些常用的 API: - AVFormatContext:用于打开媒体文件并获取媒体文件的基本信息。 - AVCodecContext:用于初始化编解码器并设置编解码器参数。 - AVPacket 和 AVFrame:用于处理音视频数据。 ### 2. FFmpeg 的源码结构 如果你想深入了解 FFmpeg,你需要了解它的源码结构。FFmpeg 的源码结构比较复杂,但是如果你掌握了它的源码结构,你就能更好地理解 FFmpeg 的运行机制。 以下是 FFmpeg 的一些核心模块: - libavutil:提供了 FFmpeg 的核心功能,包括数据类型、内存管理、工具函数等。 - libavcodec:提供了音视频编解码器的实现。 - libavformat:提供了媒体文件格式的实现。 - libswscale:提供了视频像素格式转换的实现。 ### 3. 自定义 FFmpeg 过滤器 如果你想进一步扩展 FFmpeg 的功能,你可以编写自己的 FFmpeg 过滤器。FFmpeg 过滤器是基于 C 语言编写的,可以实现各种自定义的音视频处理任务。 以下是 FFmpeg 自定义过滤器的一些步骤: - 编写过滤器的 C 代码。 - 在 FFmpeg 的 configure 文件中添加过滤器的编译选项。 - 在 FFmpeg 的命令行中使用自定义过滤器。 ## 精通篇 ### 1. FFmpeg 的优化 如果你想让 FFmpeg 的性能更好,你需要了解一些 FFmpeg 的优化技巧。以下是一些常用的优化技巧: - 使用硬件加速:FFmpeg 支持使用硬件加速来加速编解码器的运行。 - 使用多线程:FFmpeg 支持多线程编解码,可以更好地利用多核 CPU。 - 使用 SIMD 指令:FFmpeg 支持使用 SIMD 指令来加速一些计算密集型任务。 ### 2. FFmpeg 的扩展 如果你想让 FFmpeg 支持更多的功能,你可以使用 FFmpeg 的扩展。以下是一些常用的 FFmpeg 扩展: - FFmpeg-filters:提供了许多额外的过滤器,例如去噪、锐化、模糊等。 - FFmpeg-libs:提供了许多额外的代码库,例如 libavresample、libswresample 等。 - FFmpeg-tools:提供了许多额外的工具,例如 ffprobe、ffplay 等。 ## 总结 FFmpeg 是一个强大的音视频处理工具,学习 FFmpeg 的过程需要掌握一些基本的命令行使用、媒体格式和编解码器、过滤器等知识。如果想深入了解 FFmpeg,可以学习 FFmpeg 的 API、源码结构、自定义过滤器等知识,并且要了解一些优化技巧和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值