Java 基础之反射(二)

反射和注解的使用


1.测试函数

public class Test {

	@SuppressWarnings("static-access")
	public static void main(String[] args) throws Exception {
		
		//第一种方法不推荐使用
		/*
		//Class.forName("com.cdu.dj.DButils");
		//获取连接
		Connection conn = DButils.getConnection();
		//创建查询对象
		Statement st = conn.createStatement();
		//执行查询语句并使用结果集接受
		ResultSet rs = st.executeQuery("select * from student");
		//循环遍历
		for(;rs.next();){
			int sid  =rs.getInt(1);
			String sname =rs.getString(2);
			int sage =rs.getInt(3);
			String ssex =rs.getString(4);
			System.out.println(sid+"--"+sname+"--"+sage+"--"+ssex);
		}
		//关流
		DButils.closeAll(rs, st, conn);
		 */
		//1、使用student接收查询到的数据,存放到集合中
		List<Student> list = new DButils().getStudents();
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("----2----");
		//2、查询学生
		List<Object> list1 = new DButils().getbeanAll(Student.class, "sid<5");
		for (int i = 0; i < list1.size(); i++) {
			Student stu =(Student) list1.get(i);
			System.out.println(stu);
		}
		//3、
		System.out.println("--3---");
		list1= new DButils().getbeanAll(Teacher.class,"");
		for (int i = 0; i < list1.size(); i++) {
			Teacher teacher =(Teacher) list1.get(i);
			System.out.println(teacher);
		}
		//4、
		System.out.println("--4--");
		System.out.println(new DButils().getbean(Student.class, "sname='张三2'"));
		//5、
		System.out.println("--5--");
		list1 = new DButils().getBeanAllByAnn(MyStudent.class,"sid<3");
		for (int i = 0; i < list1.size(); i++) {
			MyStudent student = (MyStudent) list1.get(i);
			System.out.println(student);
		}
		//6、
		System.out.println("--6---");
		List<MyStudent> list2 = new DButils<MyStudent>().getBeanAllByAnn_T(MyStudent.class,"sid<3");
		for (int i = 0; i < list1.size(); i++) {
			MyStudent mystudent =  list2.get(i);
			System.out.println(mystudent);
		}
		
		
	}

}

2.DButils<T>:带有泛型的数据库封装类

public class DButils<T>{

