这里模拟一下Hibernate的save,初试OR Mapping。

首先建立JavaBean student类。

student.java

package hibernate.source;public class student {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

编写测试方法,要求直接将student存入数据库。

TestStudent.java

import hibernate.source.student;public class TestStudent {public static void main(String args[]) throws Exception {student cat=new student();cat.setAge(22);cat.setName("Jing");cat.setId(26);Session session=new Session();session.save(cat);}
}

我们模拟了Hibernate中的Session,这里我们需要自己编写Session类来实现将student存入数据库。

Session.java

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
import hibernate.source.student;public class Session {String TableName="student";Map<String,String> cfs=new HashMap<String,String>();String[] MethodName;Session() {cfs.put("id", "id");cfs.put("name", "name");cfs.put("age", "age");MethodName=new String[cfs.size()];}public void save(student cat) throws Exception{String sql=createSql();Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test");PreparedStatement pst=conn.prepareStatement(sql);for(int i=0;i<cfs.size();i++) {Method m=cat.getClass().getMethod(MethodName[i]);Class<?> r=m.getReturnType();System.out.println(m.getName());System.out.println(r.getName());if(r.getName().equals("java.lang.String")) {String tem=(String)m.invoke(cat);pst.setString(i+1, tem);}if(r.getName().equals("int")) {Integer tem=(Integer)m.invoke(cat);pst.setInt(i+1,tem);} }pst.execute();pst.close();conn.close();}public String createSql() {String sql1="";for(int i=0;i<cfs.size();i++){  sql1+=cfs.keySet().toArray()[i]+",";String property=(String)cfs.values().toArray()[i];String s=property.substring(0, 1).toUpperCase();MethodName[i]="get"+s+property.substring(1, property.length());System.out.println(MethodName[i]);}String sql2="";for(int i=0;i<cfs.size();i++) {sql2+="?"+",";    }sql2=sql2.substring(0, sql2.length()-1);sql1=sql1.substring(0, sql1.length()-1);String sql="insert into "+TableName+" ("+sql1+")"+" values"+" ("+sql2+")";System.out.println(sql);  return sql;}}

思路:

1.拼接SQL语句,将用在Preparedstatement中。

2.需要将student的属性设到Preparedstatement中,问题是怎么实现呢?

3.利用Java反射机制。

1)新建MethodName数组,目的将student中的方法名获得并存入MethodName中。

2)Method类登场,让student类通过MethodName取得对应的方法,返回给Mehod对象。

3)Method类invoke(Class), 将反射执行student对应的方法,获取对应属性值。

转载于:https://www.cnblogs.com/jackhub/archive/2012/11/29/3147221.html

Java反射机制之初见端倪相关推荐

  1. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  2. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  3. Java反射机制分析指南

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  4. 反射 字段_详解面试中常考的 Java 反射机制

    反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...

  5. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...

    方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...

  6. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  7. 利用java反射机制进行对象操作

    我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...

  8. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  9. java继承 映射_hibernate继承关系映射和java反射机制的运用

    转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...

最新文章

  1. 重磅:腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
  2. 数据蒋堂 | 再谈有序分组
  3. 简简单单实践ERD Commander2005破解Windows密码
  4. android启用其他应用程序,杀死Android上的另一个应用程序?
  5. sql查询语句for xml path语法
  6. 线程间通信 GET POST
  7. LinQ To Object 基本用法
  8. 300 秒搞定第一超算 1 万年的计算量,量子霸权时代已来? | CSDN 博文精选
  9. (二)UML语言概述
  10. matlab质心定位算法,一种改进的质心定位算法
  11. 生物素PEG生物素,Biotin-PEG-Biotin
  12. Word和Excel齐发力,将多个单元格的文本内容合并到一个单元格
  13. 用python实现成绩录入
  14. 转:通信十年:前辈对通信行业的分析与经历
  15. STM32之vl53l0x读取距离
  16. 【JAVA-Mybatis】MyBatis 常用逻辑符号转换
  17. WIN7文件夹共享步骤
  18. 软件测试的日常工作是什么
  19. 【翻译】Aggregated Residual Transformations for Deep Neural Networks
  20. 腾讯QQ2007 beta1┊解决Windows Vista下QQ基本的兼容性问题┊纯净绿色特别版

热门文章

  1. nginx变量传递给php,php-从nginx将参数传递给auth_request模块
  2. 四阶行列式计算_【免费专题课】线代之行列式的计算
  3. 远程桌面对方计算机无法远程,win7开启QQ远程协助无法连接对方电脑如何解决
  4. Node.js 被分叉出一个项目 — Ayo.js,肿么了
  5. sql镶嵌查询_SQL语句 - 嵌套查询
  6. 【MySQL】多表查询策略(多表联查子查询)
  7. n9_Adding Interactivity Animating Plots_BeautifulSoup_Interactive backends_Tkinter_Plot.ly_FFmpeg
  8. linux查看端口pvid,交换机端口及常见问题定位(二)
  9. 最新版网页浏览器Flash插件离线版安装程序下载
  10. 再见安卓 鸿蒙,鸿蒙os 再见安卓