前言:
1.在前面做查询语句的时候遇到了这么一个问题:
是否能做一个通用的查询语句适用于不同的表。
可以通过反射 实现不同的表的对象的创建。
2.后面的框架的使用很多功能的实现都是通过反射进行完成的。
一、类的加载机制:
需要特别注意的时
1):类的加载:
类加载时指将类的class文件(字节码文件)载入内存中,并为之创建一个java.lang.Class对象,我们称之为字节码对象. 类的加载过程由类加载器(ClassLoader)完成,类加载器通常有JVM提供,我们称之为系统类加载器,我们也可以继承ClassLoader类来提供自定义类加载器. 不同的类加载器可以实现加载本地字节码文件,jar包中的字节码,通过网络加载字节码等.
Note:
我们在使用时也就是了解的最多的时初始化后面的步骤
二、反射:
一切事物都是对象,那么类是什么对象
小码哥之反射笔记
Java.lang.Class类的类,类加载进内存时,生成字节码对象,Class的相关学习可以通过文档的查找。
注意:
元数据:描述数据的描述数据
反射:得到类的元数据的过长,在运行期间,动态地去获取某一个类中的成员信息(构造器、方法、字段、内部类、接口、父类等等)
三、Class和Class实例:
如何创建Class对象,如何来表示一个字节码对象?
以后使用最多的是第三种,在框架中大量使用.
四、九大内置Class实例和数组
byte,short,int,long,float,double,boolea,char,void.
如何表示基本类型的字节码对象呢?
表示:int.class
Notes:
所有的具有相同的维数和相同元素类型的数组共享同一份字节码对象,和元素没有关系.
五、获取类的构造器
最后采用泛型优化查询语句:
除了再借助一下注解进行优化,这个表基本上几近完善。
先创建一个结果处理集接口
package _05_smis.dao;
import java.sql.ResultSet;
public interface IResultSetHandler<T> {
T handle(ResultSet rs)throws Exception;
}
BeanHandler实现类
package _05_smis.util;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import _05_smis.dao.IResultSetHandler;
public class BeanHandler<T> implements IResultSetHandler<T> {
private Class<T> classType;
public BeanHandler(Class<T> classType){
this.classType=classType;
}
@Override
public T handle(ResultSet rs) throws Exception {
if (rs.next()) {
T obj =classType.newInstance();
BeanInfo beanInfo=Introspector.getBeanInfo(classType,Object.class);
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String name = pd.getName();
Object value =rs.getObject(name);
pd.getWriteMethod().invoke(obj, value);
}
return obj;
}
return null;
}
}
package _05_smis.util;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import _05_smis.dao.IResultSetHandler;
public class BeanListHandler<T> implements IResultSetHandler<List<T>> {
private Class<T> classType;
public BeanListHandler(Class<T> classType){
this.classType=classType;
}
@Override
public List<T> handle(ResultSet rs) throws Exception {
List<T> list=new ArrayList<T>();
if (rs.next()) {
T obj =classType.newInstance();
BeanInfo beanInfo=Introspector.getBeanInfo(classType,Object.class);
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String name = pd.getName();
Object value =rs.getObject(name);
pd.getWriteMethod().invoke(obj, value);
}
list.add(obj);
}
return list;
}
}
package _05_smis.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import _05_smis.dao.IResultSetHandler;
public class JdbcUtil {
public static Connection conn = null;//选用的java的接口而不是mysql的!!!
public static String DRIVER=null;
public static String URL=null;
public static String USER=null;
public static String PASSWORD=null;
private static ResultSet rSet=null;
static{
Properties pro=new Properties();
String fileName="database.properties";
InputStream in=JdbcUtil.class.getClassLoader().getResourceAsStream(fileName);
try {
pro.load(in);
DRIVER=pro.getProperty("DRIVER");
URL=pro.getProperty("URL");
USER=pro.getProperty("USER");
PASSWORD=pro.getProperty("PASSWORD");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn(){
try {
Class.forName(DRIVER);
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
throw new RuntimeException("数据库异常");
}
public static int executeUpdate1(String sql,Object...params){
conn=getConn();
PreparedStatement psmt=null;
try {
System.out.println(conn);
psmt=conn.prepareStatement(sql);
System.out.println(psmt);
if (params!=null) {
for (int i = 0; i < params.length; i++) {
psmt.setObject(i+1, params[i]);
}
}
int i=psmt.executeUpdate();
System.out.println(i);
return i;
} catch (Exception e) {
e.printStackTrace();
}finally {
close(rSet, psmt, conn);
}
return 0;
}
public static <T>T query(String sql,IResultSetHandler<T> rsh,Object...params){
conn=getConn();
PreparedStatement psmt=null;
ResultSet rSet=null;
try {
psmt=conn.prepareStatement(sql);
if (params!=null) {
for (int i = 0; i < params.length; i++) {
psmt.setObject(i+1, params[i]);
}
}
rSet=psmt.executeQuery();
return rsh.handle(rSet);
} catch (Exception e) {
e.printStackTrace();
}finally {
close(rSet, psmt, conn);
}
return null;
}
public static void close(ResultSet rSet,PreparedStatement psmt,Connection conn){
try {
if (rSet!=null) {
rSet.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
if (psmt!=null) {
psmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (JdbcUtil.conn!=null) {
JdbcUtil.conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private JdbcUtil() {}
}