MyBatis:数据准备


#Java 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 可能是不连续的,这是因为多次执行代码的结果,不用在意。

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


( 本文完 )