最近有个任务:根据查询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
}
}
}

cglib根据数据动态生成对象的更多相关文章

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

    原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...

  2. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  3. python-根据字符串动态生成对象eval

    # -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", ", 'averagePrice_yesterday':34.0 ...

  4. C++ 动态生成对象

    1.啰嗦一下 说起C++,很多人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西 ...

  5. 利用runtime动态生成对象?

    利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @ ...

  6. jsp页面根据json数据动态生成table

    根据需求由于不同的表要在同一个jsp展示,点击某个表名便显示某张表内容,对于java后台传给jsp页面的json形式的数据是怎么动态生成table的呢? 找了好久,终于找到某位前辈的答案,在此表示衷心 ...

  7. 根据xml配置使用反射动态生成对象

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  8. js将json数据动态生成表格

    今天开发中遇到需要展示动态数据的问题, 具体要求是后端传来的json字符串,要在前端页面以table表格的形式展示, 其实没啥难的,就是拼接table标签,纯属体力活,于是自己写了个呆萌,保存起来,以 ...

  9. Winfrom treeview 如何从多个数据表中获取数据动态生成

    本文转载:http://www.cnblogs.com/VincentLuo/archive/2008/03/29/1128987.html 在 汪洋怡舟的这篇文章中[http://www.cnblo ...

随机推荐

  1. testng实现场景恢复

    自动化测试过程中存在很多的不稳定性,例如网络的不稳定,浏览器无响应等等,这些失败往往并不是产品中的错误.那么这时我们需要对执行失败的场景恢复重新执行,确认其是否确实失败. 以前使用QTP的时候也使用了 ...

  2. Mabits简单应用 2017.8.3

    http://www.cnblogs.com/wushiqi54719880/archive/2011/07/26/2117601.html

  3. bmob云代码中生成缩略图

    function onRequest(request, response, modules) { var options = { url:"https://api.bmob.cn/1/ima ...

  4. [论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks

    概述 虽然CNN深度卷积网络在图像识别等领域取得的效果显著,但是目前为止人们对于CNN为什么能取得如此好的效果却无法解释,也无法提出有效的网络提升策略.利用本文的反卷积可视化方法,作者发现了AlexN ...

  5. 【NOIP模拟赛】随

    题目链接: 172.18.111.252:800/problem.php?cid=1001&pid=0 题解: 膜达神……(NOIP考这个就等爆零吧……) 显然我们得到一个结论:$ans=\s ...

  6. Git详解及github与gitlab使用

    第一章 关于版本控制 第二章 GIT简介 第三章 GIT安装 第四章 初次运行GIT前配置 第五章 初始化仓库 第六章 GIT命令操作 第七章 GIT分支结构

  7. SpringBoot集成Security,JWT,Swagger全分析

    GitHub地址: https://github.com/li-jun0201/springsecuritydemo本项目采用SpringBoot1.5.9, SpringSecurity,JWT, ...

  8. 大白话5分钟带你走进人工智能-第四节最大似然推导mse损失函数(深度解析最小二乘来源)(2)

    第四节  最大似然推导mse损失函数(深度解析最小二乘来源)(2) 上一节我们说了极大似然的思想以及似然函数的意义,了解了要使模型最好的参数值就要使似然函数最大,同时损失函数(最小二乘)最小,留下了一 ...

  9. 吴恩达深度学习笔记1-神经网络的编程基础(Basics of Neural Network programming)

    一:二分类(Binary Classification) 逻辑回归是一个用于二分类(binary classification)的算法.在二分类问题中,我们的目标就是习得一个分类器,它以对象的特征向量 ...

  10. Java开发必须掌握的线上问题排查命令

    作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题.这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查.由于在生产环境中,一般没办法 ...