知识大全 动态表单及动态建表实现原理

Posted

篇首语:人生处万类,知识最为贤。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 动态表单及动态建表实现原理相关的知识,希望对你有一定的参考价值。

   应用场景

  项目中往往需要动态的创建一个表单 或者添加一个新的数据模板 这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重

   实现工具

  Hibernate + Spring + Groovy +Freemarker

  Hibernate 作用很简单负责创建数据库表这样可以避免我们自己去写复杂的sql和判断

  Spring 作为桥梁起到连接纽带的作用

  Groovy做为动态语言 在项目运行时根据模板创建访问数据库 或者控制层代码

  Freamker 可以根据提前定义好的模板生成 hibernate配置文件 以及Groovy代码

   实现原理

  首先创建Form 和 FromAttribute 两张表关系一对多 Form表记录表单的名称 类别 甚至是作为在动态生成表单时的css样式信息 FromAttribute记录表单字段信息 如名称 类别等 有了表单以及表单项的信息后就可以创建数据库表了

  测试代码

  public void testGenerator()

  Form form = formService getAll() get( )

  List list = formAttributeService

   getAttributeListByFormId(form getId()) form setFormAttributeList(list) DbGenerator dg = new DbGenerator(form dataSource) dg generator()

  

  DbGenerator

  import java io IOException import java io StringWriter import java io Writer import java sql SQLException import java util HashMap import java util Map import java util Properties

  import javax sql DataSource

  import hibernate tool hbm ddl SchemaExport import slf j Logger import slf j LoggerFactory

  import freemarker template Configuration import freemarker template Template import freemarker template TemplateException

  public class DbGenerator

  private DataSource dataSource

  protected Map root = new HashMap()

  private static Logger log = LoggerFactory getLogger(FormGenerator class)

  protected String path

  protected String packageName

  private Form form

  protected Configuration getConfig(String resource)

  Configuration cfg = new Configuration()

  cfg setDefaultEncoding( UTF ) cfg setClassForTemplateLoading(this getClass() resource)

  return cfg

  

  public DbGenerator(Form form DataSource dataSource) this form = form this dataSource = dataSource

  

  public void generator()

  if(null == form getFormAttributeList() || form getFormAttributeList() size() == )

  return

  

  Template t

  try

  t = getConfig( /template ) getTemplate( hibernate ftl )

  Writer out = new StringWriter()

  t process(getMapContext() out) String xml = out toString()

  createTable(xml)

  log debug(xml)

   catch(IOException e)

  e printStackTrace()

   catch(TemplateException e)

  e printStackTrace()

  

  @SuppressWarnings( unchecked )

  Map getMapContext()

  root put( entity form)

  return root

  

  public void createTable(String xml)

   hibernate cfg Configuration conf = new hibernate cfg Configuration() nfigure( /hibernate/hibernate cfg xml )

  Properties extraProperties = new Properties()

  extraProperties put( hibernate hbm ddl auto create ) conf addProperties(extraProperties)

  conf addXML(xml)

  SchemaExport dbExport

  try

  dbExport = new SchemaExport(conf dataSource getConnection()) // dbExport setOutputFile(path) dbExport create(false true)

   catch(SQLException e)

  // TODO Auto generated catch block

  e printStackTrace()

  

  

  class hibernateGenerator

  hibernate ftl

  hibernate cfg xml

   hibernate dialect SQLServerDialect

  net sourcefe jtds jdbc Driver

  jdbc jtds sqlserver:// databasename=struts SelectMethod=cursor

  sa

  sa

  true

  update

  ——>

  创建好数据库后就要利用groovy动态创建访问代码了 先看测试代码再看具体实现

  public void testGroovy()

  Form form = formService get( )

  List list = formAttributeService

   getAttributeListByFormId(form getId()) form setFormAttributeList(list)

  FormGenerator fg = new FormGenerator(form)

  String groovycode = fg generator() ClassLoader parent = getClass() getClassLoader()

  GroovyClassLoader loader = new GroovyClassLoader(parent)

  Class groovyClass = loader parseClass(groovycode)

  GroovyObject groovyObject = null

  try

  groovyObject = (GroovyObject) groovyClass newInstance()

   catch(InstantiationException e)

  e printStackTrace()

   catch(IllegalAccessException e)

  e printStackTrace()

  

  // map中key为formAttribute中描述该表单字段在数据库中的名称c_columnName

  //具体情况根据formAttribute而定

  Map map = new HashMap()

  map put( name limq )

  //调用insert方法插入数据

  int c = (Integer) groovyObject invokeMethod( insert map)

  //调用getAll方法获得所有动态表中的数据

  Object o = groovyObject invokeMethod( getAll null)

  List list =(List)o

  Object obj = list get( )

  try

  String tname = (String) BeanUtils getDeclaredProperty(obj name ) System out println(tname)

   catch(IllegalAccessException e)

  e printStackTrace()

   catch(NoSuchFieldException e)

  e printStackTrace()

  

  //调用search方法查询动态表

  List returnList = (List) groovyObject invokeMethod( search map)

  for(Map map returnList)

  //同理此处根据FromAttribute而定

  System out println(map get( id )) System out println(map get( name )) System out println(map get( type ))

  

  FormGenerator 创建访问数据库Groovy代码

  public class FormGenerator

  protected Map root = new HashMap()

  private static Logger log = LoggerFactory getLogger(FormGenerator class)

  protected String path

  protected String packageName

  private Form form

  protected Configuration getConfig(String resource)

  Configuration cfg = new Configuration()

  cfg setDefaultEncoding( UTF ) cfg setClassForTemplateLoading(this getClass() resource)

  return cfg

  

  public FormGenerator(Form form)

  this form = form

  

  public String generator()

  String returnstr = null

  Template t

  try

  t = getConfig( /template ) getTemplate( FormService ftl ) //Writer out = new OutputStreamWriter(new FileOutputStream(new File(path)) UTF )

  Writer out = new StringWriter()

  t process(getMapContext() out) returnstr = out toString() log debug(returnstr)

   catch(IOException e)

  e printStackTrace()

   catch(TemplateException e)

  e printStackTrace()

  

  return returnstr

  

  @SuppressWarnings( unchecked )

  Map getMapContext()

  root put( entity form) root put( insert SqlHelper buildInsertStatement(form)) root put( update SqlHelper buildUpdateStatement(form))

  root put( insertParameter SqlHelper buildInsertparameter(form)) root put( updateParameter SqlHelper buildUpdateparameter(form))

  root put( delete SqlHelper buildDeleteStatement(form)) root put( query   SqlHelper buildQueryStatement(form))

  return root

  

  FormService ftl import java sql ResultSet import java sql SQLException import java sql Types import sprire RowMapper import sprire RowMapperResultSetExtractor import re dao DataSourceFactory import mons lang builder ToStringBuilder import mons lang builder ToStringStyle

  class $entity name?cap_firstDao

  def insert = $insert

  def delete = $delete

  def update = $update

  def int insert(entity)

  def Object[] params = [$insertParameter]

  def int[] types=[Types VARCHAR ] return DataSourceFactory getJdbcTemplate() update(insert params types)

  

  def int update(entity)

  def Object[] params = [$updateParameter]

  return DataSourceFactory getJdbcTemplate() update(update params)

  

  def int delete(String entityId)

  def Object[] params =[entityId]

  return DataSourceFactory getJdbcTemplate() update(delete params)

  

  def search(entity)

  $query

  println(query)

  return DataSourceFactory getJdbcTemplate() queryForList(query)

  

  

