- 浏览: 325660 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 13440开发了一个聊天工具,群组头像像仿照微信的头像那样显示成员头像合 ... -
汉字转拼音
2015-06-18 13:44 1082/* * Copyright (C) 2011 The ... -
poi替换模板标签为图片
2013-08-19 14:49 8999在问答频道看到有人求poi模板替换图片的需求,百度一下,网上没 ... -
为hibernate添加数据库方言函数
2013-06-27 19:31 5247在sessionFactory中配置hibernate.dia ... -
jvm内存映像分析
2013-05-23 20:11 6439jdk自带的jmap就是java内存映像工具,可以 ... -
n个数组各取一数的不重复组合
2013-04-27 00:00 2905package collection; import ... -
求最长的递增子数组
2013-04-24 13:58 1364package com.chinahrt.zyn.pang ... -
从m个字符选出n个的所有组合
2013-04-23 15:49 1524import java.util.ArrayList;imp ... -
查找最小的K个数
2013-04-13 12:04 1599package com.chinahrt.zyn.pango ... -
求连续子数组的最大和
2013-04-11 17:27 1482package com.chinahrt.zyn.pang ... -
求N个字符的全排列
2013-04-10 10:55 1739package com.chinahrt.zyn.pango ... -
web.xml的读取顺序
2013-03-30 11:22 4404由于项目中 ... -
spring的bean实例化时间
2013-03-30 10:54 2581前两天在问答频道看到有同学问spring的b ... -
把table表格内容导出为excel
2012-12-21 13:54 6151package com.chinahrt.report.e ... -
Java 编程规则(think in java 第四版)
2012-11-22 13:38 1222(1) 类名首字母应该大写 ... -
jetty嵌入式使用方法
2012-09-17 16:08 12161以jetty-hightide-8.1.6.v20120903 ... -
jmail接收邮件(转)
2012-08-07 10:57 2937package com.chinahrt.zyn; im ... -
java求集合交集和并集
2012-07-17 20:16 3519在问答频道遇到求助集合求交集或者并集的问题,自己翻了下api, ... -
应该被记住的 8 位 Java 人物
2012-06-27 21:54 878应该被记住的 8 位 Java 人物 81人收藏此新闻, ... -
tomcat源码阅读(一)
2012-04-06 13:13 0次处代码以tomcat_6_0_18版本为例,从官 ...
相关推荐
NHibernate是一个开源的ORM框架,它提供了对.NET应用程序和各种关系型数据库之间的映射功能。通过NHibernate,开发人员可以将数据库中的表映射到C#类,这些类可以直接操作,而无需编写大量的SQL语句。 映射过程主要...
ORM映射,全称为Object-Relational Mapping,是对象关系映射,是现代Web应用程序中一个重要的技术。它提供了一种方式,将数据库中的表结构映射为编程语言中的对象,使得开发者可以使用面向对象的方式来操作数据库,...
AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DTO,一般用于ViewModel模式和跨 服务范畴。AutoMapper给用户提供了便捷的配置API,就像使用约定来完成自动映射那样。...
ORM 技术包括以下四部分:一个对持久类对象进行 CRUD 操作的 API;一个语言或 API 用来规定与类和类属性相关的查询;一个规定 mapping metadata 的工具;一种技术可以让 ORM 的实现同事务对象一起进行 dirty ...
在本主题中,我们讨论的是一个自定义的 ORM 工具,它专为作者自己的框架设计,旨在提高开发效率和代码的可维护性。 【描述】:虽然描述为空,但根据“博文链接:https://mojianpo.iteye.com/blog/1179698”可以推测...
在你开发的小型ORM项目中,包含了一个代码生成工具,这通常是为了简化开发过程,自动生成与数据库表结构对应的实体类、数据访问接口以及实现。通过这种方式,开发者只需要关注业务逻辑,而无需手动编写繁琐的数据库...
这个工具提供了一个可视化界面,允许开发者通过拖放类图元素来创建和设计ORM模型。 在该描述中,我们了解到这个特定的ORM工具是基于DELPHI开发的,这意味着它充分利用了DELPHI的VCL(Visual Component Library)...
Spot2是一个针对MySQL数据库的Object-Relational Mapping (ORM)工具,主要应用于PHP开发环境。ORM是一种编程技术,它允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句,从而提高了代码的可读性、可...
而`chm`文件则可能是一个帮助文档,包含工具的使用指南、API参考、示例代码等内容,帮助用户更好地理解和使用这款ORM工具。 学习和掌握ORM工具是现代.NET开发中的重要技能之一,它能提升开发效率,降低维护成本,...
SqlSugar是一个在中国广泛使用的对象关系映射(ORM)框架,它极大地简化了.NET开发者与数据库交互的工作。ORM工具箱如SqlSugar,通过提供高级抽象,允许程序员以面向对象的方式处理数据库操作,而无需直接编写SQL...
【标题】:“手写ORM”指的是自己动手实现Object-Relational Mapping(对象关系映射)技术,这是一种在软件开发中将数据库操作与业务逻辑解耦的方法。ORM允许开发者使用面向对象的方式来操作数据库,无需关心底层SQL...
ORM的核心思想是将数据库中的表与程序中的类进行映射,表中的行映射为类的实例,表中的列映射为类的属性。这样,当我们在程序中操作对象时,实际上是在操作数据库中的数据。ORM框架会自动处理SQL的生成和执行,以及...
本文将详细探讨一个名为“K-ORM”的自定义ORM工具,该工具基于JDBC和Java反射机制实现,旨在提供简单易用的数据操作接口。 首先,我们要理解JDBC(Java Database Connectivity)在其中的角色。JDBC是Java平台上的...
以NHibernate为例,它是.NET平台上一个非常流行的ORM框架,能够处理.NET 2.0的应用程序。NHibernate允许开发者定义对象-关系映射配置,通常是XML文件或者使用Fluent NHibernate(一种更直观的API)来配置。一旦配置...
你可能实现了一个简单的会话接口或类,供用户进行数据库操作。 5. **结果集映射**:框架需要能够将数据库查询的结果映射为Java对象,这可能通过自定义的映射逻辑或自动类型转换来实现。 6. **接口与注解**:为了让...
在本课程"02-01-11-基于Spring JDBC手写定制自己的ORM框架1"中,我们将探讨如何利用Spring的JdbcTemplate设计理念,来构建一个自定义的ORM(对象关系映射)框架。ORM框架的主要目的是简化Java应用程序与数据库之间的...
本篇文章将详细介绍一个基于注解的HBase ORM小工具,帮助你更好地理解和应用。 **ORM简介** ORM,全称Object-Relational Mapping,是将关系数据库的数据映射到对象模型的一种技术。它简化了数据库与程序之间的交互...
“生成工具”通常是指能够自动生成ORM映射代码或数据库架构的工具,这些工具可以帮助开发者快速地建立模型和数据库之间的关联,减少手动编写SQL和映射代码的工作量。例如,Entity Framework的Code First开发模式就...