MyBatisPlus详解(一)项目搭建、@TableName、@TableId、@TableField注解与常见配置

news2024/12/30 0:51:00

文章目录

  • 前言
  • 1 快速入门
    • 1.1 环境准备
      • 1.1.1 新建数据库
      • 1.1.2 创建项目
    • 1.2 快速开始
      • 1.2.1 引入MyBatisPlus依赖
      • 1.2.2 定义Mapper
      • 1.2.3 配置实体类和表的关系
      • 1.2.4 简单测试
        • 1.2.4.1 测试插入操作
        • 1.2.4.2 测试查询操作
        • 1.2.4.3 测试更新操作
        • 1.2.4.4 测试删除操作
    • 1.3 常见注解
      • 1.3.1 @TableName
      • 1.3.2 @TableId
      • 1.3.3 @TableField
    • 1.4 常见配置

前言

为了简化或省略单表的CRUD开发工作,国内使用较多的一个组件是MyBatisPlus。

其官网地址是:https://baomidou.com/

MyBatisPlus不仅可以简化单表操作,还对MyBatis的功能有很多的增强,可以让开发更加简单、高效。

1 快速入门

1.1 环境准备

1.1.1 新建数据库

在MySQL中创建一个新的数据库mybatis_plus_db:

CREATE DATABASE mybatis_plus_db;
USE mybatis_plus_db;

创建一张新表t_address并添加一些数据:

-- 创建t_address
CREATE TABLE `t_address` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT COMMENT '用户ID',
  `province` VARCHAR(10) COMMENT '省',
  `city` VARCHAR(10) COMMENT '市',
  `town` VARCHAR(10) COMMENT '县/区',
  `mobile` VARCHAR(255) COMMENT '手机',
  `street` VARCHAR(255) COMMENT '详细地址',
  `contact` VARCHAR(255) COMMENT '联系人',
  `is_default` BIT(1) DEFAULT b'0' COMMENT '是否是默认 1默认 0否',
  `notes` VARCHAR(255) COMMENT '备注',
  `deleted` BIT(1) DEFAULT b'0' COMMENT '逻辑删除',
  KEY `user_id` (`user_id`) USING BTREE
);

-- 初始化t_address数据
INSERT INTO `t_address` (`user_id`, `province`, `city`, `town`, `mobile`, `street`, `contact`, `is_default`, `notes`, `deleted`) VALUES
	(2, '北京', '北京', '朝阳区', '13900112222', '金燕龙办公楼', 'Rose', b'1', NULL, b'0'),
	(1, '北京', '北京', '朝阳区', '13700221122', '修正大厦', 'Jack', b'0', NULL, b'0'),
	(1, '上海', '上海', '浦东新区', '13301212233', '航头镇航头路', 'Jack', b'1', NULL, b'0'),
	(2, '广东', '佛山', '永春', '13301212233', '永春武馆', 'Rose', b'0', NULL, b'0'),
	(3, '浙江', '杭州', '拱墅区', '13567809102', '浙江大学', 'Hope', b'1', NULL, b'0'),
	(3, '浙江', '杭州', '拱墅区', '13967589201', '左岸花园', 'Hope', b'0', NULL, b'0'),
	(4, '湖北', '武汉', '汉口', '13967519202', '天天花园', 'Thomas', b'1', NULL, b'0'),
	(3, '浙江', '杭州', '拱墅区', '13967589201', '左岸花园', 'Hopey', b'0', NULL, b'0'),
	(4, '湖北', '武汉', '汉口', '13967519202', '天天花园', 'Thomas', b'1', NULL, b'0'),
	(3, '浙江', '杭州', '拱墅区', '13967589201', '左岸花园', 'Hopey', b'0', NULL, b'0'),
	(4, '湖北', '武汉', '汉口', '13967519202', '天天花园', 'Thomas', b'1', NULL, b'0');

再创建一张新表t_user并添加一些数据:

