MybatisPlus
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:
jar
数据表–类
student Student
MyBatis配置 文件 mybatis.xml (没有具体的配置信息,因为会放入Spring中配置)
日志 log4j.xml
数据库的连接信息
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
类名—-表名
@TableName("tb_student")
对象的属性—表的字段 一一对应关系:
@TableId、@TableField @TableId(value = "stuno",type = IdType.AUTO)//指定自增
主键的自增依赖于数据库已经设置好了主键自增
属性的驼峰命名法会变成下划线命名
属性:stuName–>字段:stu_name
如果不想转换可以在配置文件中设置
<!--配置属性和字段驼峰命名和下划线命名不互相转换 默认值是true--> <setting name="mapUnderscoreToCamelCase" value="false"/>
一般默认表中字段为下划线,类中属性为驼峰
mybatisplus不需要在像mybatis那样执行后需要commit
雪花算法
MyBatis-plus:
- 更换成MybatisSqlSessionFactoryBean
- 继承一个父接口 extends BaseMapper
,之后就可以使用该接口中 已经存在的CRUD方法 - 操作 。 通过注解 将 表(字段) - 类(属性)
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语句的实现方式
mybatis:
studentMapper.xml <select id="queryStudent"> select * from xxx </select>
mybatis:
@Select("select....")
MP:
extends BaseMapper<Student>
MP:
自己写SQL。Sql 注入器,仿照方式“3” 自己编写一个 带SQL的方法 deleteAllStudents();
- 自定义方法 ->写sql语句 + 标签名 MyDelete extends AbstractMethod
- 自定义Sql 注入器 : 包含原来17个 + 自己的MyDelete
- 配置 告知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
将ojdbc7.jar复制到mvn的本地仓库
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
与MP时同级的关系都是对mybatis的插件
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
mysql 或其他自带 “自增功能”的数据库:
@Id() @GeneratedValue(strategy = GenerationType.IDENTITY)
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逆向工程