注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “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 脚本。