Spring Boot QuickStart (4) - Database

本文只是引子,後續更新到獨立章節。java

環境:Spring Boot 1.5.4mysql

到了操做數據庫的環節,以 MySQL 爲基準,體驗一下數據庫的相關操做,先讓我糾結一下,至少有如下四種姿式。spring

  • JDBC。原生的 JDBC 操做,原生的 SQL語句,寫一大堆的初始化、代碼、異常捕獲。sql

  • JDBCTemplate。Spring 對 JDBC 的封裝,基本上仍是原生的 SQL 語句,操做方法要本身寫,少了不少(他們叫樣板式)代碼。數據庫

  • JPA。內置了一些接口,封裝了常規的 CURD、分頁操做,藉助 Spring Data Jpa,能幫你自動實現大部分的單表操做,你要作的僅僅是定義實體,按照規範定義接口便可。springboot

  • MyBatis。一個 Java 當前很流行的 ORM 框架,若是你之前是寫 PHP 的,我猜你不太敢相信它是 ORM 框架。app

JPA、MyBatis 將是學習重點。尤爲是 MyBatis,這也是如今號稱流行的 SSM 組合。(Spring + Spring MVC + MyBatis)?幸好 Structs、Hibernate 如今看起來不主流了。框架

體驗的基線:dom

  • 單表。增、刪、改、查(多條件組合查詢、分頁,排序等)函數

  • 多表關聯。一對一,一對多,多對多

lombok

Java 是強類型的,因此常常要定義實體,或domain,或dao,或dto。

而每一個類寫上構造函數,Getter、Setter、toString,實在是蛋疼。雖然 PHPStorm 提供了快捷鍵能夠快速生成(CTRL+N),但當你要修改屬性、屬性類型的時候,仍是須要手動搞一下的。

因此我發現了 lombok 這個項目,經過必定的註解,配合 PHPStorm 插件,能夠消除以上那些常規代碼。

甚至,還能夠經過 builder() 模式,消除重複的 .setXXX() 語句

官網地址:https://projectlombok.org/

數據庫結構

先意淫幾張表,經過這幾張表,指望可以覆蓋常規的需求,其包含了各類類型的的字段,以及多種表關係。

user (id, role_id, xx)
user_detail (id, user_id, xx)
role (id, xx)
order (id, user_id, xx)
product (id, xx)
order_product (order_id, product_id)

關係以下:
user<->user_detail 一對一
user->role 一對一(假設一個用戶只有一個角色)
role->user 一對多
user->order 一對多
order->user 多對一
order<->product 多對多

同時在 application.properties 中配置 datasource 數據源相關配置,這裏使用 MySQL

spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=123123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

字段映射

Java 與 MySQL 類型映射,能夠參考 <Java, JDBC, MySQL 類型轉換>

但,我目前還很困惑的是時間相關的幾個類型,在 MySQL 中,有如下幾個:

DATE
TIME
DATETIME
TIMESTAMP

其中,TIMESTAMP、TIME 貌似只能對應 java.sql.Timestamp 與 java.sql.Time

那麼 DATE、DATETIME 呢?首先對應 java.sql.Date 與 java.sql.Timestamp 確定是能夠的。

能對應 java.util.Date 嗎?

能對應 java.time.LocalDate、java.time.LocalDateTime 嗎?

應當如何選擇?標準姿式是什麼?

參考:
https://stackoverflow.com/que...

SQL

DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `name` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='訂單';


BEGIN;
INSERT INTO `order` VALUES ('1', '1', '訂單一'), ('2', '1', '訂單二'), ('3', '1', '訂單三'), ('4', '2', '訂單四'), ('5', '2', '訂單五');
COMMIT;


DROP TABLE IF EXISTS `order_product`;
CREATE TABLE `order_product` (
  `order_id` int(10) unsigned NOT NULL,
  `product_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`order_id`,`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='訂單產品關聯表';


BEGIN;
INSERT INTO `order_product` VALUES ('1', '1'), ('1', '2'), ('1', '3'), ('2', '2'), ('2', '3');
COMMIT;


DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `price` double(10,2) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='產品';

BEGIN;
INSERT INTO `product` VALUES ('1', '大白菜', '1.23'), ('2', '土豆', '2.45'), ('3', '西紅柿', '3.78'), ('4', '芹菜', '2.08'), ('5', '雞蛋', '0.51');
COMMIT;

DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='角色';

BEGIN;
INSERT INTO `role` VALUES ('1', '管理員'), ('2', '總編'), ('3', '編輯');
COMMIT;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `role_id` tinyint(3) unsigned NOT NULL COMMENT '角色ID',
  `username` varchar(32) NOT NULL COMMENT 'Email用戶名,惟一',
  `password` varchar(32) NOT NULL COMMENT '密碼',
  `salt` varchar(6) NOT NULL COMMENT '鹽',
  `name` varchar(32) NOT NULL COMMENT '姓名',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` enum('male','female') NOT NULL COMMENT '性別',
  `access` datetime DEFAULT NULL COMMENT 'datetime類型',
  `access_time` time DEFAULT NULL COMMENT 'time類型',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
  `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  `state` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '狀態',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用戶';


BEGIN;
INSERT INTO `user` VALUES ('1', '1', 'a@a.com', '6f5275a26b06ee3bdf4fb1d2ca89577c', 'wnyk0a', '雷小軍', '1970-08-08', 'male', '1987-09-08 01:02:03', '01:02:03', '2017-07-01 09:36:23', '2017-07-01 17:29:06', '1'), ('2', '2', 'b@b.com', '3206c77753829fc30fffa37881a63341', 'xxmao1', '董明珠', '1960-05-05', 'female', '1987-09-08 01:02:03', '01:02:03', '2017-07-01 09:36:50', '2017-07-01 17:28:42', '1');
COMMIT;

DROP TABLE IF EXISTS `user_detail`;
CREATE TABLE `user_detail` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `address` varchar(32) NOT NULL DEFAULT '' COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用戶詳情';


BEGIN;
INSERT INTO `user_detail` VALUES ('1', '1', '北京'), ('2', '2', '廣州');
COMMIT;
相關文章
相關標籤/搜索