使用反射技術實現對JDBC dao的簡化

     通常我們的dao層也就是實現業務的邏輯,通常會因爲對象的不同,得到數據的不同,返回值不同,參數不同等等的不同原因,而變得很複雜。甚至一個對象就會產生一個數據接口類。如果一個項目中曾在很多的實體,那麼數據操作就會變得繁複,冗餘,所以我們可以利用JDK1.5以後定義的泛型技術結合反射技術進行數據業務的簡化已達到簡化代碼的目的。

    首先,泛型技術是一種在JDK1.5以後出現的新的技術,它能夠給我們帶來很多的便利。比如我們在定義了一個數組時我們可以爲他定義這裏面存儲的內容,也就是限定了這個數組曾放的內容爲string,那麼接下來如果你想要給這個數組賦值,如果你一不小心把一個Int數據放入了這個數組,他就會提示你,這個數組中只能放置string。也就避免了在運行時纔會出現錯誤,而且在上萬行代碼中想要找那個出來是那個數組,也是很麻煩的事。所以泛型技術的出現給我們帶來了太多的便利。

                    List userlist=new ArrayList();

    user就是一個你限定的存儲內容類型,這個集合中只能放置user對象。

   然後是反射技術。對於反射技術。首先我們學習反射技術主要是爲了學習javaee的框架,如:spring。在spring中大量的運用了反射技術。如AOP。

   反射到底是幹什麼的?有什麼作用?反射可以做到的事情很多。不如在不知道一個類內容的情況下對類中的某一個特定的方法進行調用。

    首先一個類中主要有方法,屬性,構造器。所以反射技術就對這三種類的內容進行解析。

  stu.class.getDeclaredFields();//返回所有的屬性。private。protected,public,default

  注意:由於java是一門面向對象的語言,所以一般屬性我們會私有化,不建議使用此方法。
  stu.class.getDeclaredMethods();//返回所有的方法。private。protected,public,default
  stu.class.getDeclaredConstructors();//返回所有的構造器。private。protected,public,default
  stu.class.getConstructors();//返回所有的public的構造器
  stu.class.getMethods();//返回public的方法
  stu.class.getFields();//返回public的屬性

也可以得到類的加載器:

      stu.class.getClassLoader();

那我們得到這些做什麼呢?

下面的代碼會告訴你我們怎麼來實現利用反射技術和泛型技術來操作JDBC數據業務:

1.首先新建實體類:stu類

package cn.bean;

public class stu {
 private int stuid;
 private String stuname;
 private int age;
 public stu(){
  
 }
    public stu(int stuid,String stuname,int age){
  this.age=age;
  this.stuid=stuid;
  this.stuname=stuname;
 }
 public int getStuid() {
  return stuid;
 }
 public void setStuid(int stuid) {
  this.stuid = stuid;
 }
 public String getStuname() {
  return stuname;
 }
 public void setStuname(String stuname) {
  this.stuname = stuname;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 

}

 

user類

package cn.bean;

public class user {
 private int userid;
 private String username;
 
 public user() {
  super();
 }
 public user(int userid, String username) {
  super();
  this.userid = userid;
  this.username = username;
 }
 public int getUserid() {
  return userid;
 }
 public void setUserid(int userid) {
  this.userid = userid;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 

}

2.創建接口層:

   package cn.dao.supdao;

import java.util.List;

public interface Supdao {
  
     public List findList(Class clazz,String sql,Object[] args);        
     
    public T findInfo(Class clazz,String sql ,Object[] args);
   
    public int update(String sql,Object[] args) ;

}

3.對接口實現:

package cn.dao.supdao.impl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import cn.dao.supdao.Supdao;
import cn.jdbc.conn;

public class SupdaoImpl implements Supdao {
  private conn c=null;
  private Connection connection=null;
  private PreparedStatement pstmt=null;
  private ResultSet rs=null;

 
 @Override
 public T findInfo(Class clazz, String sql,Object[] args){ 
   T t=null;  
   //實例化鏈接類
   c=new conn();
   try {
       //建立連接
    connection=c.getConnection();
    //System.out.println(connection);
    //新建ststement對象
    pstmt=connection.prepareStatement(sql);
    //設置參數
    for (int i = 0; i < args.length; i++) {
     pstmt.setObject(i+1, args[i]);
    }
    //查詢語句
    rs=pstmt.executeQuery();
    //獲取數據對象
    ResultSetMetaData rsmd=rs.getMetaData();
    //獲取查詢對象的行數
    int count=rsmd.getColumnCount();
    //建立數組對象
    String[] colname = new String[count];
    //賦值給數組對象
    for (int i = 0; i < colname.length; i++)
    {
     colname[i]=rsmd.getColumnLabel(i+1); 
     //System.out.println(colname[i]);
    }
    //獲得所有的類對象方法
    Method[] ms=clazz.getMethods();
    //遍歷
    while (rs.next())
    {    //實例化類對象
     t=clazz.newInstance();
     //System.out.println(t+"dd");
     //對列名東湖租對象進行遍歷匹配方法
     for (int i = 0; i < colname.length; i++)
     {
      String colName=colname[i].toLowerCase();
      //拼接對象方法 注意屬性的首字母大寫
      String methedName="set"+colName.replaceFirst(colName.substring(0, 1),colName.substring(0, 1).toUpperCase()) ;
      //遍歷方法數組
      for (Method m:ms)
      {   //判斷匹配列名和方法名
       if (methedName.equals(m.getName()))
       {    //判斷是否符合對象的屬性
        //System.out.println(clazz.getDeclaredField(colName).getType().getName());
           if (clazz.getDeclaredField(colName).getType().getName().equals("java.lang.String")) {
         //執行該方法
         m.invoke(t, rs.getString(colName.toUpperCase()));
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章