Mybatis、Mybatis-Plus学习笔记

1 Mybatis简介

1.1 原始jdbc分析

存在问题:

1 	数据库连接、创建、释放 频繁造成系统资源浪费

2 	sql语句 硬编码,不易维护

3 	查询操作,需手动将结果集中的数据手动封装到实体中。
	插入操作,需手动将实体的数据设置到sql语句的占位符位置。

应对方案:

1 使用数据库连接池初始化连接资源
2 将sql语句抽取到xml配置文件中
3 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

1.2 Mybatis

基于java的持久层框架,它内部封装了jdbc,只需关注sql语句即可。

通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。

mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决实体与数据库映射的问题,对jdbc进行封装,屏蔽jdbc api底层访问细节。

开发步骤:

1 添加MyBatis坐标

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

2 创建user数据表
在这里插入图片描述

3 编写User实体类
在这里插入图片描述

4 编写映射文件UserMapper.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userMapper">
    <select id="findAll" resultType="wsw.Domain.User">
        select  * from newUser
    </select>
</mapper>

5 编写核心文件SqlMapConfig.xml

<?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"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="Mapper\UserMapper.xml"/>
    </mappers>
</configuration>

6 测试

	@Test
    public void test1() throws Exception {
        //加载核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行sql语句
        List<User> userList = sqlSession.selectList("User_Mapper.findAll");
        //打印结果
        System.out.println(userList);
        //释放资源
        sqlSession.close();
    }

1.3 Mybatis映射文件概述

在这里插入图片描述

1.4 Mybatis增删改查

插入
UserMapper配置

