视频课程地址:黑马商城项目
下一节:MybatisPlus(二)核心功能01 — 条件构造器
本节学习MybatisPlus(MP)的基本使用流程:
- 引入起步依赖
- 自定义Mapper继承BaseMapper
- 在实体类上添加注解声明 表信息
- 在application.yml中根据需要添加配置
MybatisPlus官网:https://baomidou.com
一、使用MybatisPlus流程
1.1 引入起步依赖
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>
1.2 定义Mapper
自定义的Mapper继承MybatisPlus提供的BaseMapper接口:
public interface UserMapper extends BaseMapper<User> {
}
BaseMapper接口新增了很多CRUD的接口:
1.3 替换Mybatis案例
1.3.1 使用Mybatis的写法
1、UserMapper.java
package com.itheima.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
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);
}
2、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="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 user
WHERE 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>
3、测试
@Test
void testQueryByIds() {
List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));
users.forEach(System.out::println);
}
运行结果:
1.3.2 使用MybatisPlus的写法
1、UserMapper.java
package com.itheima.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.mp.domain.po.User;
public interface UserMapper extends BaseMapper<User> {
}
2、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="com.itheima.mp.mapper.UserMapper">
</mapper>
3、测试
@Test
void testQueryByIds() {
List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));
users.forEach(System.out::println);
}
运行结果:
运行结果相同。
二、常用注解
2.1 MyBatisPlus实现CRUD的原理
MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
命名原则(约定大于配置):
- 类名驼峰转下划线作为表名
- 名为id的字段作为主键
- 变量名驼峰转下划线作为表的字段名
2.2 常见注解
MybatisPlus中比较常用的几个注解如下:
@TableName
:用来指定表名@TableId
:用来指定表中的主键字段信息@TableField
:用来指定表中的普通字段信息
2.2.1 @TableName
用于给类指定表名。
用法:
@TableName("tb_user")
public class User {
}
2.2.2 @TableId
使用方法:
@TableId("id")
private Long userId;
或者:
@TableId(value="id", type=IdType.AUTO)
private Long userId;
IdType
枚举:
AUTO
:数据库自增长INPUT
:通过set方法自行输入ASSIGN_ID
:分配ID。(默认值)- 接口
IdentifierGenerator
的方法nextId
来生成id
,默认实现类为DefaultIdentifierGenerator
雪花算法
- 接口
2.2.3 @TableField
使用@TableField的常见场景:
成员变量名与数据库字段名不一致
@TableField("username") private String name;
成员变量名以is开头,且是布尔值。这种情况不处理,MP会自动去掉is
@TableField("is_married") private Boolean isMarried;
成员变量名与数据库关键字冲突。这种情况不处理,执行SQL时数据库会报错
@TableField("`
order
`") private Integer order;
成员变量不是数据库字段。这种情况不处理,MP会识别错误
@TableField(exist = false) private String address;
2.2.4 示例
如果实体(Java的类)字段名与表(MySQL)的列名不符合上面的命名原则,则使用这个注解进行辅助。
例如:
若数据表如下:
但是Java类却是如下:
public class User {
private Long userId;
private String name;
private Boolean isMarried;
private Integer order;
private String address;
}
那么就需要使用这些注解进行辅助了:
@TableName("tb_user")
public class User {
@TableId(value="id", type=IdType.AUTO)
private Long userId;
@TableField("username")
private String name;
@TableField("is_married")
private Boolean isMarried;
@TableField("`order`")
private Integer order;
@TableField(exist = false)
private String address;
}
三、常用配置
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。
例如:(用于application.yml或被其引用的yml中)
mybatis-plus:
type-aliases-package: com.itheima.mp.domain.po # 别名扫描包
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值
configuration:
map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射
cache-enabled: false # 是否开启二级缓存
global-config: # (MP特有)全局配置
db-config: # 数据库配置
id-type: assign_id # id为雪花算法生成,还可以:auto
update-strategy: not_null # 更新策略:只更新非空字段
具体可参考官方文档:使用配置 | MyBatis-Plus