	private static String driverClass ;
	private static String url;
	private static String user;
	private static String psw;
	//静态代码块,加载数据库驱动
	static{
		ResourceBundle bundle = ResourceBundle.getBundle("dbconfig");
		//driverClass = bundle.getString("driverClass");
		driverClass = bundle.getString("driverClass");
		url = bundle.getString("url");
		user = bundle.getString("user");
		psw = bundle.getString("psw");
		try {
			Class.forName(driverClass);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//获取连接
	public static Connection getConnection(){
		try {
			return DriverManager.getConnection(url,user,psw);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	//关流
	public static void closeAll(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 static List<Student> getStudents(){
		List<Student> list = new ArrayList<Student>();
		Connection conn = getConnection();
		try {
			Statement st =conn.createStatement();
			ResultSet rs = st.executeQuery("select * from student");
			for(;rs.next();){
				//取值
				int sid = rs.getInt("sid");
				String sname = rs.getString("sname");
				int sage = rs.getInt("sage");
				String ssex = rs.getString("ssex");
				//存放到学生对象
				Student stu = new Student();
				stu.setSid(sid);
				stu.setSname(sname);
				stu.setSage(sage);
				stu.setSsex(ssex);
				list.add(stu);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	//希望有一个方法能够直接获取到传入的类型的对象
	//比如传入一个Student.class,返回一个List<Student>
	//一个Class类对象,where用来在查询时加限制条件
	public static List<Object> getbeanAll(@SuppressWarnings("rawtypes") Class cls ,String where){
		List<Object> list = null;
		Connection conn =null;
		Statement st = null;
		ResultSet rs = null;
		conn = DButils.getConnection();
		try {
			st = conn.createStatement();
			Field [] fileds =cls.getDeclaredFields();
			String sql = "select ";
			//通过查询的字段sql添加,并且传入的cls类里面的成员的名字和数据库表里列(字段)名一致
			for (int i = 0; i < fileds.length; i++) {
				fileds[i].setAccessible(true);
				sql +=fileds[i].getName();
				if(i!=fileds.length-1){
					sql +=",";
				}
			}
			//sql语句和格式
			sql += " from "+cls.getSimpleName();
			if(where!=""){
				sql += " where "+where+";";
			}else{
				sql +=";";
			}
			rs = st.executeQuery(sql);
			//将结果变为List集合中
			list = new ArrayList<Object>();
			for(;rs.next();){
				//创建由此类对象表示的类的新实例。 该类被实例化为一个具有空参数列表的new表达式。 如果类尚未初始化,则初始化该类。
				Object object = cls.newInstance();
				
				for (int i = 0; i < fileds.length; i++) {
					fileds[i].set(object, rs.getObject(fileds[i].getName()));
				}
				list.add(object);				
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	//传入一个Object对象查值
	@SuppressWarnings("rawtypes")
	public static Object getbean( Class cls ,String where){
		Connection conn =null;
		Statement st = null;
		ResultSet rs = null;
		conn = DButils.getConnection();
		try {
			st = conn.createStatement();
			Field [] fileds =cls.getDeclaredFields();
			String sql = "select ";
			//通过查询的字段sql添加,并且传入的cls类里面的成员的名字和数据库表里列(字段)名一致
			for (int i = 0; i < fileds.length; i++) {
				fileds[i].setAccessible(true);
				sql +=fileds[i].getName();
				if(i!=fileds.length-1){
					sql +=",";
				}
			}
			//sql语句和格式
			sql += " from "+cls.getSimpleName();
			if(where!=""){
				sql += " where "+where+";";
			}else{
				sql +=";";
			}
			rs = st.executeQuery(sql);
			System.out.println(sql);
			//将结果变为List集合中
			if(rs.next()){
				//创建由此类对象表示的类的新实例。 该类被实例化为一个具有空参数列表的new表达式。 如果类尚未初始化,则初始化该类。
				Object object = cls.newInstance();
				for (int i = 0; i < fileds.length; i++) {
					fileds[i].set(object, rs.getObject(fileds[i].getName()));
				}
				return object;
			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	public List<Object> getBeanAllByAnn(Class cls,String where) {
		List<Object> list=null;
		Connection conn=null;
		Statement st=null;
		ResultSet rs=null;
		
		try {
			conn=DButils.getConnection();
			st=conn.createStatement();
			Field[] fields=cls.getDeclaredFields();
			String sql="select ";
			//sql接下来的内容应该像这样:
			//"id,age,name"
			//在这里我们传入的cls类里面的成员的名字和表里的列(字段)名一致。
			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);
				//获取第i个成员的注解里的值
				
				DBAnn dbann=fields[i].getAnnotation(DBAnn.class);
				String colName=dbann.value();
				
				//sql=sql+fields[i].getName();
				sql=sql+colName;
				if(i!=fields.length-1) {
					sql=sql+",";
				}
			}
			//select id,age,name
			//后面应该有" from tablename;"
			//不应该是类名,应该是类的注解的值
			DBAnn dbann=(DBAnn) cls.getAnnotation(DBAnn.class);
			String tableName=dbann.value();
			//sql=sql+" from "+cls.getSimpleName();
			sql=sql+" from "+tableName;
			if(where!=null) {
				sql=sql+" where "+where+";";
			}else {
				sql=sql+";";
			}
			//select id,age,name from tablename;
			rs=st.executeQuery(sql);
			
			//查出来之后,要把结果集变为list
			list=new ArrayList<Object>();
			for (;rs.next();) {
				Object object=cls.newInstance();
				
				for (int i = 0; i < fields.length; i++) {
					DBAnn dbann1=fields[i].getAnnotation(DBAnn.class);
					String colName=dbann1.value();
					fields[i].set(object, rs.getObject(colName));
				}
				list.add(object);
			}
			return list;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			closeAll(rs, st, conn);
		}
		return null;
	}
	//返回泛型的方式
		public List<T> getBeanAllByAnn_T(Class<T> cls,String where) {
			List<T> list=null;
			Connection conn=null;
			Statement st=null;
			ResultSet rs=null;
			
			try {
				conn=DButils.getConnection();
				st=conn.createStatement();
				Field[] fields=cls.getDeclaredFields();
				String sql="select ";
				//sql接下来的内容应该像这样:
				//"id,age,name"
				//在这里我们传入的cls类里面的成员的名字和表里的列(字段)名一致。
				for (int i = 0; i < fields.length; i++) {
					fields[i].setAccessible(true);
					//获取第i个成员的注解里的值
					
					DBAnn dbann=fields[i].getAnnotation(DBAnn.class);
					String colName=dbann.value();
					
					//sql=sql+fields[i].getName();
					sql=sql+colName;
					if(i!=fields.length-1) {
						sql=sql+",";
					}
				}
				//select id,age,name
				//后面应该有" from tablename;"
				//不应该是类名,应该是类的注解的值
				DBAnn dbann=(DBAnn) cls.getAnnotation(DBAnn.class);
				String tableName=dbann.value();
				//sql=sql+" from "+cls.getSimpleName();
				sql=sql+" from "+tableName;
				if(where!=null) {
					sql=sql+" where "+where+";";
				}else {
					sql=sql+";";
				}
				//select id,age,name from tablename;
				rs=st.executeQuery(sql);
				
				//查出来之后,要把结果集变为list
				list=new ArrayList<T>();
				for (;rs.next();) {
					T object=cls.newInstance();
					
					for (int i = 0; i < fields.length; i++) {
						DBAnn dbann1=fields[i].getAnnotation(DBAnn.class);
						String colName=dbann1.value();
						fields[i].set(object, rs.getObject(colName));
					}
					list.add(object);
				}
				return list;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
				closeAll(rs, st, conn);
			}
			return null;
		}
}

3.Student 类。

public class Student {
	private int sid;
	private String sname;
	private int sage;
	private String ssex;
	public Student(int sid, String sname, int sage, String ssex) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.sage = sage;
		this.ssex = ssex;
	}
	public Student() {
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getSage() {
		return sage;
	}
	public void setSage(int sage) {
		this.sage = sage;
	}
	public String getSsex() {
		return ssex;
	}
	public void setSsex(String ssex) {
		this.ssex = ssex;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + ", ssex=" + ssex + "]";
	}
}

4.Teacher类

public class Student {
	private int sid;
	private String sname;
	private int sage;
	private String ssex;
	public Student(int sid, String sname, int sage, String ssex) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.sage = sage;
		this.ssex = ssex;
	}
	public Student() {
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getSage() {
		return sage;
	}
	public void setSage(int sage) {
		this.sage = sage;
	}
	public String getSsex() {
		return ssex;
	}
	public void setSsex(String ssex) {
		this.ssex = ssex;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + ", ssex=" + ssex + "]";
	}
}

5.MyStudent类

@DBAnn("student")
public class MyStudent {
	@DBAnn("sid")
	private int id;
	@DBAnn("sname")
	private String name;
	@DBAnn("sage")
	private int age;
	@DBAnn("ssex")
	private String sex;
	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;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "MyStudent [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
}

5.注解DBAnn类

//定义一个注解
//注解可以帮助Java代码的运行、编译等等。
//重写父类的方法
//Java程序代码有三个阶段
//SOURCE:源代码阶段,.java的形态
//CLASS:字节码阶段,.class的形态
//RUNTIME:运行时阶段,整个程序在运行的时候
//我们自己的定义的注解就像一个标签一样,贴着java程序
//注解可以在源代码阶段贴着,然后字节码阶段就消失
//注解可以在源代码阶段、字节码阶段贴着,运行时消失
//全程贴着
@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DBAnn {
	String value() default "";
}

猜你喜欢

转载自blog.csdn.net/qq_41813207/article/details/80200745