Cglib根据数据库表数据动态生成对象

最近有个任务:根据查询SQL直接导出报表

实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现

废话少说,上代码:

定义动态生成Java Bean类:

import java.util

import net.sf.cglib.beans.{BeanGenerator, BeanMap}

/**  * 动态Bean生成  *  * @author BarryWang create at 2018/6/19 11:54  * @version 0.0.1  */class DynamicBean {  private var `object`: AnyRef = null  private var beanMap: BeanMap = null

def this(fieldTypeMap: util.Map[String, AnyRef]) {    this()    this.`object` = generateObject(fieldTypeMap)    this.beanMap = BeanMap.create(this.`object`)  }

/**    * 生成对象    *    * @param fieldTypeMap 域及类型Map    * @return    */  private def generateObject(fieldTypeMap: util.Map[String, AnyRef]) = {    val generator = new BeanGenerator    val keySet = fieldTypeMap.keySet    val i = keySet.iterator    while (i.hasNext) {      val key = i.next      generator.addProperty(key, fieldTypeMap.get(key).asInstanceOf[Class[_]])    }    generator.create  }

/**    * 设置域值    *    * @param filedName 域名    * @param value     值    */  def setValue(filedName: String, value: AnyRef): Unit = {    this.beanMap.put(filedName, value)  }

/**    * 获取域值    *    * @param fieldName 域名    * @return    */  def getValue(fieldName: String): AnyRef = this.beanMap.get(fieldName)

/**    * 最终对象    *    * @return    */  def getObject: AnyRef = this.`object`}

SQL查询数据转对象:
  /**    * 根据数据查出数据转成对象列表    * @param database 数据库    * @param querySql 查询SQl    * @return    */  def getObjectDataList(database: String, querySql: String): ArrayList[Object] = {    println(s"database:${database} sql:${querySql}")    val rs = DataGenerator.getResultSet(database, querySql)    val md = rs.getMetaData    val colCount = md.getColumnCount    val fieldValMap = new JavaHashMap[String, AnyRef]()    for (i <- 0 to colCount - 1) {      fieldValMap.put(underLineToCamel(md.getColumnName(i + 1)), Class.forName("java.lang.String"))    }    // 生成动态 Bean    val returnList = new ArrayList[Object]();    while (rs.next()) {      val objectBean = new DynamicBean(fieldValMap);      for (i <- 0 to colCount - 1) {        val data = getData(md, i+1, rs)        objectBean.setValue(underLineToCamel(md.getColumnName(i + 1)), data)      }//      println(">> " + objectBean.getValue("zhCnName"))      returnList.add(objectBean.getObject)    }    rs.close()    returnList  }

def underLineToCamel(name: String): String = {    val result = new StringBuilder    // 快速检查    if (name == null || name.isEmpty) { // 没必要转换      return ""      //        } else if (!name.contains("_")) {      //            // 不含下划线,仅将首字母小写      //            return name.substring(0, 1).toLowerCase() + name.substring(1);    }    // 用下划线将原始字符串分割    val camels = name.split("_")    for (camel <- camels) { // 跳过原始字符串中开头、结尾的下换线或双重下划线      // 处理真正的驼峰片段      if (result.length == 0) { // 第一个驼峰片段,全部字母都小写        result.append(camel.toLowerCase)      }      else { // 其他的驼峰片段,首字母大写        result.append(camel.substring(0, 1).toUpperCase)        result.append(camel.substring(1).toLowerCase)      }    }    result.toString  }
/**  * 从ResultSet取数  * @param md  * @param index  * @param rs  * @return  */def getData(md: ResultSetMetaData, index: Int, rs: ResultSet): String = {  md.getColumnType(index)  match {    case Types.DECIMAL => {      val value = rs.getBigDecimal(index)      val bigDecimal = value == null match {        case true => "0.0000"        case false => value.setScale(4, RoundingMode.HALF_UP).toString()      }      return bigDecimal    }    case Types.TIMESTAMP =>{      val value = rs.getTimestamp(index)      val timestamp = value == null match {        case true => ""        case false => DateTools.format(new Date(rs.getTimestamp(index).getTime))      }      return timestamp    }    case Types.DATE => {      val value = rs.getDate(index)      val date = value == null match {        case true => ""        case false => DateTools.format(rs.getDate(index), DateTools.DATE_PATTERN)      }      return date    }    case _ => {      val value = rs.getObject(index)      val data = value == null match {        case true => ""        case false => rs.getObject(index).toString      }      return data    }  }}

原文地址:https://www.cnblogs.com/barrywxx/p/9976507.html

时间: 2024-08-05 13:40:15

Cglib根据数据库表数据动态生成对象的相关文章

c#从数据库读取数据动态生成树形菜单

页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebTree.aspx.cs" Inherits="Tree.WebTree" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享

摘要: 下文讲述清空数据库中所有表信息的方法分享,如下所示: 实验环境:sql server 2008 实现思路: 1.禁用所有约束,外键 2.禁用所有触发器 3.删除表数据 4.开启触发器 5.开启约束 CREATE PROCEDURE proc_deleteDateSql /* 生成清除数据库表数据的脚本方法分享 */ AS EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' EXEC sp_MSForEachTable

WPF 动态生成对象属性 (dynamic)

原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量~ 参考文章 https://www.cnblogs.com/maomiyouai/p/3594132.html https://www.cnblogs.com/dingli/archive/2012/06/14/2548687.html(这个没看明白 但是冥冥中让我觉得 收藏一下以后可能会用) 代

利用runtime动态生成对象?

利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @"DYViewController"; const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding]; 2)从一个字符串返回一个Class Class newClass = objc_getClass(

在线数据库表(sql语句)生成java实体类工具 - 参考手册

SQL建表语句 说明 格式良好的SQL建表语句,可以是直接从PowerDesigner.Navicat等工具中导出SQL建表语句.所谓格式良好,是指建表指令与表名必须在一行,字段名称.类型.注释必须在一行,因为这个工具是用正则实现的,并不是语法解析器,当然,以后有时间的话,会改进成解析器. 举例 -- ---------------------------- -- Table structure for t_activity -- ---------------------------- DRO

C++ 动态生成对象

1.啰嗦一下 说起C++,很多人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西. 在谈一谈动态生成对象,为什么强大的C++不支持呢?想用这样功能的人都必须自己实现一套这样的逻辑. 2.实现理由 有时候开发真是有些矛盾,例如:1.实现一个功能可以使用大量相似的代码.也可以使用模板,那我们怎么选择呢? 2.如果实现一个类之后,他有大量的属性,而且这些属性都需要set和get方法,

关注C++细节——动态生成对象初始化细节

①T *p =new T; ②T *p =new T(); 这两类用法不同点的总结. 1.若T为类类型,且用户定义了构造函数,则两种形式的效果完全相同,都会调用这个定义了的构造函数来初始化内部成员变量,但是如果此构造函数中并未对成员变量初始化,则这个时候内部的成员变量进行默认初始化--值是未定义的. 2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道编译器会为该类合成一个默认的构造函数,这个时候上述两种形式的结果就不同了,①的类内部的成员变量这个时候执行默认初始化,其值是未定义的.

批量更改数据库表架构(生成sql后直接执行!)

批量更改数据库表架构(生成sql后直接执行!) use my_test; --当前数据库 declare @alltable varchar(1000), @SchemaOld varchar(1000), @SchemaNew varchar(1000), @NewSql VARCHAR(max), @Index INT; SET @SchemaOld='';--原架构名称 SET @SchemaNew='';--新架构名称 SET @NewSql=''; SET @Index=1; SELE