MyBatis 教程

👉 所有文章
文章列表 准备工作 回顾 JDBC 数据准备 查找id为1的用户信息 自定义连接池 不用MyBatis配置文件 查询密码为123的所有用户 如果Bean中成员变量和表中字段命名不一致 更多查询用户的方式 对查询结果排序 日志 添加、删除、修改数据 事务 动态SQL 一对一和一对多的实现 一对一和一对多的延迟加载 多对多的实现 分页查询 把SQL写在注解中 自动生成Mapper代码和映射XML mybatis generator 生成 select for update mybatis generator 支持数据版本号

MyBatis: 数据准备


数据库设置

MySQL 数据库为本机安装。

安全的用户访问模式,是为 database 设置单独的用户和复杂密码。不过这里为了方便,用户使用root,密码是常用的弱密码123456

另外,请不要让数据库被外部访问。如果你是Linux/mac系统,在 /etc/my.cnf 增加以下内容,并重启MySQL即可。

[mysqld]
bind-address=127.0.0.1

MySQL 默认的utf8字符集是有问题的,无法处理4字节字符(例如emoji字符😆),一个解决方案是使用utf8的超集utf8mb4

MySQL配置my.cnf

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

重启数据库。

另一个注意的点事,MySQL的 Java JDBC 包要用比较新的版本。按照mysql/Java服务端对emoji的支持的描述,需要升级或确保你的mysql connector版本高于5.1.13,在 https://mvnrepository.com/artifact/mysql/mysql-connector-java 可以找到所有版本。

数据准备

如无特殊说明,我们的示例会基于下面的 table 和 初始化数据。

生成数据:

-- 若有则删除
DROP DATABASE IF EXISTS `blog_db`;

-- 创建数据库
CREATE DATABASE `blog_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 用户表
CREATE  TABLE `blog_db`.`user` (
  `id` BIGINT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_name` (`name`) -- name 保证唯一
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;

-- 用户表添加数据
INSERT INTO `blog_db`.`user` (`name`, `email`, `password`) VALUES ('letian', 'letian@111.com', '123');
INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`) VALUES ('xiaosi', 'xiaosi@111.com', '123');

-- 博客表
CREATE  TABLE `blog_db`.`blog` (
  `id` BIGINT NOT NULL AUTO_INCREMENT ,
  `owner_id` BIGINT NOT NULL ,  -- 所属用户的id
  `title` TEXT NOT NULL ,
  `content` TEXT NOT NULL ,
  PRIMARY KEY (`id`) 
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;

-- 博客表插入数据
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题1', '文本1');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题2', '文本2');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题3', '文本3');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题4', '文本4');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题5', '文本5');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('2', '标题21', '文本21');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '你好, World', '你好, 😆');

查看数据:

mysql> use blog_db;
mysql> select * from user;
+----+--------+----------------+----------+
| id | name   | email          | password |
+----+--------+----------------+----------+
|  1 | letian | letian@111.com | 123      |
|  2 | xiaosi | xiaosi@111.com | 123      |
+----+--------+----------------+----------+
2 rows in set (0.00 sec)

mysql> select * from blog;
+----+----------+---------------+--------------+
| id | owner_id | title         | content      |
+----+----------+---------------+--------------+
|  1 |        1 | 标题1         | 文本1        |
|  2 |        1 | 标题2         | 文本2        |
|  3 |        1 | 标题3         | 文本3        |
|  4 |        1 | 标题4         | 文本4        |
|  5 |        1 | 标题5         | 文本5        |
|  6 |        2 | 标题21        | 文本21       |
|  7 |        1 | 你好, World   | 你好, 😆       |
+----+----------+---------------+--------------+
7 rows in set (0.00 sec)

在后面的示例中,新纪录的 id 可能是不连续的,这是因为多次执行代码的结果,不用在意。

注意,实际开发中,密码不能使用明文存储。


( 本文完 )

文章目录