<insert id="insert" parameterType="wsw.Domain.User">
        insert into newUser values (#{id},#{username},#{password})
    </insert>

测试代码涉及
在这里插入图片描述

使用insert标签
映射文件使用parameterType属性指定要插入的数据类型
sql语句使用#{ 实体属性名 }引用属性值
涉及数据库数据变化,需使用sqlSession对象显示的提交事务


修改

UserMapper配置

<update id="update" parameterType="wsw.Domain.User">
        update newUser set username=#{username},password=#{password} where id=#{id}
</update>

测试代码涉及
在这里插入图片描述
使用update标签


删除
UserMapper配置

<delete id="delete" parameterType="java.lang.Integer">
        delete from newUser where id=#{id}
</delete>

测试代码涉及
在这里插入图片描述
使用delete标签
sql语句使用#{任意字符串}引用传递的单个参数

2 Mybatis核心配置文件

2.1 概述

< configuration >为根标签
包括:
properties 属性
settings 设置
typeAliases 类型别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
···environment 环境变量
·····transactionManager 事务管理器
·····dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器

2.2 environments标签

数据环境配置,支持多环境配置
在这里插入图片描述
事务管理器(transactionManager)类型有两种:
· JDBC:直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域
· MANAGED:该配置几乎不做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,而一些容器不希望如此,因此需将closeConnection属性设置为false来阻止它默认的关闭行为。


数据源(dataSource)类型有三种:
· UNPOOLED:该数据源的实现只是每次被请求时打开和关闭连接(类似原始JDBC操作)
· POOLED:该数据源的实现利用 “ 池 ” 的概念将JDBC连接对象组织起来
· JNDI:该数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可集中或在外部配置数据源,然后放置一个JNDI上下文的引用

2.3 mapper标签

作用:加载映射,方式如下:
· 使用相对于类路径的资源引用,如:< mapper resource=“org/mybatis/builder/UserMapper.xml”/>

· 使用完全限定资源定位符(URL),如:< mapper url=“file:///var/mappers/UserMapper.xml”/>

· 使用映射器接口实现类的完全限定类名,如:< mapper class=“org.mybatis.builder.UserMapper.xml”/>

· 将包内的映射器接口实现全部注册为映射器,如:< package name=“org.mybatis.builder”/>

2.4 properties标签

实际开发中,习惯将数据源配置信息单独抽取成一个properties文件,该标签可加载额外配置的properties文件
在这里插入图片描述

2.5 typeAliases标签

类型别名是为Java类型设置一个短的名字,自定义时使用。
该标签顺序必须在configuration里靠前
在这里插入图片描述

已设置好的常用类型别名如下:
在这里插入图片描述

3 Mybatis相应API

sqlSession工厂构造器SqlSessionFactoryBuilder

常用API:SqlSessionFactory build(InputStream inputStream)
通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
在这里插入图片描述
Resource类在org.apache.ibatis.io中


SqlSession工厂对象SqlSessionFactory
其中,SqlSessionFactory 创建SqlSession实例常用方法:
在这里插入图片描述


SqlSession会话对象
执行语句方法:
在这里插入图片描述
操作事务方法:
在这里插入图片描述

4 Mybatis Dao层实现

4.1 代理开发方式

只需编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象方法体同Dao接口实现类方法
在这里插入图片描述
在这里插入图片描述
通过SqlSession.getMapper获取Mybatis生成的代理对象

UserMapper usermapper = sqlSession.getMapper(UserMapper.class);

5 Mybatis映射文件深入

5.1 动态sql语句

if
choose(when、otherwise)
trim(where、set)
foreach


< if >
根据实体类的不同取值,使用不同SQL语句查询。如:
在这里插入图片描述


< foreach >
在这里插入图片描述
open、close :以…开始、以…结束
item:每项命名
separator:设置分隔符


< sql >
SQL片段抽取
在这里插入图片描述

6 核心配置文件深入

6.1 typeHandlers标签

部分默认类型处理器:
在这里插入图片描述

可重写类型处理器或创建自己的类型处理器以处理不支持的或非标准的类型。
实现org.apache.ibatis.type.TypeHandler接口,或继承一个便利类org.apache.ibatis.type.BaseTypeHandler,然后可选择性地将它映射到一个JDBC类型。

开发步骤:
1 定义转换类继承类BaseTypehandler< T >
在这里插入图片描述
2 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java的Type类型方法
在这里插入图片描述
3 在Mybatis核心配置文件中进行注册
在这里插入图片描述
4 测试


6.2 plugins标签

使用第三方插件
分页助手PageHelper将分页操作进行封装。

开发步骤:
1 导入通用PageHelper的坐标

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>1.2</version>
</dependency>

2 在mybatis核心配置文件中配置PageHelper插件

<!--配置分页助手插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--5以上的版本不需要再配置dialect-->
            <!--<property name="dialect" value="mysql"/>-->
        </plugin>
    </plugins>

3 测试分页数据获取 及分页相关数据获取
在这里插入图片描述

7 Mybatis多表操作

7.1 一对一配置

在这里插入图片描述
其中,uid是外键,对应着User的id
通过< resultMap >手动配置外键的映射关系
在这里插入图片描述

7.2 一对多配置

查询用户的订单
在这里插入图片描述
在这里插入图片描述

7.3 多对多配置

在这里插入图片描述
在这里插入图片描述

7.4 总结

在这里插入图片描述

8 Mybatis注解开发

8.1 常用注解

@Insert:新增
@Update:更新
@Delete:删除
@Select:查询
@Result:结果集封装
@Results:可与@Result一起使用,封装多个结果集
@One:一对一结果集封装
@Many:一对多结果集封装

8.2 注解完成增删改查

mapper配置注解
在这里插入图片描述
在核心配置文件中,加载映射关系
在这里插入图片描述

8.3 注解完成复杂映射

在这里插入图片描述
一对一
方式一
在这里插入图片描述
方式二
在这里插入图片描述
一对多
OrderMapper
在这里插入图片描述
UserMapper
在这里插入图片描述
多对多
RoleMapper
在这里插入图片描述
UserMapper
在这里插入图片描述

9 Mybatis-Plus

9.1 简介

MyBatis-Plus(MP)是Mybatis增强工具,在Mybatis基础上只做增强。

只需简单配置,即可快速进行CRUD操作。

具有热加载、代码生成、分页、性能分析等功能。

官网地址

特性
在这里插入图片描述
在这里插入图片描述

pom.xml导入代码:

<dependencies>
    <!-- mybatis-plus插件依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.1.1</version>
    </dependency>
    <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!-- 连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
        <!--简化bean代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
    </dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
			</plugin>
		</plugins>
	</build>

9.2 整合Mybatis-Plus

若是用最新版本的plus需要额外导入mybatis-plus-boot-starter或者mybatisplus-spring-boot-starter不然会报NoClassDefFoundErro

步骤:
实体类加入@Data、@NoArgsConstructor、@AllArgsConstructor三个注解后,不需要再写get、set方法等
在这里插入图片描述

一、将UserMapper继承BaseMapper
在这里插入图片描述

二、使用Mybatis-Plus中的MybatisSqlSessionFactoryBuilder进程构建
在这里插入图片描述
Spring整合时,除了上述的步骤外,还需在配置文件中改:
在这里插入图片描述

springBoot整合mybatis-plus

步骤一:导入坐标

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>
 
 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--简化代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

步骤二:创建配置文件、实体类、对应的mapper接口(继承BaseMapper)
在这里插入图片描述
在这里插入图片描述

步骤三:创建springboot启动类
在这里插入图片描述
步骤四:测试
在这里插入图片描述

9.3 通用CRUD

插入操作:
在这里插入图片描述
在实体类id处需加入一个注解为@TableId,将id设置为自增长,同时数据库表内的自增值需要更改一下

在这里插入图片描述

@TableField

通过该注解可指定字段的一些属性,常解决问题:
1、对象中属性名与字段名不一致问题(非驼峰)
在这里插入图片描述

2、对象中的属性字段在表中不存在的问题
在这里插入图片描述
通过exist属性使该字段被忽略掉

此外,通过@TableField(select = false) 使指定字段在查询时不被返回
在这里插入图片描述

更新

1、根据id更新
传入一个实体参数
在这里插入图片描述

2、根据条件更新
在这里插入图片描述
通过Wrapper两个实现类 QueryWrapper、UpdateWrapper设置条件
在这里插入图片描述

在这里插入图片描述

删除

1、根据id删除
在这里插入图片描述
2、根据map删除
在这里插入图片描述
在这里插入图片描述

3、根据条件删除
在这里插入图片描述

4、根据id批量删除
在这里插入图片描述
在这里插入图片描述
当根据查询条件 查出数据超出一条时会报错

5、根据条件查询总记录数
返回查询条数
在这里插入图片描述

6、根据条件查询所有数据
在这里插入图片描述

7、根据条件查询所有数据(翻页)

先编写配置类MybatisPlusConfig

@Configuration
@MapperScan("wsw.Mapper") //设置mapper接口的扫描包
public class MybatisPlusConfig {

    @Bean //配置分页插件
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

测试类编写
在这里插入图片描述

9.4 Mybatis-Plus配置

9.4.1 SQL注入原理

首先MP中,ISqlInjector负责SQL的注入工作,它是一个接口,AbstractSqlInjector是它的实现类
在这里插入图片描述
在AbstractSqlInjector中,是由inspectInject()方法进行注入。其中methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass,
tableInfo));循环遍历方法,进行注入。
在这里插入图片描述
由inject里的injectMappedStatement抽象方法注入。该方法有很多实现类
在这里插入图片描述
在这里插入图片描述
以SelectById为例,生成了SqlSource对象,再将SQL通过addSelectMappedStatement方法添加到meppedStatements中。SqlSource对象包含sql语句
在这里插入图片描述

