JDBC自定义框架

   所谓元数据,指的是数据中定义了一些关于数据库、表、列的信息,在 JDBC技术规范中可以使用三大元数据DataBaseMetaData、ParameterMetaData、ResultSetMetaData 进行相应信息的获取。ResultSetMetaData:该元数据中保存了一些关于数据查询结果的相关信息;ParameterMetaData :该元数据中主要是包含了一些参数的信息;DataBaseMetaData:该元数据中主要是包含了一些数据库相关的信息。

    使用元信息结合Java的反射机制,可以自定义一个JDBC的框架 

package cn.com.bochy.db;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DBUntil {
 /**
  * 1、加载驱动包
  */
 private Connection conn;
 private PreparedStatement pstmt;
 private ResultSet rs;
 private static String username = "root";
 private static String userpwd = "root";
 private static String url = "jdbc:mysql://localhost:3306/";
 private static String db = "test";
 /**
  * 1、获取连接对象的方法
  *
  */
 public Connection getConnection() {
  try {
   Class.forName("com.mysql.jdbc.Driver");
   // Driver d=new Driver();
   conn = DriverManager.getConnection(url + db, username, userpwd);
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return conn;
 }

 /**
  * 2、封装查询的方法,结果封装成结果集
  */
 public ResultSet query(String sql, Object[] param) {
  getConnection();
  try {
   pstmt = conn.prepareStatement(sql);
   if (param != null) {
    for (int i = 0; i < param.length; i++) {
     pstmt.setObject(i + 1, param[i]);
    }
   }
   rs = pstmt.executeQuery();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return rs;
 }
 /**
  * 3、封装查询的方法,结果封装成List
  */
 public List<Object> getAll(String sql, Object[] param, Class<?> c) {
  getConnection();
  rs = query(sql, param);
  List<Object> lis = new ArrayList<Object>();
  try {
   ResultSetMetaData r = rs.getMetaData();
   // String packageName=r.get
   while (rs.next()) {
    Object bean = c.newInstance();
    for (int i = 0; i < r.getColumnCount(); i++) {

     String columnName = r.getColumnName(i + 1);
     Object value = rs.getObject(columnName);
     Field f = bean.getClass().getDeclaredField(columnName);
     f.setAccessible(true);
     f.set(bean, value);
    }
    lis.add(bean);
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchFieldException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  closeAll();
  return lis;

 }

 /**
  * 4、封装查询的方法,结果封装成Bean
  */
 public Object getBean(String sql, Object[] param,Class<?> c) {
  getConnection();
  rs = query(sql, param); 
  Object bean = null;
  try {
   ResultSetMetaData r = rs.getMetaData();
   bean = c.newInstance();
   for (int i = 0; i < r.getColumnCount(); i++) {
    String columnName = r.getColumnName(i + 1);
    Object value = rs.getObject(columnName);
    Field f = bean.getClass().getDeclaredField(columnName);
    f.setAccessible(true);
    f.set(bean, value);
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }  catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchFieldException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  closeAll();
  return bean;

 }

 /**
  * 5、封装非查询(添加、删除、修改)的方法
  */
 public boolean noQuery(String sql, Object[] param) {
  getConnection();
  try {
   pstmt = conn.prepareStatement(sql);
   if (param != null) {
    for (int i = 0; i < param.length; i++) {
     pstmt.setObject(i + 1, param[i]);
    }
   }
   int rows = pstmt.executeUpdate();
   closeAll();
   if (rows > 0) {
    return true;
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  return false;
 }

 /**
  * 6、关闭资源
  */
 public void closeAll() {
  try {
   if (rs != null) {
    rs.close();
   }
   if (pstmt != null) {
    pstmt.close();
   }
   if (conn != null) {
    conn.close();
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}
上述地方可以改良的地方:

1、配置信息可以写在一个.properties文件或者.xml文件中,通过读取配置文件获取配置信息,解决配置信息直接放入代码的硬编码方式。

2、可以加入连接池,使其连接对象由连接池统一管理,加强并发的处理能力。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值