-- 创建t_user
CREATE TABLE `t_user` (
	`id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户id',
	`username` VARCHAR(50) NOT NULL COMMENT '用户名',
	`password` VARCHAR(128) NOT NULL COMMENT '密码',
	`phone` VARCHAR(20) COMMENT '注册手机号',
	`info` VARCHAR(200) NOT NULL COMMENT '详细信息',
	`status` INT(10) NOT NULL DEFAULT 1 COMMENT '使用状态(1正常 2冻结)',
	`balance` INT(10) COMMENT '账户余额',
	`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	UNIQUE INDEX `username` (`username`) USING BTREE
) COMMENT='用户表';

-- 导入t_user数据
INSERT INTO `t_user` (`username`, `password`, `phone`, `info`, `status`, `balance`) VALUES
	('Jack', '123', '13900112224', '{"age": 20, "intro": "佛系青年", "gender": "male"}', 1, 1600),
	('Rose', '123', '13900112223', '{"age": 19, "intro": "青涩少女", "gender": "female"}', 1, 600),
	('Hope', '123', '13900112222', '{"age": 25, "intro": "上进青年", "gender": "male"}', 1, 100000),
	('Thomas', '123', '17701265258', '{"age": 29, "intro": "伏地魔", "gender": "male"}', 1, 800);

1.1.2 创建项目

创建一个SpringBoot项目,项目结构如下图所示:

代码下载地址:https://gitee.com/weidag/mybatis_plus_learning.git

1.2 快速开始

1.2.1 引入MyBatisPlus依赖

MybatisPlus提供了starter,实现了Mybatis以及MybatisPlus的自动装配功能:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

由于这个starter已经包含了对mybatis的自动装配,因此可以替换掉Mybatis的starter。

最终的项目依赖如下:

<!--pom.xml-->

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.11</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

1.2.2 定义Mapper

为了简化单表CRUD,MyBatisPlus提供了一个基础的BaseMapper接口,其中已经实现了单表的CRUD:

因此,当自定义的Mapper接口继承该基础的BaseMapper接口,就无需再自己定义单表的CRUD了,如下:

// com.star.learning.mapper.UserMapper

public interface UserMapper extends BaseMapper<User> {}

1.2.3 配置实体类和表的关系

修改User类,使用@TableName、@TableId、@TableField等注解将User类和表t_user关联起来。如下:

// com.star.learning.pojo.User

@Data
@TableName("t_user")
public class User {

    /**
     * 用户id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 注册手机号
     */
    private String phone;

    /**
     * 详细信息
     */
    private String info;

    /**
     * 使用状态(1正常 2冻结)
     */
    private Integer status;

    /**
     * 账户余额
     */
    private Integer balance;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

}

默认情况下,MybatisPlus会根据实体的信息自动推断出表的信息,从而生成SQL。

一般遵循以下原则:

  • MybatisPlus会把实体的类名驼峰转下划线作为表名;
  • MybatisPlus会把实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型,例如变量名createTime会转换为表的字段名create_time。
  • MybatisPlus会把变量名为id的字段作为主键

因此,当实体和表都符合这些原则时,也不再需要配置@TableName、@TableId、@TableField等注解,只是现实场景中不一定符合,例如User类和t_user表就是不符合默认规则,所以还是需要这些注解来进行处理。

1.2.4 简单测试

1.2.4.1 测试插入操作
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyBatisPlusApp .class)
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        User user = new User();
        user.setUsername("Lucy");
        user.setPassword("123");
        user.setPhone("18688990011");
        user.setBalance(200);
        user.setInfo("{\"age\": 24, \"intro\": \"英语老师\", \"gender\": \"female\"}");
        userMapper.insert(user);
    }
}

执行该单元测试,控制台打印出该操作的SQL语句:

