MybatisPlus和Mapper框架

MybatisPlus

mubatis plus 官网

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

ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。

只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。

ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候自然就想到了xml和特性(Attribute).目前的ORM框架中,Hibernate就是典型的使用xml文件作为描述实体对象的映射框架,而大名鼎鼎的Linq则是使用特性(Attribute)来描述的。

开发MyBatis Plus:

  1. jar

  2. 数据表–类

    student Student
    
  3. MyBatis配置 文件 mybatis.xml (没有具体的配置信息,因为会放入Spring中配置)

  4. 日志 log4j.xml

  5. 数据库的连接信息

  6. Spring配置文件

spring boot:自动管理版本

spring:版本手工 mybatis - plus

切换到 MyBatis-PLus

<bean  id="sqlSessionFactoryBean"  class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"  >

mybatis 配置文件模板

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver"
                          value="oracle.jdbc.OracleDriver" />
                <property name="url"
                          value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
                <property name="username" value="system" />
                <property name="password" value="sa" />
            </dataSource>
        </environment>
    </environments>
    <!-- 在配置文件(conf.xml)中注册SQL映射文件(studentMapper.xml)-->
    <mappers>
        <mapper resource="org/lanqiao/entity/studentMapper.xml" />
    </mappers>
</configuration>

CRUD操作

JDBC: Dao接口 Dao实现类

MyBatis: Mapper接口- SQL映射文件

MyBatis-PLus : Mapper接口

MyBatis-PLus:只写接口不需要写sql语句

一个接口 extends BaseMapper,之后无需编写 SQL映射文件,该接口的对象全部操作哦Student对象

  1. 类名—-表名

    @TableName("tb_student")
    
  2. 对象的属性—表的字段 一一对应关系:

    @TableId、@TableField
    @TableId(value = "stuno",type = IdType.AUTO)//指定自增
    

    主键的自增依赖于数据库已经设置好了主键自增

    属性的驼峰命名法会变成下划线命名

    属性:stuName–>字段:stu_name

    如果不想转换可以在配置文件中设置

    <!--配置属性和字段驼峰命名和下划线命名不互相转换  默认值是true-->
    <setting name="mapUnderscoreToCamelCase" value="false"/>
    

    一般默认表中字段为下划线,类中属性为驼峰

    mybatisplus不需要在像mybatis那样执行后需要commit

    雪花算法

MyBatis-plus:

  1. 更换成MybatisSqlSessionFactoryBean
  2. 继承一个父接口 extends BaseMapper,之后就可以使用该接口中 已经存在的CRUD方法
  3. 操作 。 通过注解 将 表(字段) - 类(属性)

MP: where语句:Warpper实现 , QueryWarpper(查询) UpdateWrapper(DML)

MP源码

回顾:

MappedStatement对象 就是 <select>等标签

MyBatis/MP都是通过 MappedStatement对象来指向增删改

预加载:MP启动时,会指定加载所有常见的 CRUD语句 (来自于MP提供的BaseMapper接口),并将这些语句封装到了MappedStatement对象中。

AR: activeRecoder ,形式 :通过实体类Student直接进行增删改查操作(不需要借助于Mapper对象)

继承Model类即可

public class Student extends  Model<Student> 
public static void testAR(){

    // 必须在IOC容器中进行AR
    new ClassPathXmlApplicationContext("applicationContext.xml");
    Student student = new Student("哈哈", 22);
    student.insert();
}

注意:使用时 必须先加载IOC容器,目的 是为了让AR知道 要操作的是数据库在哪里

MP将主键设置为了Serializable,类型。目的 :可以接受常见的类型:8个基本类型+String ->Serializable

逆向工程(代码生成器)

MyBatis:

student表->Student类、Mapper接口、mapper.xml

MyBatis Plus:

student表->Student类、Mapper接口、mapper.xml、Service、Controller

区别:

  • MyBatis: 模版配置文件
  • MyBatis Plus:类

具体使用参见官网

lombok:可以给类的属性生成set get 构造方法等 1. 依赖 2. 配置

分页

分页:复习

<select>等标签 -> MappedStatement对象

boundSql :将我们写的SQL和参数值进行了拼接后的对象,即最终能被真正执行的SQL

拦截器:编写拦截器、注入拦截器,放入 <plugins>即可。 作用:对SQL进行“修改”

分页: MyBatis Plus

<!--    拦截器  分页-->
    <property name="plugins">
        <list>
<!--            分页插件-->
            <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"> </bean>
        </list>
    </property>
    public static void testPage() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        StudentMapper studentMapper = context.getBean("studentMapper", StudentMapper.class);
        Page<Student> page = new Page<>(2, 2);
        //select * from student ; 第二个参数来存放where条件
        IPage<Student> pages = studentMapper.selectPage(page, null);
        System.out.println("当前页得数据++++"+ page.getRecords());
        System.out.println("当前页页码++++"+ page.getCurrent());
        System.out.println("总数据量++++"+ page.getTotal());
        System.out.println("每一页得数据量++++"+ page.getSize());

    }

