java实现简单的orm_一种利用反射自动封装JavaBean的想法的实现(简单的ORM,较实用于JDBC查询)...
1.[代码]JavaBean小工具而已,还是挺方便的,你能懂得。
package com.cnlive.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSetMetaData;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.rowset.CachedRowSet;
public class BeanUtil {
private static Logger LOG = Logger.getLogger(Logger.class.getName());
/**
* 通过Bean对象获取查询语句
* @param obj 对象
* @param tableName 表名
* @return SQL
*/
public static String getSQLOfSelect(Object obj,String tableName) {
StringBuffer strBuffer = new StringBuffer("SELECT ") ;
Class extends Object> objClass = obj.getClass();
Field fields[] = objClass.getDeclaredFields();
for (Field field:fields) {
String methodName = field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
try {
if(null != objClass.getMethod("get"+methodName)){
strBuffer.append(field.getName()+",") ;
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
strBuffer.delete(strBuffer.length()-1, strBuffer.length());
strBuffer.append(" FROM "+ tableName);
LOG.info(strBuffer.toString());
return null;
}
/**
* 通过bean对象获取插入时的SQL
* @param obj java对象
* @param tableName 表名
* @return SQL
*/
public static String getSQLOfInsert(Object obj,String tableName) {
String strSQL = new String("INSERT INTO "+ tableName + "(#COLS) VALUES (#VALS)") ;
Class extends Object> objClass = obj.getClass();
Field fields[] = objClass.getDeclaredFields();
StringBuffer cols = new StringBuffer("") ;
StringBuffer values = new StringBuffer("");
for (Field field:fields) {
String methodName = "get"+ field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
try {
Method method = objClass.getMethod(methodName);
Object o = method.invoke(obj);
if(null != o){
cols.append(field.getName()+",") ;
if(o instanceof Integer || o instanceof Long || o instanceof Double){
values.append(o.toString() + ",");
}else if(o instanceof String){
values.append("'"+ o +"',");
}else if(o instanceof java.util.Date){
String datestr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((java.util.Date)o);
values.append("'"+ datestr +"',");
}else {
values.append("'"+ o.toString() +"',");
}
}
} catch (SecurityException e) {
e.printStackTrace();
continue;
} catch (NoSuchMethodException e) {
e.printStackTrace();
continue;
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
if(cols.length()>1 && values.length()>1){
cols.delete(cols.length()-1, cols.length());
values.delete(values.length()-1, values.length());
strSQL = strSQL.replace("#COLS", cols).replace("#VALS", values);
}else{
LOG.warning("警告:空对象无法完成操作啊");
return null ;
}
LOG.info(strSQL);
return strSQL;
}
/**
* 通过缓存结果集构造对象列表
* @param clazz javaBean类
* @param crs缓存结果集
* @return 对象列表
*/
public static List getBeanFormCacheRowSet(Class> clazz, CachedRowSet crs){
List result = new ArrayList();
try {
ResultSetMetaData md = crs.getMetaData();
int columnCount = md.getColumnCount();
Object o = null;
while (crs.next()) {
o = clazz.newInstance();
for (int i = 1; i <= columnCount; i++) {
if(crs.getObject(i) == null){
continue ;
}
md.getColumnType(i);
String className = md.getColumnClassName(i);
if("java.sql.Timestamp".equals(className) || "java.sql.Date".equals(className)){
className = "java.util.Date" ;
}else if("java.sql.Time".equals(className)){
className = "java.lang.String" ;
}else if("java.lang.Byte".equals(className) || "java.lang.Short".equals(className)){
className = "java.lang.Integer" ;
}
String methodName = "set"+md.getColumnName(i).substring(0,1).toUpperCase() + md.getColumnName(i).substring(1);
try{
clazz.getMethod(methodName,Class.forName(className)).invoke(o, crs.getObject(i));
}catch(NoSuchMethodException e){
LOG.warning("特殊类型字段导致表字段与JavaBean属性不对应!没有找到参数类型是["+className +"]的SETER方法:"+ methodName);
continue;
}
//System.out.println("className : " + className +" \tmethodName : " + methodName);
}
result.add(o);
}
}catch(Exception e){
e.printStackTrace();
}
return result;
}
}
java实现简单的orm_一种利用反射自动封装JavaBean的想法的实现(简单的ORM,较实用于JDBC查询)...相关推荐
- 利用反射自动封装成实体对象
利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 //获取页面数据,自动封装成bean对象pu ...
- 用计算机来唱歌,一种利用计算机软件自动教学乐器和唱歌的方法与流程
本发明涉及计算机领域,特别是一种利用计算机软件自动教学乐器和唱歌的方法. 背景技术: 随着家庭生活质量的提高,越来越多的家庭希望孩子掌握多方面知识,包括学习乐器和唱歌,但是在学习乐器或唱歌时,聘请老师 ...
- 用计算机唱歌教学,一种利用计算机软件自动教学乐器和唱歌的方法与流程
技术特征: 1.一种利用计算机软件自动教学乐器和唱歌的方法,其特征在于,包括如下步骤, 步骤一.构建软件合成器:对各种乐器的声音进行采样和滤波得到不同声音的物理仿真模型,对这些模型用软件算法实现模拟这 ...
- 一种利用人参酒自动诊断失眠的仪器
一种利用人参酒自动诊断失眠的仪器 一种利用人参酒自动诊断失眠的仪器 技术领域 本实用新型涉及一种利用人参酒自动诊断失眠的仪器,尤其是一种诊断失眠的仪器. 背景技术 现有诊断失眠的仪器是职业医师用来检查 ...
- java编程猜数字大小 (要求利用随机数自动生成一个0--100内的随机数字)
java编程猜数字(要求利用随机数自动生成一个0–100内的随机数字) public static void main(String[] args) {int num=(int)(Math.rando ...
- java 反射修改final变量_Java中final的属性值怎么利用反射机制进行修改
Java中final的属性值怎么利用反射机制进行修改 发布时间:2020-12-02 17:31:07 来源:亿速云 阅读:96 作者:Leah 今天就跟大家聊聊有关Java中final的属性值怎么利 ...
- Java反射机制:表单数据自动封装到JavaBean中【IT】
2019独角兽企业重金招聘Python工程师标准>>> (2010-07-09 19:50:18) 转载▼ 标签: it 分类: IT路人丁 利用Java的反射机制,模拟一个简单 ...
- java判断回文字符串几种简单的实现
11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进 ...
- java+swagger+侵入,一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案
一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案 一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案 作者:互联网活化石 来源:http://suo.im/5Si ...
最新文章
- 再温暖的鸡汤不如一场殊死的战争,诸神之战四赛区冠军出炉!
- UIWebView执行JS语句
- linux学习笔记4:linux的任务调度,进程管理,mysql的安装和使用,ssh工具的使用,linux网络编程...
- HDU 4893 线段树
- 解决-bash: make: command not found安装提示错误
- JavaScript中有关数据结构和算法的最佳书籍
- 打印杨辉三角(数组练习)
- python的模块和类_Python 模块和类
- MacOs提升效率必备软件
- 内存碎片的定义、种类、产生原因以及解决办法
- linux 如何把文件夹压缩文件,如何在Ubuntu桌面中将文件/文件夹压缩为.zip,tar.xz和7z格式...
- Detach Procedure
- WinSxS目录下文件的清除
- python Pmw的模块下载
- 1.Diagno-基本概述
- 怎么恢复电脑删除的文件,误删除数据恢复
- ARM的大端格式big endian、小端格式little endian和字word
- 适用于WF4.0的流程设计器 (Wxd.WF,BPM.Foundation,Wxwinter.WF 升级用)
- The softwares are used in Flex developing
- eSIM时代,运营商的末日还是新生
热门文章
- [论文评析]Balanced MSE for Imbalanced Visual Regression,CVPR,2022
- [FBCTF2019]RCEService
- 7-3 优美的括号序列
- 中小制造企业,如何选择信息系统
- 爬取了 31502 条北京自如租房数据,看看是否居者有其屋?
- 系统集成项目管理工程师备考资料(口袋应试第二版总结及目录)
- 鲸探发布点评:8月3日发售4款数字藏品
- linux各个发行版的区别
- SAP 出现“ LOAD_PROGRAM_CLASS_MISMATCH”解决方案
- 六 面向对象高级属性