==>  Preparing: INSERT INTO t_user ( username, password, phone, info, balance ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: Lucy(String), 123(String), 18688990011(String), {"age": 24, "intro": "英语老师", "gender": "female"}(String), 200(Integer)
<==    Updates: 1
1.2.4.2 测试查询操作
@Test
public void testSelectById() {
    // 根据单个ID查询
    User user = userMapper.selectById(4);
    System.out.println("user = " + user);
    // 根据多个ID查询
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
    users.forEach(System.out::println);
}

执行该单元测试,控制台打印出该操作的SQL语句及查询结果:

// 根据单个ID查询
==>  Preparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM t_user WHERE id=?
==> Parameters: 4(Integer)
<==      Total: 1
user = User(id=4, username=Thomas, password=123, phone=17701265258, info={"age": 29, "intro": "伏地魔", "gender": "male"}, status=1, balance=800, createTime=2024-04-21T10:13:35, updateTime=2024-04-21T10:14:59)
// 根据多个ID查询
==>  Preparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM t_user WHERE id IN ( ? , ? , ? )
==> Parameters: 1(Integer), 2(Integer), 3(Integer)
<==      Total: 3
User(id=1, username=Jack, password=123, phone=13900112224, info={"age": 20, "intro": "佛系青年", "gender": "male"}, status=1, balance=1600, createTime=2024-04-21T10:13:35, updateTime=2024-04-21T10:14:52)
User(id=2, username=Rose, password=123, phone=13900112223, info={"age": 19, "intro": "青涩少女", "gender": "female"}, status=1, balance=600, createTime=2024-04-21T10:13:35, updateTime=2024-04-21T10:14:54)
User(id=3, username=Hope, password=123, phone=13900112222, info={"age": 25, "intro": "上进青年", "gender": "male"}, status=1, balance=100000, createTime=2024-04-21T10:13:35, updateTime=2024-04-21T10:14:57)
1.2.4.3 测试更新操作
@Test
public void testUpdateById() {
    User user = new User();
    user.setId(3L);
    user.setBalance(20000);
    userMapper.updateById(user);
}

执行该单元测试,控制台打印出该操作的SQL语句:

==>  Preparing: UPDATE t_user SET balance=? WHERE id=?
==> Parameters: 20000(Integer), 3(Long)
<==    Updates: 1
1.2.4.4 测试删除操作
@Test
public void testDelete() {
    userMapper.deleteById(1L);
}

执行该单元测试,控制台打印出该操作的SQL语句:

==>  Preparing: DELETE FROM t_user WHERE id=?
==> Parameters: 1(Long)
<==    Updates: 1

1.3 常见注解

1.3.1 @TableName

该注解是一个表名注解,用于标识实体类对应的表,如下例中就代表实体类User对应的表是t_user:

// com.star.learning.pojo.User

@TableName("t_user")
public class User {...}

除了指定表名以外,TableName注解还可以指定很多其它属性:

1.3.2 @TableId

该注解是一个主键注解,用于标识实体类中的主键字段,如下例中就代表实体类User的主键字段是id,其对应的表字段也是id:

// com.star.learning.pojo.User

/**
 * 用户id
 * value - 主键字段名
 * type - 指定主键类型,默认值IdType.NONE
 */
@TableId(value = "id", type = IdType.AUTO)
private Long id;

IdType支持的类型有:

1.3.3 @TableField

该注解是一个普通字段注解,用于标识实体类中的普通字段,例如:

// com.star.learning.pojo.User

/**
 * 用户名
 */
@TableField("username")
private String username;

一般情况下,并不需要给字段添加@TableField注解,MyBatisPlus会根据驼峰转下划线的原则自动匹配。但有一些特殊情况除外:

  • 成员变量名与数据库字段名不符合驼峰转下划线原则;
  • 成员变量是以isXXX命名,MybatisPlus识别字段时会把is去除,而导致与数据库字段不符;
  • 成员变量名与数据库一致,但是与数据库的关键字冲突。此时需要使用@TableField注解给字段名添加转义字符:``。

@TableField注解支持的属性有:

1.4 常见配置

MybatisPlus支持基于yaml文件的自定义配置,详见官方文档:https://www.baomidou.com/pages/56bac0/#基本配置

大多数的配置都有默认值,因此都无需配置。但还有一些是没有默认值的,例如:

# src\main\resources\application.yaml

mybatis-plus:
  # 实体类的别名扫描包
  type-aliases-package: com.star.learning.pojo
  # 全局ID类型
  global-config:
    db-config:
      id-type: auto

同时,MyBatisPlus也支持MyBatis本身的写法去手写SQL的,而mapper文件的读取地址可以自己配置:

# src\main\resources\application.yaml

mybatis-plus:
  # Mapper.xml文件的路径,当前配的是默认值
  mapper-locations: classpath*:/mapper/**/*.xml

例如,在resources目录下创建一个mapper/UserMapper.xml文件,并手写SQL:

<!--src\main\resources\mapper\UserMapper.xml-->

<mapper namespace="com.star.learning.mapper.UserMapper">
    <!--自定义的根据ID查询用户信息-->
    <select id="customQueryUserById" resultType="com.star.learning.pojo.User">
        SELECT *
        FROM t_user
        WHERE id = #{id}
    </select>
</mapper>

然后在UserMapper接口中定义这个customQueryUserById()方法:

// com.star.learning.mapper.UserMapper

public interface UserMapper extends BaseMapper<User> {
    /**
     * 自定义的根据ID查询用户信息
     */
    User customQueryUserById(Long id);
}

最后编写一个单元测试:

@Test
public void testCustomSelectById() {
    // 根据单个ID查询
    User user = userMapper.customQueryUserById(3L);
    System.out.println("user = " + user);
}

执行该单元测试,控制台打印出该操作的SQL语句及查询结果:

==>  Preparing: SELECT * FROM t_user WHERE id = ?
==> Parameters: 3(Long)
<==      Total: 1
user = User(id=3, username=Hope, password=123, phone=13900112222, info={"age": 25, "intro": "上进青年", "gender": "male"}, status=1, balance=20000, createTime=2024-04-21T10:13:35, updateTime=2024-04-21T11:12:48)

本节完,更多内容请查阅分类专栏:MyBatisPlus详解

本文涉及代码下载地址:https://gitee.com/weidag/mybatis_plus_learning.git

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析(已完结)
  • MyBatis3源码深度解析(已完结)
  • Redis从入门到精通(已完结)
  • 再探Java为面试赋能(持续更新中…)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins服务器IP更换,Jenkins URL地址更换

服务器的网络地址发生变动&#xff0c;修改jenkins服务器IP地址后&#xff0c;jenkins网页能够打开&#xff0c;但是job中的配置钩子没有自动改变&#xff0c;如图所示&#xff1a; 经过查询资料了解&#xff0c;需要修改jenkins本地化配置地址才可以显示正确&#xff1a; 1、…

独立样本t检验——python完整代码(直接运行就行)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Author : 三十二画生JH # Contact : fjhstudent163.com # Software: PyCharm # Time : 2024/4/21 21:49 # Site : 网址 # File : t_test.py # Version : # ---功能描述 """ 对实验数据做独立样本&am…

【GoWeb框架初探————XORM篇】

1. XORM xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 1.1 特性 支持 Struct 和数据库表之间的灵活映射&#xff0c;并支持自动同步事务支持同时支持原始SQL语句和ORM操作的混合执行使用连写来简化调用支持使用ID, In, Where, Limit, Join, Havi…

日期相关的题目

日期相关的题目 1. 计算日期到天数转换2. 日期累加3. 打印日期4. 日期差值 1. 计算日期到天数转换 输出示例: 思路&#xff1a;计算前n-1个月的天数在加上这个月的天数。 #include <iostream> using namespace std;int main() {int year, month, day;cin >> yea…

【JavaEE初阶】网络原理|认识协议|协议分层|TCP/IP模型|封装和分用

一、认识协议 1.概念 简单来说&#xff1a;就是一种通信双方&#xff0c;对于通信规则的约定&#xff08;标准&#xff09;&#xff0c;一定是通信双方都认可的 但是这个协议不一定是认可面非常广的&#xff0c;即使是两个人之间的也可叫做协议 就好⽐⻅⽹友&#xff0c;彼此…

Vuex 的原理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store” 基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 ( state )。 Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的…

ansible执行mysql脚本

目录 概述实践环境要求ansible yml脚本命令离线包 概述 ansible执行mysql脚本 实践 官网文档 环境要求 环境需要安装以下内容: 1.mysql客户端(安装了mysql即会有)2.安装MySQL-python (Python 2.X) 详细插件安装链接 ansible yml脚本 关键代码如下&#xff1a; # 剧本…

Pytorch学习路程 2:神经网络分类与实战

目录 神经网络分类 下载数据集 加载数据集 定义损失函数 创建模型 使用DataSet和DataLoader化简我们的数据封装 使用Pytorch神经网络进行气温预测 使用到的包&#xff1a; 构建网络模型 Reference 神经网络分类 我们以最为经典的MNIST数据集为例子&#xff0c;识别手…

GO环境及入门案例

文章目录 简介一、win GO开发环境安装二、Linux go运行环境二、GO代码入门2.1 导包案例2.2 赋值2.3 变量、函数2.4 三方库使用 简介 go不是面向对象语言&#xff0c; 其指针、结构体等比较像C&#xff0c;知名的go 开源项目有docker k8s prometheus node-exporter等 一、win …

FPGA - ZYNQ Cache一致性问题

什么是Cache&#xff1f; Cache是一种用来提高计算机运行速度的一种技术。它是一种小而快的存储设备&#xff0c;位于CPU与内存之间&#xff0c;用于平衡高速设备与低速设备之间的速度差异。Cache可以存储常用的数据或指令&#xff0c;以便CPU更快地获取&#xff0c;从而减少对…

2023年美国西岸行 - Day 1

本来旅行回来就像记录的&#xff0c;结果一拖就是快1年。当然中间原先记录的博客平台关闭也有部分原因&#xff0c;但不是主要原因。趁着今天复活20年前的CSDN博客&#xff0c;赶紧记录一下。 疫情之后第一次全家长途旅行。这次美国之行&#xff0c;在3-4月份订机票的时候跟临…

今日刷三题(day4):简写单词+dd爱框框+除2!

题目一&#xff1a;简写单词 题目描述&#xff1a; 比如 “College English Test”可以简写成“CET”&#xff0c;“Computer Science”可以简写为“CS”&#xff0c;“I am Bob”简写为“IAB” 输入输出描述&#xff1a; 输入&#xff1a;一个复合单词 输出&#xff1a;输…

一文读懂自动化运维工具ansible及其使用

1. ansible简介 ansible是干什么的 ansible是目前最受运维欢迎的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;SaltStack puppet、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令…

java高校办公室行政事务管理系统设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于mvc的高校办公室行政…

基于SpringBoot + Vue实现的奖学金管理系统设计与实现+毕业论文+答辩PPT

介绍 角色:管理员、学院负责人、学校负责人、学生 管理员:管理员登录进入高校奖助学金系统的实现可以查看系统首页、个人中心、学生管理、学院负责人管理、学校负责人管理、奖学金类型管理、奖学金申请管理、申请提交管理、系统管理等信息 学院负责人:学院负责人登录系统后&am…

排序 “叁” 之交换排序

目录 1. 基本思想 2.冒泡排序 2.1 基本思想 2.2 代码示例 2.3 冒泡排序的特性总结 3.快速排序 3.1 基本思想 &#x1f335;hoare版本 &#x1f335;挖坑法 ​编辑 &#x1f335;前后指针版本 ​编辑 3.2 快速排序优化 &#x1f33b;三数取中法选key 3.4 快速排序…

systemverilog中位的选择

常用的变量类型就是 reg 和 wire &#xff0c;这两种类型可以定义 一位的变量&#xff0c;也可以定义多位&#xff0c;其中 1 bit 的变量称为 标量(scalar)&#xff0c;多 bit 的变量称为 向量(vector)&#xff0c;如下所示&#xff1a; wire o_nor; // singl…

【JavaWeb】Day51.Mybatis动态SQL

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

Web前端框架/库/工具

前言 前端从步枪&#xff08;原生js&#xff09;到了半自动武器&#xff08;jQuery&#xff09;并进化为全自动武器&#xff08;三大框架&#xff08;angular&#xff0c;react&#xff0c;vue及其生态链&#xff09;&#xff09;。 常说工欲善其事必先利其器。对于那些想要提…

网络原理-IP协议

一、IP协议报头 版本号:用来表示IP协议的版本,现在常用的IP协议有两个版本,IPv4和IPv6&#xff0c;其他版本可能只存在于实验室中&#xff0c;并没有被广泛的使用。 首部长度:用来表示IP报头的长度,因为存在"选项"字段&#xff0c;所以IP报头是可变长的,此处单位为4…