注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
我们在正式学习 MyBatis Plus 之前,需要搭建开发环境、数据库等。在后续章节我们将采用下面的环境来进行学习,和运行 demo 程序。
操作系统: Windows7 / Windows10
IDEA 工具: IntelliJ IDEA 2018
Java: JDK 1.8+
数据库: MySQL 5.7+
SpringBoot: Spring Boot 2.3.3.RELEASE
MyBatis Plus: MyBatis Plus 3.4.0
下图是数据库的关系模型图:

其中:
user 表用来保存用户基础信息;
user_concat 表保存用户的联系方式,一个用户可以拥有多个联系方式;但是一个联系方式只能属于一个用户;
user_book 表保存用户和书籍的关系,一个多对多的中间表;一个用户可以拥有多本书籍,一本书籍可以属于多个用户;
book 表保存书籍基础信息;
book_ext 表是书籍扩展表,保存书籍内容和简要说明信息,该表和 book 表示一对一的关系;
数据库 SQL 脚本如下:
/*
Navicat Premium Data Transfer
Source Server : [mysql] localhost
Source Server Type : MySQL
Source Server Version : 50724
Source Host : localhost:3306
Source Schema : mybatis_test
Target Server Type : MySQL
Target Server Version : 50724
File Encoding : 65001
Date: 02/09/2020 13:02:57
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- create database
CREATE DATABASE `mybatis_test`;
-- use database
USE `mybatis_test`;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`book_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '书编号',
`book_name` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '书名称',
`price` float NULL DEFAULT NULL COMMENT '书价格',
`content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '书内容',
PRIMARY KEY (`book_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (1, '《Java编程思想》', 87.5, 'Java编程圣经,每一位Java程序员必读');
INSERT INTO `book` VALUES (2, '《JavaScript高级程序设计》', 108.7, '学习JavaScript的经典书籍,非常畅销');
INSERT INTO `book` VALUES (3, '《Linux 菜鸟教程:基础篇》', 76.5, '学习Linux基础知识,Linux 入门级书籍');
INSERT INTO `book` VALUES (4, '《Linux 菜鸟教程:服务器篇》', 77, '教你在Linux中搭建各种服务器,如:Nginx、Tomcat、Apache等等');
-- ----------------------------
-- Table structure for book_ext
-- ----------------------------
DROP TABLE IF EXISTS `book_ext`;
CREATE TABLE `book_ext` (
`book_id` int(10) UNSIGNED NOT NULL COMMENT '书编号',
`book_summary` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '书籍概述',
`book_content` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '书籍内容',
PRIMARY KEY (`book_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of book_ext
-- ----------------------------
INSERT INTO `book_ext` VALUES (1, 'Java编程思想是一本好书', '《Java编程思想(第4版)》书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、Iava’UO系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及不错特性,适合各个层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言以及Java语言的教材和参考书。\r\n从《Java编程思想(第4版)》一书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对c、c++以及Java语言都有独到、深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概念');
INSERT INTO `book_ext` VALUES (2, 'JavaScript高级程序设计是一本好书', '《JavaScript高级程序设计(第3版)》是JavaScript超级畅销书的*版。ECMAScript 5和HTML5在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为JavaScript增添了很多适应未来发展的新特性。《JavaScript高级程序设计》这一版除增加5章全新内容外,其他章节也有较大幅度的增补和修订,新内容篇幅约占三分之一。全书从JavaScript语言实现的各个组成部分——语言核心、DOM、BOM、事件模型讲起,深入浅出地探讨了面向对象编程、Ajax与Comet服务器端通信,HTML5表单、媒体、Canvas(包括WebGL)及Web Workers、地理定位、跨文档传递消息、客户端存储(包括IndexedDB)等新API,还介绍了离线应用和与维护、性能、部署相关的*开发实践。《JavaScript高级程序设计(第3版)》附录展望了未来的API和ECMAScript Harmony规范。 ');
INSERT INTO `book_ext` VALUES (3, 'Linux 菜鸟教程:基础篇是一本入门好书', '本书是*知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的*版,全面而详细地介绍了Linux操作系统。全书分为5个部分:*部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系统安全重要的Linux账号的管理,以及主机系统与程序的管理,如查看进程、任务分配和作业管理;第五部分介绍了系统管理员(root)的管理事项,如了解系统运行状况、系统服务,针对登录文件进行解析,对系统进行备份以及核心的管理等。 本书内容丰富全面,基本概念的讲解细致,深入浅出。各种功能和命令的介绍,都配以大量的实例操作和详尽的解析。本书是初学者学习Linux不可多得的一本入门好书。');
INSERT INTO `book_ext` VALUES (4, 'Linux 菜鸟教程:服务器篇是一本提升Linux的书籍', '本书是*知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的*版,全面而详细地介绍了Linux操作系统。全书分为5个部分:*部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系统安全重要的Linux账号的管理,以及主机系统与程序的管理,如查看进程、任务分配和作业管理;第五部分介绍了系统管理员(root)的管理事项,如了解系统运行状况、系统服务,针对登录文件进行解析,对系统进行备份以及核心的管理等。 本书内容丰富全面,基本概念的讲解细致,深入浅出。各种功能和命令的介绍,都配以大量的实例操作和详尽的解析。本书是初学者学习Linux不可多得的一本入门好书。');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
`age` int(11) UNSIGNED NULL DEFAULT NULL COMMENT '年龄',
`face` blob NULL COMMENT '用户头像',
`salary` double NULL DEFAULT NULL COMMENT '薪水',
`borthday` date NULL DEFAULT NULL COMMENT '生日',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Tom', '男', 28, NULL, 7800, '1902-06-04');
INSERT INTO `user` VALUES (2, '张小凡', '男', 30, NULL, 8670, '1990-08-22');
INSERT INTO `user` VALUES (3, '叶星云', '女', 31, NULL, 6890, '1989-02-27');
-- ----------------------------
-- Table structure for user_book
-- ----------------------------
DROP TABLE IF EXISTS `user_book`;
CREATE TABLE `user_book` (
`user_id` int(11) NOT NULL COMMENT '用户编号',
`book_id` int(11) NOT NULL COMMENT '书编号',
`cjsj` datetime(0) NULL DEFAULT NULL COMMENT '插入日期',
PRIMARY KEY (`user_id`, `book_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_book
-- ----------------------------
INSERT INTO `user_book` VALUES (1, 1, '2020-09-02 12:53:59');
INSERT INTO `user_book` VALUES (1, 2, '2020-09-02 12:53:59');
INSERT INTO `user_book` VALUES (1, 4, '2020-09-02 12:53:59');
INSERT INTO `user_book` VALUES (2, 2, '2020-09-02 12:53:59');
INSERT INTO `user_book` VALUES (3, 3, '2020-09-02 12:53:59');
INSERT INTO `user_book` VALUES (3, 4, '2020-09-02 12:53:59');
-- ----------------------------
-- Table structure for user_contact
-- ----------------------------
DROP TABLE IF EXISTS `user_contact`;
CREATE TABLE `user_contact` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '联系方式ID',
`user_id` int(11) NOT NULL COMMENT '用户编号',
`usage` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用途描述',
`number` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话号码',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_contact
-- ----------------------------
INSERT INTO `user_contact` VALUES (1, 1, '手机号码', '15787782291');
INSERT INTO `user_contact` VALUES (2, 2, '家庭号码', '028-82234543');
INSERT INTO `user_contact` VALUES (3, 3, '工作号码', '028-78675599');
-- ----------------------------
-- Function structure for func_updateUserName
-- ----------------------------
DROP FUNCTION IF EXISTS `func_updateUserName`;
delimiter ;;
CREATE FUNCTION `func_updateUserName`(`userId` int,`userName` varchar(100))
RETURNS int(11)
BEGIN
declare tname varchar(100);
update `user` set `name`=userName where user_id=userId;
select `name` into tname from `user` where user_id=userId;
if tname=userName then
return 1;
else
return 0;
end if;
END
;;
delimiter ;
-- ----------------------------
-- Procedure structure for proc_getUserAge
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_getUserAge`;
delimiter ;;
CREATE PROCEDURE `proc_getUserAge`(INOUT `userId` int)
BEGIN
select age into userId from `user` where user_id=userId;
END
;;
delimiter ;
-- ----------------------------
-- Procedure structure for proc_getUserName
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_getUserName`;
delimiter ;;
CREATE PROCEDURE `proc_getUserName`(IN `userId` int,OUT `userName` varchar(100))
BEGIN
select `name` into userName from `user` where user_id=userId;
END
;;
delimiter ;
-- ----------------------------
-- Procedure structure for proc_updateUserName
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_updateUserName`;
delimiter ;;
CREATE PROCEDURE `proc_updateUserName`(IN `userId` int,IN `userName` varchar(100))
BEGIN
update `user` set `name`=userName where user_id=userId;
END
;;
delimiter ;
SET FOREIGN_KEY_CHECKS = 1;在后续的所有章节将对上面表进行操作,将不再赘述数据表的关系以及数据表的 SQL 脚本。