MybatisPlus(一)快速入门

视频课程地址:黑马商城项目

下一节:MybatisPlus(二)核心功能01 — 条件构造器
本节学习MybatisPlus(MP)的基本使用流程:

  1. 引入起步依赖
  2. 自定义Mapper继承BaseMapper
  3. 在实体类上添加注解声明 表信息
  4. 在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

版权声明:本文《MybatisPlus(一)快速入门》是由陶其原创撰写,首发于陶其的个人博客
转载声明:如需转载本文,请务必在转载处保留原文链接:https://www.tqazy.com/?p=1459,并明确注明文章来源。
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