数据库设置
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 可能是不连续的,这是因为多次执行代码的结果,不用在意。
注意,实际开发中,密码不能使用明文存储。