手写 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);
}
相关推荐
再见晴天*_*2 分钟前
logback 日志不打印
java·服务器·logback
幽络源小助理10 分钟前
SpringBoot基于JavaWeb的城乡居民基本医疗信息管理系统
java·spring boot·学习
欧阳有财13 分钟前
[java八股文][Mysql面试篇]日志
java·mysql·面试
TDengine (老段)22 分钟前
使用 StatsD 向 TDengine 写入
java·大数据·数据库·时序数据库·iot·tdengine·涛思数据
真实的菜24 分钟前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
N_NAN_N1 小时前
类图+案例+代码详解:软件设计模式----原型模式
java·设计模式·原型模式
佛祖保佑永不宕机1 小时前
maven引入本地jar包
java·maven·jar
默默coding的程序猿1 小时前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
在未来等你1 小时前
JVM调优实战 Day 15:云原生环境下的JVM配置
java·jvm·性能优化·虚拟机·调优
funnycoffee1232 小时前
Huawei 6730 Switch software upgrade example版本升级
java·前端·华为