增强版basedao java 反射和映射

来源:互联网 发布:js promise的用法总结 编辑:程序博客网 时间:2024/05/17 03:13

public class BaseDao{
 String DBUser;
 String DBPwd;
 String DBHost;//服务器地址
 String DBName;
 int Port;
 int Port2;
 int DBType;//1 mysql 2 sqlserver 3 oracle;
 Connection conn;
 PreparedStatement ps;
 public ResultSet rs;

//  链接配置文件 
 public BaseDao(){
  Properties pro=new Properties();
  InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
  try {
   pro.load(is);
   DBUser=pro.getProperty("DBUser");
   DBPwd=pro.getProperty("DBPwd");
   DBHost=pro.getProperty("DBHost");
   DBName=pro.getProperty("DBName");
   Port=Integer.parseInt(pro.getProperty("Port"));
   DBType=Integer.parseInt(pro.getProperty("DBType"));
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

//打开链接数据库
 public void open(){
   try {
    if(DBType==1){
     Class.forName("com.mysql.jdbc.Driver");
     // jdbc:mysql://localhost:3306/数据库名
     conn=DriverManager.getConnection("jdbc:mysql://"+DBHost+":"+Port+"/"+DBName, DBUser, DBPwd);
    }else if(DBType==2){
     Class.forName("com.microsoft.sqlserver.sqlserverDriver");
     //jdbc:sqlserver://localhost:1433;databasename=myschool
     conn=DriverManager.getConnection("jdbc:sqlserver://"+DBHost+":"+Port2+";databasename="+DBName, DBUser, DBPwd);
    }else{
     
    }
   } catch (Exception e){
    e.printStackTrace();
   }
 }

//关闭
 public void close(){
  //后出现的先关闭
   try {
    if(rs!=null){
    rs.close();
    }
    ps.close();
    conn.close();
   } catch (Exception e){
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
 }
 /**
  * 执行增删改
  * @param sql 所执行的sql语句
  * @param params sql语句中的参数
  * @return 受影响的行数
  */


 public int executeUpdate(String sql,Object []params){

  open();
  int a=0;
  try{
   ps=conn.prepareStatement(sql);
   if(params!=null){
    for (int i = 0; i < params.length; i++) {
     ps.setObject(i+1,params[i]);
    }
   }
   a=ps.executeUpdate();
  } catch (Exception e){
   e.printStackTrace();
  }
  close();
  return a;
 }
 public ResultSet executeQuery(String sql,Object []params){
  open();
  try{
   ps=conn.prepareStatement(sql);
   if(params!=null){
    for (int i = 0; i < params.length; i++){
     ps.setObject(i+1,params[i]);
    }
   }
   rs=ps.executeQuery();
  }catch (Exception e){
   e.printStackTrace();
  }
  return rs;
 }
 public int Add(Object o){
  int a=0;
  //获取表明
  Class clz=o.getClass();//获取对象得嘞
  String classname=clz.getName();//获取完整的名称,包括包名
  int p=classname.lastIndexOf(".");//寻找最后一个点
  classname=classname.substring(p+1);//从点后面开始截取
  StringBuffer sb=new StringBuffer();
  sb.append("insert into "+classname +"(");
  Field[] fs=clz.getDeclaredFields();//获取所有列
  for (int i = 0; i < fs.length; i++) {
   if(i==fs.length-1)
    sb.append(fs[i].getName());//最后一个不加逗号
   else
    sb.append(fs[i].getName()+",");//其他加逗号
   
  }
  sb.append(") values (");
  for (int i = 0; i < fs.length; i++) {
   if(i==fs.length-1)
    sb.append("?");//最后一个不加逗号
   else
    sb.append("?,");//其他加逗号
   
  }
  sb.append(")");//sql拼接完毕
  Object []parm=new Object[fs.length];//参数个数根据属性个数确定
  
   try {
    for (int i = 0; i < fs.length; i++) {
     fs[i].setAccessible(true);//强制访问属性
    parm[i]=fs[i].get(o);//根据属性获取对象的属性值
    }
   } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   a=executeUpdate(sb.toString(), parm);
  System.out.println(sb);
  
  return a;
 }
 public int del(Object o){
  int a=0;
  //获取表明
  Class clz=o.getClass();//获取对象得嘞
  String classname=clz.getName();//获取完整的名称,包括包名
  int p=classname.lastIndexOf(".");//寻找最后一个点
  classname=classname.substring(p+1);//从点后面开始截取
  StringBuffer sb=new StringBuffer();
  sb.append("delete from "+classname +" where ");
  Field[] fs=clz.getDeclaredFields();//获取
  sb.append(fs[0].getName()+" = ?");
  Object[] parm=new Object[1];
  
  fs[0].setAccessible(true);
  try {
   parm[0]=fs[0].get(o);
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  a=executeUpdate(sb.toString(), parm);
  return a;  
 }
 public int update(Object o){
  int a=0;
  //获取表明
  Class clz=o.getClass();//获取对象得嘞
  String classname=clz.getName();//获取完整的名称,包括包名
  int p=classname.lastIndexOf(".");//寻找最后一个点
  classname=classname.substring(p+1);//从点后面开始截取
  StringBuffer sb=new StringBuffer();
  sb.append("update "+classname +" set ");
  Field[] fs=clz.getDeclaredFields();//获取
  for (int i = 0; i < fs.length; i++) {
   if(i==fs.length-1)
   sb.append(fs[i].getName()+"=?");
   else
    sb.append(fs[i].getName()+"= ?,");
  }
  sb.append(" where "+fs[0].getName()+" =? ");
  Object[] parm=new Object[fs.length+1];
  
   try {
    for (int i = 0; i < fs.length; i++) {
     fs[i].setAccessible(true);//强制访问属性
    parm[i]=fs[i].get(o);
    }
    parm[fs.length]=fs[0].get(o);
   } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   a=executeUpdate(sb.toString(), parm);
  
  return a;
 }
 public List select(Class clz,String where, Object[] parm){
  
  List list =new ArrayList();
  
  String classname=clz.getName();//获取完整的名称,包括包名
  int p=classname.lastIndexOf(".");//寻找最后一个点
  classname=classname.substring(p+1);//从点后面开始截取
  StringBuffer sb=new StringBuffer();
 
   sb.append("select * from "+classname +" where "+where);
  rs=executeQuery(sb.toString(), parm);
  Field[] fs=clz.getDeclaredFields();//获取
  
  try {
   while(rs.next()){
    Object o=clz.newInstance();
    for (Field fi : fs) {
     fi.setAccessible(true);
     Object v=rs.getObject(fi.getName());
     fi.set(o,v);
     
    }
    list.add(o);
   }
   close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return list;
    }
 public Object find(Class clz,String where, Object[] parm){
  Object o=null;
  List list=select(clz, where, parm);
  if(list.size()>0) o=list.get(0);
  return o;
  
 }
 
}

 

查询

Object parm[]={id};
  List<Student> list=bs.select(Student.class, "id=?", parm);

 for (Student st : list) {
   st.show();
  }

 

映射 由类生成对象
 对象.set属性(值) 
 对象.方法()
反射
 由对象得到类
 由属性调用对象
  Field.set(对象,值)
 由方法调用对象
  Method.invoke(对象,参数)
获取类的方法
 Class c1=类型.class;根据类名获取类
 Class c2=对象.getClass();//根据对象获取类
 Class c3=Class.forName("包名.类名");
//获取某个属性
 Field f=Class.getDeclaredField("名称");//根据名称获取属性
 Field[] f=Class.getDeclaredFields();//获取全部属性
 field.setAccessable(true);//强制访问
获取方法
 Method m=class.getDeclareMethod("名称",参数列表);
 Method[] m=class.getDeclareMethods();//得到所有方法