9.4.2 基本配置

9.4.2.1 configLocation

有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。
SpringBoot:

mybatis-plus.config-location = classpath:mybatis-config.xml

SpringMVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
	<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
9.4.2.2 mapperLocations

MyBatis Mapper 所对应的 XML 文件位置,如果在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置。
在这里插入图片描述

SpringBoot:

mybatis-plus.mapper-locations = classpath*:mybatis/*.xml

SpringMVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
	<property name="mapperLocations" value="classpath*:mybatis/*.xml"/>
</bean>
9.4.2.3 typeAliasesPackage

MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。

SpringBoot:

mybatis-plus.type-aliases-package = cn.itcast.mp.pojo

SpringMVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
	<property name="typeAliasesPackage"
value="com.baomidou.mybatisplus.samples.quickstart.entity"/>
</bean>

9.4.3 进阶配置

9.4.3.1 mapUnderscoreToCamelCase

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。默认值为true
在这里插入图片描述

SpringBoot:

#关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在
mybatis-plus.configuration.map-underscore-to-camel-case=false
9.4.3.2 cacheEnabled

全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。

mybatis-plus.configuration.cache-enabled=false

9.4.4 DB策略配置

9.4.4.1 idType

全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置。
SpringBoot:

mybatis-plus.global-config.db-config.id-type=auto

SpringMVC:

<!--这里使用MP提供的sqlSessionFactory,完成了Spring与MP的整合-->
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="globalConfig">
		<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
			<property name="dbConfig">
				<bean
	class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
					<property name="idType" value="AUTO"/>
				</bean>
			</property>
		</bean>
	</property>
</bean>
9.4.4.2 tablePrefix

表名前缀,全局配置后可省略@TableName()配置。

SpringBoot:

mybatis-plus.global-config.db-config.table-prefix=tb_

SpringMVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="globalConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean
class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<property name="idType" value="AUTO"/>
<property name="tablePrefix" value="tb_"/>
</bean>
</property>
</bean>
</property>
</bean>

9.5 条件构造器

9.5.1 allEq使用

全部eq(或个别isNull)

map集合中所有k(数据库字段名),v(字段值)均为条件

allEq(Map<R, V> params)

map集合中除去k(数据库字段名),v(字段值)为空的,其余为条件

allEq(Map<R, V> params, boolean null2IsNull)

在这里插入图片描述

创建过滤,通过箭头函数

allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.5.2 基本比较操作

eq   等于
ne   不等于
gt   大于
ge   大于等于
lt   小于
le   小于等于
between      在值1与值2
notBetween   不在值1与值2
in       字段在(字段1,字段2,...)
notin    字段不在(字段1,字段2,...)

9.5.3 模糊查询

like   like(“name”,“王”)--> name like ‘%王%’
notLike   notLike(“name”,“王”)--> name not like ‘%王%’
likeLeft   likeLeft(“name”,“王”)--> name like ‘%王’
likeRight   likeRight(“name”,“王”)--> name like ‘王%’

9.5.4 排序查询

orderBy       orderBy(true, true, "id", "name") ---> order by id ASC,name ASC
orderByAsc    orderByAsc("id", "name") ---> order by id ASC,name ASC     正序
orderByDesc   orderByDesc("id", "name") ---> order by id DESC,name DESC  倒序

9.5.5 逻辑查询

or  	主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)
and		and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status
		<> '活着')

9.5.6 指定查询字段

select默认查询所有字段,如有需要则可以进行指定字段

9.6 ActiveRecord

ActiveRecord属于ORM(对象关系映射)层。遵循标准的ORM模型:
表映射到记录,记录映射到对象 ,字段映射到对象属性。

ActiveRecord主要思想:

· 每个数据库表对应创建一个类,类的每个对象实例对应数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;
· ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问;
· ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;

需要将实体对象继承 Model< T >即可

9.6.1 根据主键查询

在实体对象继承Model后,通过new实例化对象,即可操作,对应的UserMapper不可删除

在这里插入图片描述

9.6.2 新增数据

在这里插入图片描述

9.6.3 更新操作

除了可根据id进行更新,还可根据条件进行更新(同前面)
在这里插入图片描述

9.6.4 删除操作

除了可根据id进行删除,还可根据条件进行删除(同前面)
在这里插入图片描述

9.6.5 根据条件查询

在这里插入图片描述

9.7 Oracle 主键Sequence

Oracle数据库不支持自增长,需使用Sequence序列生成id值

1、在Oracle数据库中创建一个序列
在这里插入图片描述
2、版权原因,需将驱动包安装至本地仓库
在这里插入图片描述
3、修改application.properties
在这里插入图片描述
4、配置序列生成器、在实体对象中指定序列名称

在这里插入图片描述
在这里插入图片描述

9.8 Mybatis-Plus插件

9.8.1 mybatis插件机制

Mybatis允许在已映射语句执行过程中的某一点进行拦截调用。
默认情况下,MyBatis允许使用插件来拦截的方法调用包括:
在这里插入图片描述

自定义拦截器:

@Intercepts({@Signature(
        type = Executor.class,//指定拦截类型
        method = "update",//拦截指定方法
        args = {MappedStatement.class,Object.class}
)})
public class MyInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //拦截方法,具体业务逻辑编写位置
        return null;
    }

    @Override
    public Object plugin(Object o) {
        //创建target对象的代理对象,目的将当前拦截器加入到该对象中
        return null;
    }

    @Override
    public void setProperties(Properties properties) {
        //属性设置
    }
}

编写拦截器类进行注入,可通过注解形式
在这里插入图片描述
或xml配置
在这里插入图片描述
其中,plugin方法执行四次,第一次target是Executor执行器,随后进入interceptor方法,再接着,执行第二、三、四次,target依次是ParameterHandler、ResultSetHandler、StatementHandler

9.8.2 执行分析插件

在MP中提供对SQL执行的分析插件,可用作阻断全表更新、删除的操作(仅适用于开发环境)
SpringBoot配置:

@Bean //SQL分析
    public SqlExplainInterceptor sqlExplainInterceptor(){

        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();

        List<ISqlParser> sqlParserList = new ArrayList<>();
        //攻击SQL阻断解析器,加入解析链
        sqlParserList.add(new BlockAttackSqlParser());
        sqlExplainInterceptor.setSqlParserList(sqlParserList);

        return sqlExplainInterceptor;
    }

当执行全表更新或删除时,会阻止
在这里插入图片描述

9.8.3 性能分析插件

用于输出每条SQL语句及执行时间,可设置最大执行时间,超出时间会抛出异常
配置:

@Bean //性能分析插件
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        //最大执行时间,单位为毫秒
        performanceInterceptor.setMaxTime(100);
        //对输出SQL做格式化,,默认false
        performanceInterceptor.setFormat(true);

        return performanceInterceptor;
    }

9.8.4 乐观锁插件

当要更新一条记录时,希望该记录没被他人更新。
乐观锁实现方式:

· 取出记录时,获取当前version
· 更新时,带上该version
· 执行更新时,set version = newVersion where version = oldVersion
· 如果version不对,则更新失败

Spring xml配置:
在这里插入图片描述
SpringBoot配置:
在这里插入图片描述
在实体类上添加version字段,同时数据库表中创建version对应的字段
在这里插入图片描述
特别说明:

· 支持数据类型:int、Integer、long、Long、Date、Timestamp、LocalDateTime
· 整数类型下newVersion = oldVersion + 1
· newVersion会回到entity中
· 仅支持updateById (id) 与 update (entity,wrapper) 方法
· 在 update (entity,wrapper) 方法下,wrapper不能复用

9.9 SQL注入器

在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到Mybatis容器中。
通过自定义SQL注入器来扩展方法
1、编写自定义MyMapper来继承BaseMapper< T >:

public interface MyBaseMapper<T> extends BaseMapper<T> {
    List<T> findAll();
}

2、其它Mapper只需继承MyMapper,可进行统一扩展方法

3、编写MySqlInjector类
如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,需选择继承DefaultSqlInjector进行扩展。

public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList() {
        List<AbstractMethod> list = new ArrayList<>();
        //获取父类中的集合
        list.addAll(super.getMethodList());

        //扩充自定义方法
        list.add(new FindAll());
        return list;
    }
}

4、编写扩展方法的类FindAll

public class FindAll extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "select * from "+tableInfo.getTableName(); //tableInfo动态获取表名

        SqlSource sqlSource = languageDriver.createSqlSource(configuration,sql,modelClass);

        //第二个参数为扩展方法名
        return addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo);
    }
}

5、在SpringBoot中配置注入

//自定义sql注入
    @Bean
    public MySqlInjector mySqlInjector(){
        return new MySqlInjector();
    }

9.10 自动填充

1、添加@TableField注解

@TableField(fill = FieldFill.INSERT)
    private String password;

为password字段设置自动填充,在新增数据时有效

2、编写MyMetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入时自动填充
    @Override
    public void insertFill(MetaObject metaObject) {
        Object password = getFieldValByName("password",metaObject);
        if (password == null){
            setFieldValByName("password","777777",metaObject);
        }

    }

    //更新时自动填充
    @Override
    public void updateFill(MetaObject metaObject) {

    }
}

9.11 逻辑删除

逻辑删除,即,将数据标记为删除,并非真正的物理删除(非Delete操作),查询时需携带状态条件,确保被标记的数据不被查询到

修改实体类,添加deleted属性,添加@TableLogic注解:
在这里插入图片描述
添加配置:

#删除状态的值为:1
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除状态的值为:0
mybatis-plus.global-config.db-config.logic-not-delete-value=0

9.12 通用枚举

定义枚举:

public enum SexEnum implements IEnum<Integer> {
    MAN(1,"男"),
    WOMAN(2,"女");

    private int value;
    private String desc;
    SexEnum(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
    @Override
    public Integer getValue() {
        return this.value;
    }
    @Override
    public String toString() {
        return this.desc;
    }

}

添加配置:

#枚举包配置
mybatis-plus.type-enums-package=wsw.Enum

实体类中添加枚举属性:
在这里插入图片描述
添加、查询均有效,实现数字与字段的对应

9.13 代码生成器

AutoGenerator是Mybatis-Plus的代码生成器。可快速生成Entity、Mapper、MapperXML、Service、Controller等代码

pom.xml导入坐标:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>Generator</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

    </build>

</project>

代码:

package wsw;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

public class generator {
    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }throw new MybatisPlusException("请输入正确的" + tip + "!");
    }


    /**
     * RUN THIS
     */
    public static void main(String[] args) {
// 代码生成器
        AutoGenerator mpg = new AutoGenerator();
// 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("wsw");
        gc.setOpen(false);
        mpg.setGlobalConfig(gc);
// 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
                dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);
// 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("wsw");
        mpg.setPackageInfo(pc);
// 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
// to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
                return projectPath + "/Generator/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" +
                        StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));
// 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//
        strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.wsw.generator.common.BaseEntity");
                strategy.setEntityLombokModel(true);
//
        strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.wsw.generator.common.BaseController");
                strategy.setInclude(scanner("表名"));
        strategy.setSuperEntityColumns("id");
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

9.14 MybatisX快速开发插件

在settings中plugins安装
功能:

1 java与xml回调跳转
2 Mapper自动生成xml
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swing_zzZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值