封装jdbc让你轻松理解Java反射机制

1.目录结构

  

2.BasicDao.java

  static{
    try {
      Class.forName("com.mysql.jdbc.Driver");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public Connection getConnection() throws SQLException{
    String url = "jdbc:mysql://127.0.0.1:3306/dbparam?autoReconnect=true&useUnicode=true&characterEncoding=UTF8";
    String user = "root";
    String password = "123456";
    return DriverManager.getConnection(url, user, password);
  }

  public void close(ResultSet rs, Statement st, Connection conn){
    if(rs!=null){
      try {rs.close();} catch (SQLException e) {e.printStackTrace();}
    }
    if(st!=null){
      try {st.close();} catch (SQLException e) {e.printStackTrace();}
    }
    if(conn!=null){
      try {conn.close();} catch (SQLException e) {e.printStackTrace();}
    }
  }

  public String getMethodName(String fieldName){
    byte[] buffer = fieldName.getBytes();
    buffer[0] = (byte)(buffer[0]-32);
    String name = new String(buffer);
    return "get"+name;
  }

  public String setMethodName(String fieldName){
    byte[] buffer = fieldName.getBytes();
    buffer[0] = (byte)(buffer[0]-32);
    String name = new String(buffer);
    return "set"+name;
  }

3.GetEntity.java

/**
* T为实体对象,可以是由属性和setter/getter组成的实体类,这里要求属性名和查询的数据库字段名相同(顺序可以不一致)
* @author zhzhair
* @param <T>
*/

public class GetEntity<T> extends BasicDao{
  /**
  * @todo 获取实体对象,T为实体类,sql为sql语句字符串,param为sql中传的参数
  * @return T
  */
  public T getEntity(Class<T> clazz, String sql, Object[] param) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      Field[] fields = clazz.getDeclaredFields();//实体类(POJO)的属性数组(Declared表示按照顺序)
      conn = getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < param.length; i++) {
        ps.setObject(i+1, param[i]);
      }
      rs = ps.executeQuery();
      if (rs.next()) {
        T entity = clazz.newInstance();//创建实例(给实体类分配内存)
        ResultSetMetaData rsmd = rs.getMetaData();//获取数据库表的元数据信息
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          String columnName = rsmd.getColumnName(i);//数据库表的字段名(按照顺序)
          for (Field f : fields) {
            if (columnName.equalsIgnoreCase(f.getName())) {
              Object columnValue = rs.getObject(columnName);//根据属性名获取值
              String methodName = setMethodName(f.getName());//实体的属性名首字母必须小写,获取get方法名
              Method method = clazz.getMethod(methodName,f.getType());//根据get方法名和属性的类型返回get方法
              method.invoke(entity, columnValue);//唤醒get方法(让get方法生效)
            }
          }
        }
        return entity;
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      close(rs, ps, conn);
    }
    return null;
  }
  /**
  * @todo 获取实体对象的列表,sql为sql语句字符串,param为sql中传的参数
  * @return List<T>
  */
  public List<T> getEntityList(Class<T> clazz, String sql, Object[] param) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    List<T> entities = new ArrayList<T>();
    try {
      Field[] fields = clazz.getDeclaredFields();//bean属性的数组(按照顺序)
      conn = getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < param.length; i++) {
        ps.setObject(i+1, param[i]);
      }
      rs = ps.executeQuery();
      while (rs.next()) {
        T entity = clazz.newInstance();
        ResultSetMetaData rsmd = rs.getMetaData();
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          String columnName = rsmd.getColumnName(i);
          for (Field f : fields) {
            if (columnName.equalsIgnoreCase(f.getName())) {
              Object columnValue = rs.getObject(columnName);
              String methodName = setMethodName(f.getName());
              Method method = clazz.getMethod(methodName,f.getType());//根据get方法名和属性的类型返回get方法
              method.invoke(entity, columnValue);//唤醒get方法(让get方法生效)
            }
          }
        }
        entities.add(entity);
      }
      return entities;
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      close(rs, ps, conn);
    }
    return null;
  }
}

时间: 2024-11-06 07:08:40

封装jdbc让你轻松理解Java反射机制的相关文章

通过案例一步学习理解java反射机制

java 反射机制 以下只是个人在学习反射过程中的笔记,如有错误请指出纠正. 1. 通过例子理解反射 获取类的类类型的三种方法 package Reflect; public class ClassReflect { public static void main(String[] args) { ClassReflect cr = new ClassReflect(); //方法一: Class c = cr.getClass(); //方法二: Class c1 =ClassReflect.

【JDBC】使用JDBC连接Oracle数据库(JAVA反射机制)

db.properties文件 driverClassName=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe username=system password=123456 db.properties JDBCUtilProperties.java文件 对数据连接和释放资源的封装, package com.xdl.util; import java.io.IOException; import java.io.I

Java知识总结:Java反射机制(用实例理解)

概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java中的反射是一个强大的工具,他能够创建灵活的代码,这些 代码可以在运行时装配,无需在组件之间进行链接,发射允许在编写和执行时,使程序代码能够接入装载到 JVM 中的类的内部信息 .而不是源代码中选定的类协作的代码.这使发射

Java反射机制浅析图+应用实例

Java反射机制浅析图+应用实例 --转载请注明出处:coder-pig 本节引言: 其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的 视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java 反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是 旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭 对话框,后续如果用到会另外总结~ 本节正文: 1.反射的相关

由浅入深理解----java反射技术

java反射机制详解 java反射机制是在运行状态下,对任意一个类可以获取该类的属性和方法,对任意一个对象可以调用其属性和方法.这种动态的获取信息和调用对象的方法的功能称为java的反射机制 class<?>类,在java.lang包下面,class类的实例表示正在运行的java应用程序中的类和接口                                      ?.class是一个类,一个描述类的类(也就是描述类的本身),封装了描述字段的Field.方法Method和构造器的Con

java反射机制的粗略理解

java反射机制: 涉及的对象:Class, Object, 函数:Class类:[forName(String className):static:getClass():public],Object类:[getClass():public]. Class Class也是一个对象,但是你不能通过构造函数得到它,它都是由jvm产生的,它通过上面的两个方法得到实例,加上下面3一共三个方式: 1.通过Object类的getClass()方法.例如: Class c1 = new String("&qu

简谈Java 反射机制,动态代理

谈谈 Java 反射机制,动态代理是基于什么原理?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造.群里也有小编整理的2019年最新最全的java高阶学习资料! 反射机制 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力.可以在运行时通过提供完整的"包名+类名.class"得到某个对象的类型. 功能 在运行时能判断任意一个对象所属的

JAVA反射机制—学习总结

最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象. 什么是反射机制? "JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制."我们通过一些例子,更好理解反射机制.Class类 我们知道Java是一门面向对象

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现