zoukankan      html  css  js  c++  java
  • Java反射机制之初见端倪

    这里模拟一下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对应的方法,获取对应属性值。


  • 相关阅读:
    GAMIT中遇到的错误
    bash: ./install_software: Permission denied
    xmanager无法加载远程桌面
    GMT的安装
    小总结:Gamit中常见常用命令
    动态分配指针数组(以解决)
    Gamit使用gftp软件下载数据
    Python基础(1)
    JAVA中关于多线程的理解
    JAVA 基本绘图——利用JFrame JPanel 绘制扇形
  • 原文地址:https://www.cnblogs.com/jackhub/p/3147221.html
Copyright © 2011-2022 走看看