手寫 Hibernate ORM 框架 05-基本效果測試

老马啸西风發表於2024-07-31

手寫 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)

ROAD-MAP

相關文章