手寫 Hibernate 系列
手寫 Hibernate ORM 框架 00-hibernate 簡介
手寫 Hibernate ORM 框架 00-環境準備
手寫 Hibernate ORM 框架 01-註解常量定義
手寫 Hibernate ORM 框架 02-實體 Bean 定義,建表語句自動生成
手寫 Hibernate ORM 框架 03-配置檔案讀取, 資料庫連線構建
手寫 Hibernate ORM 框架 04-持久化實現
手寫 Hibernate ORM 框架 05-整體效果測試驗證
從零手寫元件系列
java 從零手寫 spring ioc 控制反轉
java 從零手寫 spring mvc
java 從零手寫 jdbc-pool 資料庫連線池
java 從零手寫 mybatis
java 從零手寫 hibernate
java 從零手寫 rpc 遠端呼叫
java 從零手寫 mq 訊息元件
java 從零手寫 cache 快取
java 從零手寫 nginx4j
java 從零手寫 tomcat
簡介
java 從零實現簡易版本的 hibernate
我們已經實現了 v0.1.0 版本,本節一起來驗證一下效果。
核心特性
-
簡單版本的 hibernate
-
建表語句生成+執行
-
插入語句生成+執行
快速開始
需要
jdk1.3+
maven 3.x+
maven 引入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>hibernate</artifactId>
<version>0.1.0</version>
</dependency>
入門測試
環境準備
首先準備一個 mysql 對應的測試庫 hibernate
mysql> create database hibernate;
Query OK, 1 row affected (0.00 sec)
mysql> use hibernate;
Database changed
配置資訊
我們配置一下 hibernate.cfg.xml
為對應的資料庫訪問資訊:
<?xml version='1.0' encoding='utf-8'?>
<hibernate-configuration>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
</hibernate-configuration>
建表語句
SQL 的生成:
Table table = new Table();
User user = new User();
System.out.println(table.buildCreateTableSQL(user));
結果為:
create table t_user (id BIGINT AUTO_INCREMENT, name VARCHAR(255), password VARCHAR(255), myAge INTEGER , createOn DATETIME, modifiedOn DATETIME , PRIMARY KEY (`id`) );
執行建表
我們可以直接透過程式建表
Session session = new Session();
Table table = new Table();
User user = new User();
Connection connection = session.createConnection();
PreparedStatement preparedStatement = connection.prepareStatement(table.buildCreateTableSQL(user));
preparedStatement.execute();
執行後:
mysql> show tables;
+---------------------+
| Tables_in_hibernate |
+---------------------+
| t_user |
+---------------------+
1 row in set (0.00 sec)
表結構
mysql> desc t_user;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
| myAge | int(11) | YES | | NULL | |
| createOn | datetime | YES | | NULL | |
| modifiedOn | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
PS: 這裡可以看到對應的欄位沒有駝峰轉下劃線
資料的插入
插入語句
User user = new User();
user.setId(3L);
user.setName("ryo");
user.setAge(21);
user.setPassword("123456");
user.setCreateOn(new Date());
user.setModifiedOn(new Date());
System.out.println(new Session().buildInsertSQL(user));
結果為:
INSERT INTO t_user ( id,name,password,myAge,createOn,modifiedOn ) VALUES ( '3','ryo','123456','21','2024-07-30 00:37:36','2024-07-30 00:37:36' ) ;
程式插入
也可以程式直接插入
User user = new User();
user.setId(3L);
user.setName("ryo");
user.setAge(21);
user.setPassword("123456");
user.setCreateOn(new Date());
user.setModifiedOn(new Date());
new Session().save(user);
效果
mysql> select * from t_user;
+----+------+----------+-------+---------------------+---------------------+
| id | name | password | myAge | createOn | modifiedOn |
+----+------+----------+-------+---------------------+---------------------+
| 3 | ryo | 123456 | 21 | 2024-07-30 00:38:14 | 2024-07-30 00:38:14 |
+----+------+----------+-------+---------------------+---------------------+
1 row in set (0.00 sec)