JDBC工具类

在写jdbc的代码的时候一定有很多小伙伴困扰每写一次连接都要写重复的代码,这点不能体现java的封装性,那么我们能不能一步到位,每次连接数据库以及请求数据时我们只写一次,我接下来要写的内容就是关于jdbc的工具类,一劳永逸,不再吃jdbc的苦。

连接数据库
我们写jdbc的工具类的第一步就是要先写jdbc的一个连接方法,返回一个Connection对象。
这里用到了配置文件,java中有一个类Properties,他可以读取properties文件,这个文件我们一般放在src目录下
在这里插入图片描述
properties文件的内容是这样子的,大家可以根据自己的实际情况进行修改,注意一定要换行,每一行的后面不能存在空格!!!
在这里插入图片描述

在这里我们同时也用到了输入流来读取文件,以及用到了反射的知识内容,我们通过Class类中的getClassLoader()方法加载当前类,再通过ClassLoader类加载器得到对应文件的输入流。

public static Properties props = new Properties();
   static {

       InputStream resourceAsStream = JdbcUntil.class.getClassLoader().getResourceAsStream("db.properties");
       try {
           props.load(resourceAsStream);   //加载文件
           Class.forName(props.getProperty("driverClass"));   //加载驱动
       } catch (IOException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       } catch (SQLException throwables) {
           throwables.printStackTrace();
       }
   }

   public static Connection getconnection() throws SQLException {
       return DriverManager.getConnection(props.getProperty("url"),props.getProperty("username"),props.getProperty("password"));
   }

对数据的增删改

在这里用到了可变参数,就是下面的Object… params

   public static int executeUpdate(String sql,Object... params){
       Connection connection = null;
       PreparedStatement preparedStatement = null;
       try {
           connection = getconnection();
           preparedStatement = connection.prepareStatement(sql);
           if (params!=null && params.length>0) {
               for (int i = 0; i < params.length; i++) {
                   preparedStatement.setObject(i + 1,params[i]);
               }
               return preparedStatement.executeUpdate();
           }

       } catch (SQLException throwables) {
           throwables.printStackTrace();
       }finally {
           close(null,preparedStatement,connection);
       }
      return 0;

   }

对数据库的查
在使用的时候大家要注意了,数据库查出来的表上的属性名,要与传入的class对象的属性顺序与属性名一致;

 private static <T> List<T> parseResuletset(ResultSet rs , Class<T> clazz) throws IllegalAccessException, InstantiationException, SQLException {   //解析结果集
       List<T> list = new ArrayList<>();
       List<Field> fields = new ArrayList<>();

       Class<? super T> superclass = clazz.getSuperclass();
       Field[] declaredFields1 = superclass.getDeclaredFields();
       Field[] declaredFields = clazz.getDeclaredFields();
       Collections.addAll(fields,declaredFields1);
       Collections.addAll(fields,declaredFields);
       if (rs==null) return list;
       while (rs.next()) {
           T t = clazz.newInstance();
           for (Field declaredField : fields) {
               declaredField.setAccessible(true);
               declaredField.set(t, rs.getObject(declaredField.getName()));
           }
           list.add(t);
       }
       return list;
   }


 public static <T> List<T> executeQuery(String sql,Class<T> clazz,Object... params){
       Connection conn = null;
       PreparedStatement pst = null;
       ResultSet rs = null;

       try {
           conn = getconnection();
            pst = conn.prepareStatement(sql);
           if (params!=null && params.length>0){
               for (int i = 0; i < params.length; i++) {
                   pst.setObject(i+1,params[i]);
               }
           }
               rs = pst.executeQuery();

              return  parseResuletset(rs, clazz);

       } catch (SQLException throwables) {
           throwables.printStackTrace();
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       } catch (InstantiationException e) {
           e.printStackTrace();
       }finally {
           close(rs,pst,conn);
       }
       return null;
   }

资源关闭

   public static void close(ResultSet rs , PreparedStatement pst , Connection conn){
       try {
           if (rs!=null) rs.close();
           if (pst != null) pst.close();
           if (conn != null) conn.close();
       } catch (SQLException throwables) {
           throwables.printStackTrace();
       }

   }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值