手写 Hibernate ORM 框架 05-基本效果测试

手写 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 引入

xml 复制代码
<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 复制代码
<?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 的生成:

java 复制代码
Table table = new Table();
User user = new User();
System.out.println(table.buildCreateTableSQL(user));

结果为:

sql 复制代码
create table t_user (id BIGINT AUTO_INCREMENT, name VARCHAR(255), password VARCHAR(255), myAge INTEGER , createOn DATETIME, modifiedOn DATETIME , PRIMARY KEY  (`id`) );

执行建表

我们可以直接通过程序建表

java 复制代码
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: 这里可以看到对应的字段没有驼峰转下划线

数据的插入

插入语句

java 复制代码
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));

结果为:

sql 复制代码
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' ) ;

程序插入

也可以程序直接插入

java 复制代码
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

  • 添加基于 gen-case 的测试用例

  • 建表对应的字段没有驼峰转下划线

  • CRUD

  • list 等常见查询

相关推荐
阿维的博客日记12 分钟前
为什么会增加TreeMap和TreeSet这两类,有什么核心优势吗?可以解决什么核心痛点?
java·treeset·treemap
dllxhcjla20 分钟前
黑马头条1
java
宠友信息24 分钟前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app
humors22134 分钟前
各厂商工具包网址
java·数据库·python·华为·sdk·苹果·工具包
无限进步_44 分钟前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
海兰1 小时前
使用 Spring AI 打造企业级 RAG 知识库第二部分:AI 实战
java·人工智能·spring
历程里程碑1 小时前
二叉树---二叉树的中序遍历
java·大数据·开发语言·elasticsearch·链表·搜索引擎·lua
小信丶2 小时前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
无限进步_2 小时前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神2 小时前
Spring Cloud 2026 架构演进
java·spring·微服务