cha138/Article/program/Java/hx/201311/25599

相关参考

动态仓筒式污泥堆肥处理技术

成立于2012年的一家以色列小型环保企业,业务领域涉及污水厂污泥,工业污泥,粪肥,动物尸体等有机废物的处理。该公司自主研发出一项污泥加速堆肥技术,且已通过以色列环保部的验证及推广,该技术基于转鼓原理,

动态仓筒式污泥堆肥处理技术

成立于2012年的一家以色列小型环保企业,业务领域涉及污水厂污泥,工业污泥,粪肥,动物尸体等有机废物的处理。该公司自主研发出一项污泥加速堆肥技术,且已通过以色列环保部的验证及推广,该技术基于转鼓原理,

动态仓筒式污泥堆肥处理技术

成立于2012年的一家以色列小型环保企业,业务领域涉及污水厂污泥,工业污泥,粪肥,动物尸体等有机废物的处理。该公司自主研发出一项污泥加速堆肥技术,且已通过以色列环保部的验证及推广,该技术基于转鼓原理,

知识大全 PB动态报表的实现

PB动态报表的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  实现原理  PowerBuil

为什么说专用生物肥是动态的技术化石?

专用生物肥是济宁三环化工有限公司与山东农业大学强强联合,以山东农业大学国家作物重茬课题组为技术依托,采用目前最新的第三代生物技术(PGPR),根据根际土壤微生态学原理、植物营养生理学原理以及现代“有机

为什么说专用生物肥是动态的技术化石?

专用生物肥是济宁三环化工有限公司与山东农业大学强强联合,以山东农业大学国家作物重茬课题组为技术依托,采用目前最新的第三代生物技术(PGPR),根据根际土壤微生态学原理、植物营养生理学原理以及现代“有机

知识大全 Java动态代理机制综合分析及扩展

Java动态代理机制综合分析及扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态代

知识大全 .net中申请单动态添加实现方法及代码

  一个申请单可以包含N个项目添加申请单时就需要动态加入代码了  动态Table表格  <tableborder=width=%id=tabzxname=tabzxalign=centercla

知识大全 .net中申请单动态添加实现方法及代码[1]

  一个申请单可以包含N个项目添加申请单时就需要动态加入代码了  动态Table表格<tableborder=width=%id=tabzxname=tabzxalign=centerclass

知识大全 GridView 动态添加列的方法及代码

GridView动态添加列的方法及代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &