手写 Hibernate ORM 框架 04-持久化实现

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

本节内容

执行建表语句。

执行数据的保存

执行建表语句

Session

java 复制代码
package com.ryo.hibernate.simulator.hibernate;

import com.mysql.jdbc.PreparedStatement;
import com.ryo.hibernate.simulator.hibernate.util.ConnectionUtil;
import com.ryo.hibernate.simulator.hibernate.util.FieldUtil;
import com.ryo.hibernate.simulator.hibernate.util.TableUtil;
import com.ryo.hibernate.simulator.model.User;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * Session 实现
 * @author houbinbin
 * @date 16/6/5
 */
public class Session {

    /**
     * 获取数据库链接信息
     * @return
     */
    public Connection createConnection() {
        return ConnectionUtil.getConnection();
    }
}

测试

我们一开始写的数据库 Table 只是生成了脚本,但是没有实际执行。

有了 Connection 之后,我们就可以开始执行脚本啦。

  • executeCreateTableTest.java
java 复制代码
/**
 * 执行建表���句
 * @throws SQLException SQL 异常
 */
@Test
public void executeCreateTableTest() throws SQLException {
    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();
}

数据的持久化

java 复制代码
package com.ryo.hibernate.simulator.hibernate;

import com.mysql.jdbc.PreparedStatement;
import com.ryo.hibernate.simulator.hibernate.util.ConnectionUtil;
import com.ryo.hibernate.simulator.hibernate.util.FieldUtil;
import com.ryo.hibernate.simulator.hibernate.util.TableUtil;
import com.ryo.hibernate.simulator.model.User;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * Session 实现
 * @author houbinbin
 * @date 16/6/5
 */
public class Session {
    /**
     * 插入模板
     */
    private static final String INSERT_FORMAT = "INSERT INTO %s ( %s ) VALUES ( %s ) ;";

    /**
     * 保存用户信息
     * @param user
     * @throws SQLException
     */
    public void save(User user) throws SQLException {
        String sql = buildInsertSQL(user);

        Connection con = createConnection();
        PreparedStatement state =  (PreparedStatement) con.prepareStatement(sql);
        state.execute();
        con.close();
    }

    /**
     * 构建插入语句
     * @param user
     * @return
     */
    public String buildInsertSQL(User user) {
        String tableName = TableUtil.getTableName(user);
        String fieldString = FieldUtil.getFieldNameString(user);
        String valueString = FieldUtil.getFieldValueString(user);

        return String.format(INSERT_FORMAT, tableName, fieldString, valueString);
    }

    /**
     * 获取数据库链接信息
     * @return
     */
    public Connection createConnection() {
        return ConnectionUtil.getConnection();
    }
}

测试构建

  • buildInsertSQLTest.java
java 复制代码
@Test
public void buildInsertSQLTest() {
    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','2018-05-02 22:33:32','2018-05-02 22:33:32' ) ;

测试入库

  • insertUserTest()
java 复制代码
@Test
public void insertUserTest() throws SQLException {
    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);
}
相关推荐
427724005 分钟前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo26 分钟前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦28 分钟前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个29 分钟前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
南宫生3 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长4 小时前
Maven 基础环境搭建与配置(一)
java·maven
风与沙的较量丶5 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
m0_748251725 小时前
SpringBoot3 升级介绍
java
极客先躯6 小时前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分
程序员侠客行6 小时前
Spring事务原理 二
java·后端·spring