手写 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);
}
相关推荐
张铁铁是个小胖子3 分钟前
MyBatis学习
java·学习·mybatis
Yan.love1 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶1 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥1 小时前
java提高正则处理效率
java·开发语言
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101342 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13142 小时前
常用的缓存技术都有哪些
java
AiFlutter3 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter