Hibernate传入Java对象创建动态表并录入数据

看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据

我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据

注意:

由于业务需要,这里对于字段的支持只有int和Integer,double和Double

还有String,同时对于String统一创建为了Varchar(100)的字段

表会统一创建一个id自增主键

package com.xd.nms.util;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
/**
 * @说明 动态插入数据和创建表
 * @author 崔素强
 * @version 1.0
 * @since
 */
public class CommonTableInsert {
  public static Log logger = LogFactory.getLog(CommonTableInsert.class);
  /**
   * 入口方法
   * @param tableName 表前缀
   * @param dateFormat 格式化方法
   * @param obj 保存的对象
   * @return
   */
  @SuppressWarnings("unchecked")
  public static int insertObject(String tableName,String dateFormat,Object obj, Map noCol){
    int re = 0;
    try {
      JdbcTemplate jt = (JdbcTemplate) SpringFactory.getObject("jdbcTemplate");
      SimpleDateFormat format = new SimpleDateFormat(dateFormat);
      String tname = tableName + "_" + format.format(new Date());
      if(CommonDBUtil.getAllTableName(jt,tname)){ // 如果有某表
        re = saveObj(jt,tname,obj, noCol); // 保存数据
      }else{
        re = createTable(jt,tname,obj, noCol); // 动态创建表
        if(re == 1){
          re = saveObj(jt,tname,obj, noCol); // 保存数据
        }
      }
    } catch (Exception e) {
      logger.error("公用方法插入数据入口方法错误", e);
    }
    return re;
  }
  /**
   * 保存方法,注意这里传递的是实际的表的名称
   */
  @SuppressWarnings("unchecked")
  private static int saveObj(JdbcTemplate jt,String tableName,Object obj, Map noCol){
    int re = 0;
    StringBuffer sb = new StringBuffer("");
    try{
      sb.append(" insert into " + tableName + " (");
      Map<String,String> map = ObjectUtil.getProAndValMap(obj); // 对象的属性和属性值
      Map<String,String> mapType = ObjectUtil.getProTypeMap(obj); // 对象的属性类型列表
      Set<String> set = map.keySet();
      for(String key : set){
        // 如果该列不是 非处理列
        if(noCol.get(key) == null){
          sb.append(key + ",");
        }
      }
      sb.append(" tableName ) ");
      sb.append(" values ( ");
      for(String key : set){
        if(noCol.get(key) == null){
          if(mapType.get(key).equals("class java.lang.String")){
            sb.append("'" + (map.get(key) + "',"));
          }else{
            sb.append(map.get(key) + ",");
          }
        }
      }
      sb.append("'" + tableName + "'); ");
      re = jt.update(sb.toString());
    } catch (Exception e) {
      logger.error("公用方法录入数据时错误", e);
      logger.error("公用方法录入数据语句:" + sb.toString());
    }
    return re;
  }
  /**
   * 根据表名称 和 实体属性 创建一张表
   * @param tableName
   * @param obj 具体生成什么样的表看该对象
   */
  @SuppressWarnings("unchecked")
  private static int createTable(JdbcTemplate jt,String tableName,Object obj, Map noCol){
    StringBuffer sb = new StringBuffer("");
    sb.append("CREATE TABLE `" + tableName + "` (");
    sb.append(" `id` int(11) NOT NULL AUTO_INCREMENT,");
    Class c = obj.getClass();
    Field field[] = c.getDeclaredFields();
    for (Field f : field) {
      if(noCol.get(f.getName()) == null){
        String type = f.getType().toString();
        if(type.equals("class java.lang.String")){// Str
           sb.append("`" + f.getName() + "` varchar(100) DEFAULT NULL,");
        }else if(type.equals("int") || type.equals("class java.lang.Integer")){// int
          sb.append("`" + f.getName() + "` int(11) DEFAULT NULL,");
        }else if(type.equals("double") || type.equals("class java.lang.Double")){// double
          sb.append("`" + f.getName() + "` double DEFAULT NULL,");
        }
      }
    }
    sb.append(" `tableName` varchar(255) DEFAULT NULL,");
    sb.append(" PRIMARY KEY (`id`)");
    sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
    try {
      jt.update(sb.toString());
      return 1;
    } catch (Exception e) {
      logger.error("公用方法生成表时错误", e);
      logger.error("公用方法生成表语句:" + sb.toString());
    }
    return 0;
  }
} 

