反射和注解的使用
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 ""; }