分析分页源码

select *from xxx 
    ->PaginationInterceptor
select *from xxx   LIMIT 2,2 

攻击 SQL 阻断解析器

作用!阻止恶意的全表更新删除

跟分页类一样

性能分析插件

性能分析拦截器,用于输出每条 SQL 语句及其执行时间

乐观锁插件

悲观锁:synchorinzed,lock;总以为会冲突,当第一个人访问得时候,把数据加上锁,其他人访问不到该数据,知道第一个人结束访问。并发操作变成串行操作(效率太低严重影响性能) 乐观锁:cvs算法;总以为不冲突;在修改的一瞬间去检验一下

sql注入器

sql语句的实现方式

  1. mybatis:

    studentMapper.xml   
    
    <select id="queryStudent">
            select * from xxx 
    </select>
    

  2. mybatis:

    @Select("select....")
    
  3. MP:

    extends BaseMapper<Student> 
    
  4. MP:

    自己写SQL。Sql 注入器,仿照方式“3” 自己编写一个 带SQL的方法 deleteAllStudents();

    1. 自定义方法 ->写sql语句 + 标签名 MyDelete extends AbstractMethod
    2. 自定义Sql 注入器 : 包含原来17个 + 自己的MyDelete
    3. 配置 告知MP,以后使用自定义注入器

逻辑删除

逻辑删除(假删除):

@TableLogic
private Integer deleted;  

在表中增加相应字段

逻辑删除:为了数据安全

全局配置: 以 表名加前缀位置

<property name="dbConfig" >
    <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
        <property name="logicDeleteValue" value="1"></property>
        <property name="logicNotDeleteValue" value="0"></property>
        <property name="tablePrefix" value="tb_"></property>

    </bean>
</property>
@TableName(value="student",keepGlobalPrefix=true)
	

自动填充插件

Sequence主键

实现oracle数据库的自增

mvn仓库添加oracle jar

  1. 将ojdbc7.jar复制到mvn的本地仓库

  2. cmd执行

    mvn install:install-file -DgroupId=ojdbc -DartifactId=ojdbc7 -Dversion=7.0.0.1 -Dpackaging=jar -Dfile=ojdbc7.jar
    
    

MybatisX 快速开发插件

MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。

本插件时针对于mubatis开发的

MyBatis Plus的源码 github地址

Mapper

mapper 码云地址

与MP时同级的关系都是对mybatis的插件

mapper github地址

mybatis/mp:

<bean id="configurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"  >
        <property name="basePackage" value="com.yq.mapper" ></property>
    </bean>

Mapper:

【tk】\.mybatis.spring.mapper.MapperScannerConfigure

回顾:

mapper配置:和mybatis基本一致:唯一不同的 org->tk

MP:

public interface StudentMapper    extends baomidou.....BaseMapper<Student> {

Mapper:

public interface StudentMapper    extends Mapper<Student> {

mapper的核心:

Mapper父接口中 有很多细化的父接口(每个细化的父接口负责一件事情: x)

主键:包装类Integer/ Long ,不要使用基本类型

只支持单表操作

标识@id

SELECT stu_no,stu_name,stu_age FROM tb_student 
WHERE stu_no = ? 

没有标识@id :默认 将全部字段作为联合主键

SELECT stu_no,stu_name,stu_age FROM tb_student 
WHERE stu_no = ? AND stu_name = ? 
AND stu_age = ? 

MP 可以将主键值 会写到 对象中;

mapper默认不会, 如果要: 配置

@Id()
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer stuNo ;//stuNo -> stu_no

插入数据时,如果不给主键赋值,是否回写?

zs  23  -> 18,zs ,23
  1. mysql 或其他自带 “自增功能”的数据库:

    @Id()
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    
  2. oracle不带自增:

    @Id()

        @KeySql(sql = "select SEQ_stu.nextval from dual", order = ORDER.BEFORE)
    

通过序列实现自增

selectOne(stu) stu:查询条件,类似于MP 中的wrapper

  • selective

    INSERT INTO tb_student ( stu_no,stu_name ) VALUES( ?,? ) 
    
  • 没有selectvie

    INSERT INTO tb_student ( stu_no,stu_name,stu_age ) VALUES( ?,?,? ) 
    

    selective:对于没有操作的值,不进行任何处理

    没有selective:对于没有操作的值, 赋值为NULL 。可以发现,selective在insert操作 基本没有区别.

    但对于修改,一般建议 加上selective,不用修改的字段会保留原来的值,而不会赋值为null

mapper 代码生成器

mapper 自由组合功能

新增方法

mapper 的源码 mapper逆向工程

mapper