这个对于之前写的那个动态建表,新增了过滤不需要在表中创建的字段

原理就是读取对象的各个字段属性,如果能加以配置文件或者读取对象属性的标记,那其实能做到基本和Hibernate一致,不但能支持多种类型,还能做字段校验等

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 解决spring boot hibernate 懒加载的问题

    spring boot 是快速构建微服务的新框架. 对于数据访问问题可以直接使用jpa技术,但是在单元测试发现spring jpa存在hibernate懒加载问题. 但是spring-boot没有xml配置文件所以现在网络上好多的解决方案并不能适用在spring boot框架中.在遇到该问题苦苦查询后终于无意中发现了解决方案. Spring application using JPA with Hibernate, lazy-loading issue in unit test 英文不好没有细看

  • 浅谈hibernate中懒加载禁用操作

    浅谈hibernate中懒加载禁用操作 懒加载的概念:懒加载就是hibernate中的延迟加载,在hibernate中的一对多,多对多关系中通过对象导航来查询对象时一般默认的就是懒加载.就是当我们查询一个对象的时候,在默认情况下,返回的只是该对象的代理对象,当用户去使用该对象的属性是,才会向数据库中再一次发出查询语句.懒加载在某些情况下确实可以减少不必要的sql语句,但是有的情况下,还是会抛出异常. 下面我将介绍懒加载禁用的方式 方式一: 在需要禁用懒加载的实体对象的配置文件中配置lazy="f

  • Hibernate基于ThreadLocal管理Session过程解析

    1.为什么要使用ThreadLocal管理Session session是线程不安全的,因此在多线程环境下,session对象不能为共享对象 把Session写成局部变量虽然可以解决线程安全问题,但是每次运行都要打开及关闭session对象,导致性能受影响 如果直接调用调用sessionfactory.openSession方法,则无法在业务层获取session对象 2.ThreadLocal管理Session的配置 2.1.方式一 通过自定义工具类实现 package com.yl.utils

  • Idea+maven搭建SSH(struts2+hibernate5+spring5)环境的方法步骤

    最近要使用 SSH 来编写期末的考核任务,之前也在网上查阅了很久,也试出了很多的问题.也很感谢很多前辈们的总结,我也查到了很多用用的内容. 本次项目,我将以一个简单的登录案例实现 SSH 的项目整合,项目我会放到 Github 上面,需要的同学可以 clone 下来在本地跑一跑 项目地址:SSH 脚手架 一.项目环境搭建 使用 maven 搭建一个 Java Web 项目 1.1 配置 Spring 坐标依赖 引入 Spring 坐标依赖 <!-- spring-context --> <

  • springboot 2.3之后消失的hibernate-validator解决方法

    项目升级到springboot2.3之后,参数校验的注解报错,发现spring-boot-starter-web的依赖项已经去除了依赖 点开spring-boot-starter-web源码看了下. <?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache

  • Hibernate双向多对多映射关系配置代码实例

    1.实体类 package com.yl.bean; import java.io.Serializable; import java.util.Set; /** * 商品实体类 */ public class Goods implements Serializable { private Integer id;//商品id private String goodsName;//商品名 private Double price;//商品价格 private String remark;//备注

  • Spring+SpringMVC+Hibernate整合实例讲解

    使用Maven构建项目,用pom.xml引入相应jar,配置以下文件 创建spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns

  • Hibernate双向一对一映射关系配置代码实例

    1.外键映射 1.1.实体类 package com.yl.bean; import java.io.Serializable; /** * 公民实体类 */ public class Person implements Serializable { private Integer id; private String name; private PersonCard card; public Person() { } public Person(Integer id, String name,

  • Hibernate传入Java对象创建动态表并录入数据

    看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据 我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据 注意: 由于业务需要,这里对于字段的支持只有int和Integer,double和Double 还有String,同时对于String统一创建为了Varchar(100)的字

  • javascript创建动态表单的方法

    本文实例讲述了javascript创建动态表单的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>

  • java存储以及java对象创建的流程(详解)

    java存储: 1)寄存器:这是最快的存储区,位于处理器的内部.但是寄存器的数量有限,所以寄存器根据需求进行分配.我们不能直接进行操作. 2)堆栈:位于通用RAM中,可以通过堆栈指针从处理器那里获取直接支持.堆栈指针往下移动,则分配新的内存.网上移动,则释放内存.但是 在创建程序的时候必须知道存储在堆栈中的所有项的具体生命周期,以便上下的移动指针.一般存储基本类型和java对象引用. 3)堆:位于通用RAM中,存放所有的java对象,不需要知道具体的生命周期. 4)常量存储:常量值通常直接存放在

  • 详解Java对象创建的过程及内存布局

    一.对象的内存布局 对象头 对象头主要保存对象自身的运行时数据和用于指定该对象属于哪个类的类型指针. 实例数据 保存对象的有效数据,例如对象的字段信息,其中包括从父类继承下来的. 对齐填充 对齐填充不是必须存在的,没有特别的含义,只起到一个占位符的作用. 二.对象的创建过程 实例化一个类的对象的过程是一个典型的递归过程. 在准备实例化一个类的对象前,首先准备实例化该类的父类,如果该类的父类还有父类,那么准备实例化该类的父类的父类,依次递归直到递归到Object类. 此时,首先实例化Object类

  • Java对象创建内存案例解析

    Java对象创建内存图解析 1. 栈 Java栈的区域很小 , 特点是存取的速度特别快,栈存储的特点是, 先进后出,存储速度快的原因: 栈内存, 通过 栈指针'来创建空间与释放空间,指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存.这种方式速度特别快 , 仅次于PC寄存器,但是这种移动的方式, 必须要明确移动的大小与范围 ,明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序的灵活性. 所以我们把更大部分的数据 存储到了堆内存中

  • JAVA 对象创建与对象克隆

    目录 一.对象的4种创建方式 二.通过new创建对象 三.反射 四.克隆对象 浅拷贝 深拷贝 五.反序列化 六.补充 一.对象的4种创建方式 new 创建 反射 克隆 反序列化 二.通过new创建对象 一般情况下,对象通过new 关键字创建,首先会在堆上给对象分配空间,然后执行构造函数进行一系列的初始化,在分配的内存空间上为一众属性赋值:完成初始化后再将堆区对象的引用传递给栈区,最终参与程序的运行. 三.反射 调用Java.lang.Class或者java.lang.reflect.Constr

  • springBoot下实现java自动创建数据库表

    SpringBoot环境启动项目创建数据库表 使用环境 windows+eclipse+mysql+navicat 步骤 1.创建SpringBoot项目 2.新建数据库,配置连接信息 3.编写初始化数据库表类 4.运行查看结果 1.创建SpringBoot项目 关于如何创建SpringBoot项目不再详细描述,只要创建一个可以运行的SpringBoot项目就行. 2.新建数据库,配置连接信息 2.1 新建数据库 打开Navicat新建一个Mysql连接(连接信息如用户名,密码记好,下面配置连接

  • asp.net 动态表单之数据分页

    但是问题来了,不同科系的同学的科目是不一样的,那么我们在数据库设计的时候通常是把学生.某科成绩作为一条记录,那么这个时候我们就需要做一个行转列的逻辑处理了. 解决方法: 使用GridView来生成表单,这个实现起来会比较麻烦,如果要在列表里面显示链接就更不可能了: 生成html再输出到页面中,这个实现起来比较灵活.方便: 基本功能点: 动态生成表头: 数据进行分页: 查询数据: 对每个成绩进行超链接,查看明细:  页面代码 复制代码 代码如下: <div id="dataDiv1"

  • java中创建两表之间的触发器详解

    创建一个触发器实现借书自增数量/还书自减 在 books 被借阅属性 islend 更新时在 lender 表中同时更新借书数量 amount,其中islend 属性更新后保存的是借阅人 lender 的 id,lender 中 id 是主键,books 表中 islend 是外键,连接这两张表. 两个数据库表结构在下方给出,目前写的触发器如下: CREATE TRIGGER `lendBook` AFTER UPDATE ON `books` FOR EACH ROW BEGIN UPDATE

  • Java使用poi组件导出Excel格式数据

    在做管理系统的时候,我想Excel的导出是我们很难规避掉的,而且这也是个很实用很人性化的功能. Java中对于Excel的支持有很多种,比如说JXL,POI等.我这边使用的是POI进行一个Excel的操作,下面我会简单分享下POI组件的使用,以及我使用比较多一个工具类. POI组件 poi组件是由Apache提供的组件包,主要职责是为我们的Java程序提供对于office文档的相关操作.本文主要是它对于Excel操作的一个介绍. 官方主页:http://poi.apache.org/index.

随机推荐