zoukankan      html  css  js  c++  java
  • 封装数据库查询方法

    ---恢复内容开始---

    对于数据繁琐的各式各样的查询语句,每次都要写上一大段查询代码,不仅造成代码冗余,而且还浪费时间。下面给出自己写的一个数据库查询方法封装:

     1 public class AllSelect {
     2     public static List<Object> Select(String sql,String className) throws Exception{
     3         //连接数据库
     4         Connection conn = new MyConnection().getConnection();//后面有封装连接数据库的方法
     5         //预处理
     6         Statement st = conn.createStatement();
     7         //执行sql语句,并把sql查询结果存储在resultSet中
     8         ResultSet rs = st.executeQuery(sql);
     9         //使用resultSetMetaDate获取ResultSet里面每条数据的字段名(数据库表里面的)
    10         ResultSetMetaData rsmd = rs.getMetaData();
    11         //查询结果一共有多少列,数据库表里面有多少个字段(属性)
    12         int count = rsmd.getColumnCount();
    13         //创建一个数组来存放结果集中所有的字段名(把每个字段存进数组里面)
    14         String[] cols = new String[count];
    15         //循环获取所有的字段名()
    16         for(int i = 0;i < cols.length;i ++){
    17             //把resultSetMetaDate获取的字段存进数组
    18             cols[i] = rsmd.getColumnName(i+1);
    19         }
    20         //创建一个Arraylist存放解析出来的对象
    21         List<Object> list = new ArrayList<Object>();
    22         //获取类的反射,通过包名.类名。开始连接po层的类
    23         Class clss = Class.forName(className);
    24         while(rs.next()){
    25             //每次通过反射创建一个对象
    26             Object obj = clss.newInstance();
    27             //通过反射获取对象所有的属性,
    28             Field[] fie = clss.getDeclaredFields();
    29             //遍历这个对象的所有属性,把数据库查询出来的数据放入类对象中
    30             for(Field field:fie){
    31                 //判断·属性的类型,每种类型对应不同的获取属性方法
    32                 if(field.getType().getName().equals("java.lang.Integer")||
    33                         field.getType().getName().equals("int")){
    34                     //循环列名数组,找到属性名重名的列,获取这一列的值,给该属性赋值
    35                     for(int i = 0;i < cols.length;i ++){
    36                         //如果找到这一列
    37                         if(cols[i].equalsIgnoreCase(field.getName())){
    38                             //暴力访问
    39                             field.setAccessible(true);
    40                             //把表中查询出来的这一列的值给同名类的同名Int属性
    41                             field.set(obj, rs.getInt(cols[i]));
    42                         }
    43                     }
    44                 }else if(field.getType().getName().equalsIgnoreCase("java.lang.String")){
    45                     for(int i = 0;i < cols.length;i ++){
    46                         if(cols[i].equalsIgnoreCase(field.getName())){
    47                             //暴力访问
    48                             field.setAccessible(true);
    49                             //用这一列的值给同名的String属性
    50                             field.set(obj, rs.getString(cols[i]));
    51                         }
    52                     }
    53                 }else if(field.getType().getName().equalsIgnoreCase("java.sql.Date")){
    54                     for(int i = 0;i < cols.length;i ++){
    55                         if(cols[i].equalsIgnoreCase(field.getName())){
    56                             //暴力访问
    57                             field.setAccessible(true);
    58                             //用这一列的值给同名的Date属性
    59                             field.set(obj, rs.getDate(cols[i]));
    60                         }
    61                     }
    62                 }else if(field.getType().getName().equalsIgnoreCase("java.lang.Double")||
    63                         field.getType().getName().equalsIgnoreCase("double")){
    64                     //循环列名数组,找到属性名重名的列,获取这一列的值,给该属性赋值
    65                     for(int i = 0;i < cols.length;i ++){
    66                         //如果找到这一列
    67                         if(cols[i].equalsIgnoreCase(field.getName())){
    68                             //暴力访问
    69                             field.setAccessible(true);
    70                             //用这一列的值给同名的Double属性
    71                             field.set(obj, rs.getDouble(cols[i]));
    72                         }
    73                     }
    74                 }
    75             }
    76             list.add(obj);
    77         }
    78         rs.close();
    79         st.close();
    80         conn.close();
    81         return list;
    82     }
    83 }


    连接数据库的封装方法: 
    连接数据库接口:

    1 public interface DBConnection {
    2 
    3     public Connection getConnection();
    4     public void close();
    5 }

    连接数据库实现类(Oracle数据库):

     1 public class MyConnection implements DBConnection{
     2     Connection conn;
     3     @Override
     4     public Connection getConnection() {
     5         // TODO Auto-generated method stub
     6         String Driver="oracle.jdbc.driver.OracleDriver";    //连接数据库的方法  
     7         String URL="jdbc:oracle:thin:@localhost:1521:benxi";    //benxi为数据库的SID  
     8         String Username="scott";    //用户名  
     9         String Password="123456";    //密码  
    10         try {
    11             Class.forName(Driver) ;
    12             conn=DriverManager.getConnection(URL,Username,Password);      
    13         } catch (ClassNotFoundException | SQLException e) {
    14             // TODO Auto-generated catch block
    15             e.printStackTrace();
    16         }    //加载数据库驱动  
    17 
    18         return conn;
    19     }
    20 
    21     @Override
    22     public void close() {
    23         // TODO Auto-generated method stub
    24         try {
    25             conn.close();
    26         } catch (SQLException e) {
    27             // TODO Auto-generated catch block
    28             e.printStackTrace();
    29         }
    30     }
    31 
    32 }

    连接数据库实现类(MySQL):

     1 public class MysqlConnection implements DBConnection{
     2     public static final String DRIVECLASS="com.mysql.jdbc.Driver";
     3     public static final String URL="jdbc:mysql://localhost:3306/test01";
     4     public static final String UNAME="root";
     5     public static final String PASS="123456";
     6     static{
     7         try {
     8             Class.forName(DRIVECLASS);
     9         } catch (ClassNotFoundException e) {
    10             // TODO Auto-generated catch block
    11             e.printStackTrace();
    12         }
    13     }
    14     /**
    15      * 获得连接
    16      */
    17     Connection conn  = null;
    18     public Connection getConnection() {
    19         try {
    20             conn = DriverManager.getConnection(URL,UNAME,PASS);
    21         } catch (SQLException e) {
    22             e.printStackTrace();
    23         }
    24         return conn;
    25     }
    26     /**
    27      * 关闭连接
    28      */
    29 
    30     @Override
    31     public void close() {
    32         // TODO Auto-generated method stub
    33         try {
    34             if(conn!=null&&!conn.isClosed()){
    35                 conn.close();
    36             }
    37         } catch (Exception e) {
    38             e.printStackTrace();
    39         }
    40 
    41     }
    42 }

    ---恢复内容结束---

  • 相关阅读:
    Navigator is deprecated and has been removed from this package
    ES6 Promise
    SectionList的使用
    FastList使用
    react native touchable
    react native获取屏幕的宽度和高度
    RN导航栏使用
    2020-11-04:java里,总体说一下集合框架。
    2020-11-03:手写代码:链表如何快速找到中间节点?
    2020-11-02:go中,s:=make([]string,10);s=append(s,“test“);fmt.Println(s[0]),打印什么?
  • 原文地址:https://www.cnblogs.com/benxi/p/7417525.html
Copyright © 2011-2022 走看看