- 浏览: 320126 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ajax忘了跳转:
谢谢分享,基于你的思路。我改良了一版,可供参考public s ...
一个整数的所有最小因子 -
baobaodehao1991:
楼主,合并多列,单元格内容并不能居中,选中合并的单元格,除了前 ...
把table表格内容导出为excel -
lbaaixy:
楼主,小弟最近也在弄这个东西。有点小问题java.lang.C ...
flex + red5实现视频会议 -
weilikk:
好像只能替换整行,如果是一行中有其他数据,只替换行中某个位置就 ...
poi替换模板标签为图片 -
chinaxiaofeng8:
在吗,兄弟,你那个代码怎么运行看效果的
flex + red5实现视频会议
利用xml做配置文件,可以动态生成sql:
package com.landray.kmss.util; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.mira.lucene.analysis.c; import org.springframework.jdbc.core.JdbcTemplate; import com.landray.kmss.sys.transport.model.Exam; /** * createBy Zhang Yanan * * createTime 2012-6-14 下午03:53:19 * * desc 类和表的映射工具 * */ public class MappingUtil { private JdbcTemplate jdbcTemplate; private JdbcTemplate jdbcTemplateAssist; public MappingUtil(JdbcTemplate jdbcTemplate,JdbcTemplate Assist){ this.jdbcTemplate = jdbcTemplate; this.jdbcTemplateAssist = jdbcTemplateAssist; } public MappingUtil(){ } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public JdbcTemplate getJdbcTemplateAssist() { return jdbcTemplateAssist; } public void setJdbcTemplateAssist(JdbcTemplate jdbcTemplateAssist) { this.jdbcTemplateAssist = jdbcTemplateAssist; } //从Object[] 转为Bean public Object fromObject2Bean(Class c ,Object[] o) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Object ob = c.newInstance(); Method[] f = c.getMethods(); String path = this.getXmlFileName(c); Map map = this.readXml(path); for(int i=0;i<f.length;i++){ Method method = f[i]; String methodName = method.getName(); if(methodName.startsWith("set")){ String fieldName = methodName.replace("set", ""); String upChar = fieldName.charAt(0)+""; fieldName=fieldName.replace(upChar,upChar.toLowerCase()); String order = (String)map.get(fieldName); method.invoke(ob, o[Integer.valueOf(order)-1]); } } return ob; } //获取class获取映射文件位置 private String getXmlFileName(Class c){ String path = ""; String xml = c.getName().substring((c.getName().lastIndexOf("."))+1)+".xml"; path = c.getResource(xml).toString(); return path; } //读取xml,把属性,顺序放入map private Map readXml(String path){ Map map = new HashMap(); SAXBuilder sb = new SAXBuilder(); try { Document myDocument = sb.build(path); Element root = myDocument.getRootElement(); Element table = root.getChild("table"); List<Element> list = table.getChildren("property"); for(Element e:list){ String order = e.getAttributeValue("order"); String name = e.getAttributeValue("name"); map.put(name, order); } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return map; } //读取xml,把属性名,表字段放入map private Map readXmlForsql(String path){ Map map = new HashMap(); SAXBuilder sb = new SAXBuilder(); try { Document myDocument = sb.build(path); if(myDocument==null){ throw new RuntimeException("请检查xml的路径"); } Element root = myDocument.getRootElement(); Element table = root.getChild("table"); List<Element> list = table.getChildren("property"); String tableName = table.getAttributeValue("name"); map.put("table_name", tableName); for(Element e:list){ String column = e.getAttributeValue("column"); String name = e.getAttributeValue("name"); map.put(name, column); } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return map; } //根据对象转换插入sql语句 public String fromBean2InsertSql(Object o){ StringBuilder sb = new StringBuilder(); // System.out.println(o.getClass()); String path = this.getXmlFileName(o.getClass()); Map map = this.readXmlForsql(path); sb.append("insert into "+map.get("table_name")); map.remove("table_name"); Set set = map.entrySet(); Iterator it = set.iterator(); StringBuilder columns = new StringBuilder(); StringBuilder values = new StringBuilder(); columns.append("("); values.append("("); while(it.hasNext()){ Map.Entry e = (Map.Entry)it.next(); columns.append(e.getValue()+","); Object ob = this.getValueOfObject(o, e.getKey().toString()); if(null == ob){ values.append("null,"); }else{ values.append("'"+ob+"',"); } } String cStr = columns.toString().substring(0, columns.toString().length()-1); String vStr = values.toString().substring(0,values.toString().length()-1); sb.append(cStr+")"); sb.append(" values "); sb.append(vStr+")"); return sb.toString(); } //根据属性名称获取对象该属性的值 public Object getValueOfObject(Object ob,String field){ Object o = new Object(); String s = field.substring(0,1); String fieldNew = s.toUpperCase()+field.substring(1,field.length()); String method = "get"+fieldNew; try { try { Method m = ob.getClass().getMethod(method); o = m.invoke(ob); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return o; } //根据id和class生成删除sql public String getDeleteSql(Class c,String id){ String path = this.getXmlFileName(c); Map map = this.readXmlForsql(path); String sql = "delete from "+map.get("table_name")+" where fd_id='"+id+"'"; return sql; } //根据对象生成更新sql public String getUpdateSql(Object o){ StringBuilder sb = new StringBuilder(); String path = this.getXmlFileName(o.getClass()); Map map = this.readXmlForsql(path); sb.append("update "+map.get("table_name")); //把主键和表名移除,全剩属性 map.remove("fdId"); map.remove("table_name"); Set set = map.entrySet(); Iterator it = set.iterator(); StringBuilder values = new StringBuilder(); values.append(" set "); while(it.hasNext()){ Map.Entry e = (Map.Entry)it.next(); Object ob = this.getValueOfObject(o, e.getKey().toString()); if(null == ob){ values.append(e.getValue()+"=null"); }else{ values.append(e.getValue()+"='"+ob+"',"); } } String vStr = values.toString().substring(0,values.toString().length()-1); sb.append(vStr); //主键地方需要改进 sb.append(" where fd_id= '"+getValueOfObject(o,"fdId")+"'"); return sb.toString(); } //把一个List<Object[]> 转为List<Bean> public List<?> getBeanListFromObjectArrList(List<Object[]> list, Class c ){ List newList = new ArrayList (); for(Object[] o:list){ try{ Object ob = this.fromObject2Bean(c, o); newList.add(ob); }catch(Exception e){ e.printStackTrace(); } } return newList; } //根据对象生成查询sql public String getQuerySqlFromBean(Object o){ StringBuilder sb = new StringBuilder(); String path = this.getXmlFileName(c.class); Map map = this.readXmlForsql(path); sb.append("select * from "+map.get("table_name")+" where 1 = 1"); map.remove("table_name"); map.remove("fdId"); Set set = map.entrySet(); sb.append(this.getFilterSql(set, o)); return sb.toString(); } //生成过滤条件语句 public String getFilterSql(Set set,Object o){ StringBuilder sb = new StringBuilder(); Iterator it = set.iterator(); while(it.hasNext()){ Map.Entry e = (Map.Entry)it.next(); Object ob = this.getValueOfObject(o, e.getKey().toString()); if(null != ob && !ob.toString().equals("")){ sb.append(" and "+e.getValue()+"='"+ob+"'"); } } return sb.toString(); } //查询数目语句 public String getCountSqlFromBean(Object o){ StringBuilder sb = new StringBuilder(); String path = this.getXmlFileName(c.class); Map map = this.readXmlForsql(path); sb.append("select count(0) from "+map.get("table_name")+" where 1 = 1"); map.remove("table_name"); map.remove("fdId"); Set set = map.entrySet(); sb.append(this.getFilterSql(set, o)); return sb.toString(); } //生成查询分页语句 public String getQuerySqlFromBean(Object o,int pageNo,int pageSize){ String sql = this.getQuerySqlFromBean(o); sql += " limit "+(pageNo-1)*pageSize+","+pageSize; return sql; } //根据id和class返回对象 public Object getBeanById(Class c,String id){ String path = this.getXmlFileName(c); Map map = this.readXmlForsql(path); String table = map.get("table_name").toString(); //此处主键需要改进 String sql = "select * from "+table+" where fd_id='"+id+"'"; List<Object[]> list = JdbcTemplateUtil.getObjectList(jdbcTemplateAssist, sql); Object[] o = list.get(0); Object ob = new Object(); try{ ob = this.fromObject2Bean(c, o); }catch(Exception e){ e.printStackTrace(); } return ob; } //根据过滤条件生成查询sql public String getQuerySqlFromFilters(Class c,Map equilFilter,Map likeFilter){ StringBuilder sb = new StringBuilder(); String path = this.getXmlFileName(c); Map map = this.readXmlForsql(path); sb.append("select * from "+map.get("table_name")+" where 1 = 1"); sb.append(this.createrSqlByFilters(equilFilter, likeFilter)); return sb.toString(); } //生成过滤条件的sql public String createrSqlByFilters(Map equilFilter,Map likeFilter){ StringBuilder sb = new StringBuilder(); Set eSet = equilFilter.entrySet(); Iterator eIt = eSet.iterator(); while(eIt.hasNext()){ Map.Entry e = (Map.Entry)eIt.next(); if(null != e.getValue() && !"".equals(e.getValue().toString())){ sb.append(" and "+e.getKey()+"='"+e.getValue()+"'"); } } Set lSet = likeFilter.entrySet(); Iterator lIt = lSet.iterator(); while(lIt.hasNext()){ Map.Entry e = (Map.Entry)lIt.next(); if(null != e.getValue() && !"".equals(e.getValue().toString())){ sb.append(" and "+e.getKey()+" like '%"+e.getValue()+"%'"); } } return sb.toString(); } //根据过滤条件生成分页 public String getQuerySqlFromFilters(Class c,Map equilFilter,Map likeFilter,int pageNo,int pageSize){ String sql = this.getQuerySqlFromFilters(c, equilFilter, likeFilter); sql += " limit "+(pageNo-1)*pageSize+","+pageSize; return sql; } //根据过滤条件查询数目 public String getCountSqlFromFilters(Class c,Map equilFilter,Map likeFilter){ String path = this.getXmlFileName(c); Map map = this.readXmlForsql(path); StringBuilder sb = new StringBuilder(); sb.append("select count(0) from "+map.get("table_name")+" where 1 = 1"); sb.append(this.createrSqlByFilters(equilFilter, likeFilter)); return sb.toString(); } /** * @param args * @throws IllegalAccessException * @throws InstantiationException * @throws InvocationTargetException * @throws IllegalArgumentException */ public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { MappingUtil u = new MappingUtil(); Class c = Exam.class; Object[] o = new Object[4]; o[0]="1"; o[1]="2"; o[2]="3"; o[3]="4"; u.fromObject2Bean(c, o); Exam e = new Exam(); e.setFdAddress("地址"); e.setFdId("1"); e.setFdContent("备注"); e.setFdTime("2012-06-14"); System.out.println(u.fromBean2InsertSql(e)); System.out.println(u.getUpdateSql(e)); System.out.println(u.getDeleteSql(c, e.getFdId())); } }
Exam.xml
<?xml version="1.0" encoding="UTF-8"?> <root> <table name="exam_info"> <property name="fdId" column="fd_id" order="1"/> <property name="fdAddress" column="fd_address" order="2"/> <property name="fdTime" column="fd_time" order ="3"/> <property name="fdContent" column="fd_content" order="4"/> <property name="fdOperatorId" column="fd_operator_id" order="5"/> <property name="fdOparatorName" column="fd_operator_name" order="6"/> <property name="fdCreateTime" column="fd_create_time" order="7"/> <property name="fdAlterTime" column="fd_alter_time" order="8"/> <property name="fdIsAbandon" column="fd_is_abandon" order="9"/> <property name="fdName" column="fd_name" order="10"/> </table> </root>
Exam.java
package com.landray.kmss.sys.transport.model; public class Exam { private String fdId; private String fdAddress; private String fdTime; private String fdContent; private String fdOperatorId; private String fdOparatorName; private String fdCreateTime; private String fdAlterTime; private String fdIsAbandon; private String fdName; public String getFdName() { return fdName; } public void setFdName(String fdName) { this.fdName = fdName; } public String getFdId() { return fdId; } public void setFdId(String fdId) { this.fdId = fdId; } public String getFdAddress() { return fdAddress; } public void setFdAddress(String fdAddress) { this.fdAddress = fdAddress; } public String getFdTime() { return fdTime; } public void setFdTime(String fdTime) { this.fdTime = fdTime; } public String getFdContent() { return fdContent; } public void setFdContent(String fdContent) { this.fdContent = fdContent; } public String getFdOperatorId() { return fdOperatorId; } public void setFdOperatorId(String fdOperatorId) { this.fdOperatorId = fdOperatorId; } public String getFdOparatorName() { return fdOparatorName; } public void setFdOparatorName(String fdOparatorName) { this.fdOparatorName = fdOparatorName; } public String getFdCreateTime() { return fdCreateTime; } public void setFdCreateTime(String fdCreateTime) { this.fdCreateTime = fdCreateTime; } public String getFdIsAbandon() { return fdIsAbandon; } public void setFdIsAbandon(String fdIsAbandon) { this.fdIsAbandon = fdIsAbandon; } public String getFdAlterTime() { return fdAlterTime; } public void setFdAlterTime(String fdAlterTime) { this.fdAlterTime = fdAlterTime; } }
该表的sql
/* Navicat MySQL Data Transfer Source Server : Source Server Version : 50145 Source Host : Source Database : china Target Server Type : MYSQL Target Server Version : 50145 File Encoding : 65001 Date: 2012-06-16 16:48:20 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `exam_info` -- ---------------------------- DROP TABLE IF EXISTS `exam_info`; CREATE TABLE `exam_info` ( `fd_id` varchar(36) NOT NULL DEFAULT '', `fd_address` varchar(100) DEFAULT NULL, `fd_time` varchar(100) DEFAULT NULL, `fd_content` varchar(500) DEFAULT NULL, `fd_operator_id` varchar(36) DEFAULT NULL, `fd_operator_name` varchar(50) DEFAULT NULL, `fd_create_time` varchar(20) DEFAULT NULL, `fd_alter_time` varchar(20) DEFAULT NULL, `fd_is_abandon` varchar(5) DEFAULT NULL, `fd_name` varchar(50) DEFAULT NULL, PRIMARY KEY (`fd_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of exam_info -- ---------------------------- INSERT INTO `exam_info` VALUES ('137ef3d1a4d9b4c5d88591a43a78ccc7', '天津第一高级中学', '2012-03-30 09:00:00', '考试说明', '12f67c5cfba228b501b8f464308b5cd5', '培训主管', '2012-06-15 04:23:22', '2012-06-15 04:46:22', '0', '2012第一季度考试'); INSERT INTO `exam_info` VALUES ('137ef531c4680441617a0dd4741ba97c', '第一实验小学', '2012-06-30 16:46:00', '22', '12f67c5cfba228b501b8f464308b5cd5', '培训主管', '2012-06-15 04:47:10', '2012-06-15 04:47:14', '0', '天津第二季度考试'); INSERT INTO `exam_info` VALUES ('137f3f66306e18d3d79ba7f46c69efa8', '天津第一高级中学', '2012-09-29 14:23:00', '', '12f67c5cfba228b501b8f464308b5cd5', '培训主管', '2012-06-16 02:23:59', '2012-06-16 02:23:59', '0', '2012第三季度考试'); INSERT INTO `exam_info` VALUES ('137f3f7df45447143f7130148fba42ad', '天津实验小学', '2012-12-16 14:25:00', '', '12f67c5cfba228b501b8f464308b5cd5', '培训主管', '2012-06-16 02:25:37', '2012-06-16 02:25:37', '0', '2012天津第四季度');
目前只支持String类型的.......
评论
7 楼
蚊子草
2013-03-11
|
6 楼
hanmiao
2012-11-26
我对楼主的这段代码的理解是:只能转换数据库中除了 boolean 型以外的其它字段,对吗?
如果有 boolean 型对象,通常用的是 isTrue() 这种方法。
如果有 boolean 型对象,通常用的是 isTrue() 这种方法。
if(methodName.startsWith("set")){ String fieldName = methodName.replace("set", ""); String upChar = fieldName.charAt(0)+""; fieldName=fieldName.replace(upChar,upChar.toLowerCase()); String order = (String)map.get(fieldName); method.invoke(ob, o[Integer.valueOf(order)-1]); }
5 楼
yang8820
2012-09-04
想法很好!
个人觉得还你的更新数据库语句存在安全问题,所有的值还不能有英文单引号“'”。
个人觉得还你的更新数据库语句存在安全问题,所有的值还不能有英文单引号“'”。
4 楼
lwkjob
2012-08-15
本来是点击顶的 手一抖就点到踩了....楼组很强大 支持分享代码
3 楼
zyn010101
2012-07-18
yaolifei 写道
你这个工具所有表的主键必须是fd_id? bean中必须是fdId? 联合主键呢? 应该直接从数据库中去获取某个表的主键列吧
这个是自己写的一个小玩意儿,还不完善,呵呵。
2 楼
yaolifei
2012-07-18
你这个工具所有表的主键必须是fd_id? bean中必须是fdId? 联合主键呢? 应该直接从数据库中去获取某个表的主键列吧
1 楼
zongshoujin
2012-06-17
不错哦!可以借鉴一下!呵呵
发表评论
-
仿微信9宫格群组头像
2015-07-14 20:27 13255开发了一个聊天工具,群组头像像仿照微信的头像那样显示成员头像合 ... -
汉字转拼音
2015-06-18 13:44 1029/* * Copyright (C) 2011 The ... -
poi替换模板标签为图片
2013-08-19 14:49 8807在问答频道看到有人求poi模板替换图片的需求,百度一下,网上没 ... -
为hibernate添加数据库方言函数
2013-06-27 19:31 5162在sessionFactory中配置hibernate.dia ... -
jvm内存映像分析
2013-05-23 20:11 6363jdk自带的jmap就是java内存映像工具,可以 ... -
n个数组各取一数的不重复组合
2013-04-27 00:00 2856package collection; import ... -
求最长的递增子数组
2013-04-24 13:58 1308package com.chinahrt.zyn.pang ... -
从m个字符选出n个的所有组合
2013-04-23 15:49 1468import java.util.ArrayList;imp ... -
查找最小的K个数
2013-04-13 12:04 1533package com.chinahrt.zyn.pango ... -
求连续子数组的最大和
2013-04-11 17:27 1419package com.chinahrt.zyn.pang ... -
求N个字符的全排列
2013-04-10 10:55 1680package com.chinahrt.zyn.pango ... -
web.xml的读取顺序
2013-03-30 11:22 4340由于项目中 ... -
spring的bean实例化时间
2013-03-30 10:54 2517前两天在问答频道看到有同学问spring的b ... -
把table表格内容导出为excel
2012-12-21 13:54 6035package com.chinahrt.report.e ... -
Java 编程规则(think in java 第四版)
2012-11-22 13:38 1166(1) 类名首字母应该大写 ... -
jetty嵌入式使用方法
2012-09-17 16:08 12032以jetty-hightide-8.1.6.v20120903 ... -
jmail接收邮件(转)
2012-08-07 10:57 2874package com.chinahrt.zyn; im ... -
java求集合交集和并集
2012-07-17 20:16 3469在问答频道遇到求助集合求交集或者并集的问题,自己翻了下api, ... -
应该被记住的 8 位 Java 人物
2012-06-27 21:54 826应该被记住的 8 位 Java 人物 81人收藏此新闻, ... -
tomcat源码阅读(一)
2012-04-06 13:13 0次处代码以tomcat_6_0_18版本为例,从官 ...
相关推荐
orm工具,用于映射数据库中的表生成对应的C#类
AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DTO,一般用于ViewModel模式和跨 服务范畴。AutoMapper给用户提供了便捷的配置API,就像使用约定来完成自动映射那样。...
dbVisitor 是一个数据库 ORM 工具。提供对象映射、丰富的类型处理、动态SQL、存储过程、内置分页方言20+、 支持嵌套事务、多数据源、条件构造器、INSERT 策略、多语句/多结果。兼容 Spring 及 MyBatis 用法。 它不...
ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和...
对象关系映射的概念,及相应Hibernate的使用规范,同时通过实例展示到底什么是对象关系映射。
NULL 博文链接:https://1194867672-qq-com.iteye.com/blog/1729404
该源码是关系映射(ORM)工具,源码DBFlow,DBFlow是一个快速简单的sqlite对象/关系映射(ORM)工具。基于注解。该项目参考了Active Android,Schematic,Ollie, 和Sprinkles等开源库。
用对象关系映射的方式来查询数据库数据,让使用者更加方便,减少代码冗余
由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类、Dao接口类甚至Mapping映射文件。
NULL 博文链接:https://dreamzhong.iteye.com/blog/1205496
AndroidInject增加sqlite3数据库映射注解(ORM).rar
摘要:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】是一款专门为.Net数据库程序开发量身定做的(ORM框架)代码生成工具,所生成的程序代码基于面向对象、分层架构、ORM及反射+工厂设计模式等。支持.Net1.1...
利用Java反射和注解实现自定义的ORM,并提供相应的工具类自动生成CRUD的SQL语句,同时定义了完整的异常处理机制
上次发了个用asp.net写的源码,这次因为自己写了个ORM,所以正好修改了这个论坛源码。整个源码包含一个论坛源码和一个ORM的实体和映射文件生成工具源码。
通过在应用程序和数据访问语言(SQL、LINQ等)之间引入一个层,您将看到它们如何提供不同级别的抽象和工具,以便以与数据库无关的方式编写数据访问代码。在这本书的结尾,您将有信心使用范围广泛的Aurelius特性,使您...
NULL 博文链接:https://yongboy.iteye.com/blog/549243
YB.ORM是用于C ++的对象关系映射(ORM)的工具。 受到Hibernate或SQLAlchemy之类的启发。 应该与数据库无关。 包括用于域对象代码生成的工具。 表的元数据描述是一个XML文件。
所有数据库的操作默认以实体对应表的主键(可以是联合主键)为准,当然也可指定,如增加和更新合并为一个保存操作,由实体自己判断是增加还是更新,若你愿意也可以分开来做,实体也提供了对应的快捷方式等。...
1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以...
flywheel:Amazon DynamoDB 的对象映射工具