系列博客目录
文章目录
- 系列博客目录
- MybatisPlus介绍
- 快速入门
- Part1:入门案例
- Part1.1:MyBatis项目
- Part1.2:实现MP
- Part2:常见注解
- Part2.1:约定
- Part2.2:常见注解
- Part3:常见配置
- MyBatisPlus使用的基本流程是什么?
MybatisPlus介绍
在Mybatis上加了Plus,表示对Mybatis的加强和升级,但他不是来替代Mybatis的。MyBatisPlus想成为Mybtis最佳的合作伙伴。下面蓝色是Plus。
官网链接
为了简化开发而生。
- 润物无声,只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。表明引入MyBatisPlus,对现有工程产生影响,之前针对Mybatis的代码可以照常运行,在开发新功能时候可以使用MyBatisPlus,或者对之前功能进行改造,都可以。
- 效率至上,只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间。因为我们大多数业务都是单表CRUD。直接调用MyBatisPlus的方法,就可以了,少写了很多代码,效率提高。其实不止有单表。还有很多丰富的功能。
- 丰富功能,代码生成、自动分页、逻辑删除、自动填充、拦截器等功能一应俱全。
点击快速开始
后可以查看MyBatisPlus的功能。后面分为四部分进行学习。(现在的官网分类有所改变,但内容总量没变)
- 快速入门
- 核心功能
- 扩展功能
- 插件功能
快速入门
Part1:入门案例
学会MP的基本用法、体会MP的无侵入和方便快捷的特点
需求:基于课前资料提供的项目,实现下列功能:
- 新增用户功能
- 根据id查询用户
- 根据id批量查询用户
- 根据id更新用户
- 根据id删除用户
Part1.1:MyBatis项目
只需要学习对原有代码(未使用MP的代码)的改造,所以先打开提供的项目代码,并执行sql语句。
项目中resources是一些配置,主要的Java代码主要有User实体类,启动类通过注释@MapperScan("com.itheima.mp.mapper")
,定义了mapper扫描包,扫描到Mapper接口才会生效。之后增删改查需要定义到mapper接口中。
之前的没有MP时,我们需要在UserMapper写好接口,然后在UserMapper.xml中写好MyBatis语句,相当麻烦。
package com.itheima.mp.mapper;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper{void saveUser(User user);void deleteUser(Long id);void updateUser(User user);User queryUserById(@Param("id") Long id);List<User> queryUserByIds(@Param("ids") List<Long> ids);
}
<?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="com.itheima.mp.mapper.UserMapper"><insert id="saveUser" parameterType="com.itheima.mp.domain.po.User">INSERT INTO `user` (`id`, `username`, `password`, `phone`, `info`, `balance`)VALUES(#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});</insert><update id="updateUser" parameterType="com.itheima.mp.domain.po.User">UPDATE `user`<set><if test="username != null">`username`=#{username}</if><if test="password != null">`password`=#{password}</if><if test="phone != null">`phone`=#{phone}</if><if test="info != null">`info`=#{info}</if><if test="status != null">`status`=#{status}</if><if test="balance != null">`balance`=#{balance}</if></set>WHERE `id`=#{id};</update><delete id="deleteUser" parameterType="com.itheima.mp.domain.po.User">DELETE FROM user WHERE id = #{id}</delete><select id="queryUserById" resultType="com.itheima.mp.domain.po.User">SELECT *FROM userWHERE id = #{id}</select><select id="queryUserByIds" resultType="com.itheima.mp.domain.po.User">SELECT *FROM user<if test="ids != null">WHERE id IN<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach></if>LIMIT 10</select>
</mapper>
Part1.2:实现MP
- 引入MybatisPlus的起步依赖
MyBatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。
因此我们可以用MybatisPlus的starter代替Mybatis的starter:
<!--MybatisPlus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>
实操如下图所示:
- 定义Mapper
自定义的Mapper继承MybatisPlus提供的BaseMapper接口,接口中有许多定义好的接口,如下图所示。我们不想自己写代码,就通过继承。认个爹。
public interface UserMapper extends BaseMapper<User>//注意泛型 需要是定义好的实体类 才知道增删改查操作哪个实体
实操结果如下:
但这里需要注意,你这里的这个接口中有自己定义的queryUserById,我们进行测试的时候还是会用自己写的代码,因为MP是无侵入的。
@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid testSelectById() {User user = userMapper.queryUserById(5L);System.out.println("user = " + user);}
}
完全可以删除自己写的这部分代码,之后通过在定义了一个 UserMapper
类型的成员变量后面加.
实现代码自动补全(Code Completion)来调用MP给我们定义的函数。(query变为了select)
这个时候我们针对数据库增删改查的一行代码都没写,只写了测试代码和实体类就可以实现增删改查。实现了润物无声和效率之上。那MP怎么知道我要访问哪张表,修改表中哪些字段呢?
Part2:常见注解
MP怎么知道我要访问哪张表?表中有哪些信息?修改表中哪些字段呢?
一句话概括:MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
public interface UserMapper extends BaseMapper<User>{
}
Part2.1:约定
实体类中有很多信息,哪些作为表的信息呢?这里有很多约定。约定大于配置
- 类名驼峰转下划线作为表名
- 名为id的字段作为主键
- 变量名驼峰转下划线作为表的字段名
如果实体类不符合约定怎么办呢,必须自己定义表名,主键,字段名,怎样定义呢?注解
Part2.2:常见注解
官网相关内容链接
MybatisPlus中比较常用的几个注解如下
-
@TableName:用来指定表名。举例:比如表名叫
tb_user
,类名叫User
,那我们在定义的类上面加注解@TableName("tb_user")
-
@Tableld:用来指定表中的主键字段信息。类似上面,在类的想要指定为主键的属性上加上
@TableId("id" )
主键是有特殊地方的。数据库中主键是有自己的生成方式的。比如一般会是自增长:AUTO_INCREMENT
。这时候我们需要@TableId(value="id",type= 选择一种IdType)
IdType枚举:AUTO
:数据库自增长。INPUT
:通过set方法由程序员来自行输。ASSIGN_ID
:分配lD,接口ldentifierGenerator的方法nextld来生成id,其默认实现类为DefaultldentifierGenerator雪花算法。 上面都可以不加id
,那就默认为指定数据库中id为主键,比如直接@TableId
或者@TableId(type= 选择一种IdType)
。如果不加id类型默认为ASSIGN_ID
。 -
@TableField:用来指定表中的普通字段信息。举例如下:
使用@TableField的常见场景
- 成员变量名与数据库字段名不一致
- 成员变量名以is开头,且是布尔值
- 成员变量名与数据库关键字冲突
- 成员变量不是数据库字段
Part3:常见配置
官网配置相关链接、每一项的默认值等都写得很清楚
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。例如
常见配置配置在application.yaml
中。
mybatis-plus:type-aliases-package:com.itheima.mp.domain.po # 别名扫描包 生成的别名通常是类名的小写形式 # 在 XML 映射文件中使用时,你可以直接使用类的简短名称,而不必写全类名。mapper-locations:"classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值 # 为何我用了MP了还需要指定sql所在的xml文件呢,是因为MP一般只针对单表,多表还是要我们自己写sql语句。configuration:map-underscore-to-camel-case:true #是否开启下划线和驼峰的跌射cacheenabled:false#是否开启级缓存global-config: # 全局配置 优先级不如注解 如果注解没配置 就会走全局db-config: # 针对数据库方面的配置 全局还可以配置一些数据库无关的配置项。这些配置项主要涉及 MyBatis-Plus 的行为、插件、性能分析等id-type:assign_id # id为雪花算法生成update-strategy:not_null #更新策略:只更新非空字段 在update时候很有用,对于没有赋新值的属性,我们不进行更新。
MyBatisPlus使用的基本流程是什么?
- 引入起步依赖
- 自定义Mapper基础BaseMapper
- 在实体类上添加注解声明 表信息
- 在application.yml中根据需要添加配置