JDBC(七)—— Dao层操作

dao层操作

BaseDao基本增删改查

package com.why.dao;

import com.why.entity.User;
import com.why.utils.JdbcUtils;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
* @Description TODO 封装针对于数据表的通用操作
* @Author why
* @Date 2020/10/14 9:08
* Version 1.0
**/
public abstract class BaseDao {

   /**
    * 通用的更新操作,增删改,不支持事务
    * @param sql
    * @param args
    */
   public void update(String sql,Object ...args) {
       Connection conn = null;
       PreparedStatement ps = null;
       try {
           //1.获取连接
           conn = JdbcUtils.getConnection();
           //2.预编译sql语句,返回preparedStatement实例
           ps = conn.prepareStatement(sql);
           //3.填充占位符
           //sql占位符的个数与可变形参的长度相同,可变形参相当于一个数组
           for (int i = 0; i < args.length ; i++) {
               ps.setObject(i+1,args[i]);
          }
           //4.执行
           ps.execute();
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //5.资源关闭
           JdbcUtils.closeResource(conn,ps);
      }
  }

   /**
    * 支持事务的增删改操作
    * @param conn
    * @param sql
    * @param args
    */
   public int update(Connection conn,String sql,Object ...args){
       PreparedStatement ps = null;
       try {
           //2.预编译sql语句,返回preparedStatement实例
           ps = conn.prepareStatement(sql);
           //3.填充占位符
           //sql占位符的个数与可变形参的长度相同,可变形参相当于一个数组
           for (int i = 0; i < args.length ; i++) {
               ps.setObject(i+1,args[i]);
          }
           //4.执行
           return ps.executeUpdate();
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //5.资源关闭
           JdbcUtils.closeResource(null,ps);
      }
       return 0;
  }

   /**
    * 通用查询不支持事务
    * @param clazz
    * @param sql
    * @param args
    * @param <T>
    * @return
    */
   public <T>T queryForDifference(Class<T> clazz, String sql, Object ...args) {
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           //1.获取链接
           conn = JdbcUtils.getConnection();

           //2.预编译sql语句,获取preparedStatement实例
           ps = conn.prepareStatement(sql);
           //3.填充占位符
           for (int i = 0; i < args.length; i++) {
               ps.setObject(i+1,args[i]);
          }
           //4.执行,获取结果集
           rs = ps.executeQuery();
           //4.1获取结果集元数据
           ResultSetMetaData rsmd = rs.getMetaData();
           //4.2通过元数据获取列数
           int columnCount = rsmd.getColumnCount();
           //4.3判断是否有数据
           if (rs.next()){
               //4.3.1实例化一个对象,反射
               T t = clazz.getDeclaredConstructor().newInstance();
               //4.3.2处理结果集一行数据的每一列
               for (int i = 0; i < columnCount; i++) {
                   //获取列值
                   Object columnValue = rs.getObject(i + 1);
                   //获取列的别名
                   String columnName = rsmd.getColumnLabel(i+1);
                   //给对象指定的属性赋值为columnValue
                   Field field = clazz.getDeclaredField(columnName);
                   field.setAccessible(true);
                   field.set(t,columnValue);
              }
               return t;
          }
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //5.关闭资源
           JdbcUtils.closeResource(conn,ps,rs);
      }
       return null;
  }

   /**
    * 通用查询操作,支持事务
    * @param conn
    * @param clazz
    * @param sql
    * @param args
    * @param <T>
    * @return
    */
   public <T>T queryForDifference(Connection conn,Class<T> clazz, String sql, Object ...args) {
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           //1.获取链接
           conn = JdbcUtils.getConnection();

           //2.预编译sql语句,获取preparedStatement实例
           ps = conn.prepareStatement(sql);
           //3.填充占位符
           for (int i = 0; i < args.length; i++) {
               ps.setObject(i+1,args[i]);
          }
           //4.执行,获取结果集
           rs = ps.executeQuery();
           //4.1获取结果集元数据
           ResultSetMetaData rsmd = rs.getMetaData();
           //4.2通过元数据获取列数
           int columnCount = rsmd.getColumnCount();
           //4.3判断是否有数据
           if (rs.next()){
               //4.3.1实例化一个对象,反射
               T t = clazz.getDeclaredConstructor().newInstance();
               //4.3.2处理结果集一行数据的每一列
               for (int i = 0; i < columnCount; i++) {
                   //获取列值
                   Object columnValue = rs.getObject(i + 1);
                   //获取列的别名
                   String columnName = rsmd.getColumnLabel(i+1);
                   //给对象指定的属性赋值为columnValue
                   Field field = clazz.getDeclaredField(columnName);
                   field.setAccessible(true);
                   field.set(t,columnValue);
              }
               return t;
          }
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //5.关闭资源
           JdbcUtils.closeResource(null,ps,rs);
      }
       return null;
  }

   /**
    * 返回多个对象的查询操作,不支持事务
    * @param clazz
    * @param sql
    * @param args
    * @param <T>
    * @return
    * @throws Exception
    */
   public <T> List<T> queryAll(Class<T> clazz, String sql, Object ...args) throws Exception {
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           //1.获取数据库连接对象
           conn = JdbcUtils.getConnection();
           //2.预编译sql语句,得到preparedStatement实例
           ps = conn.prepareStatement(sql);
           //3.填充占位符
           for (int i = 0; i < args.length; i++) {
               ps.setObject(i+1,args[i]);
          }
           //4.执行返回结果集
           rs = ps.executeQuery();
           //4.1获取结果集元数据
           ResultSetMetaData rsmd = rs.getMetaData();
           //4.2获取元数据列数
           int columnCount = rsmd.getColumnCount();
           //创建集合
           List<T> list = new ArrayList<>();
           //4.3判断是否有数据
           while (rs.next()){
               //4.3.1实例化对象
               T t = clazz.getDeclaredConstructor().newInstance();
               //处理结果集一行数据的每一列,给T对象赋值
               for (int i = 0; i < columnCount; i++) {
                   //获取列值
                   Object columnValue = rs.getObject(i + 1);
                   //获取列别名
                   String columnLabel = rsmd.getColumnLabel(i + 1);
                   //给指定对象赋值
                   Field field = t.getClass().getDeclaredField(columnLabel);
                   field.setAccessible(true);
                   field.set(t,columnValue);
              }
               list.add(t);
          }
           return list;
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //5.关闭资源
           JdbcUtils.closeResource(conn,ps,rs);
      }

       return null;
  }

   /**
    * 支持事务的返回多个对象的查询操作
    * @param conn
    * @param clazz
    * @param sql
    * @param args
    * @param <T>
    * @return
    * @throws Exception
    */
   public <T> List<T> queryAll(Connection conn,Class<T> clazz, String sql, Object ...args) throws Exception {
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           //1.获取数据库连接对象
           conn = JdbcUtils.getConnection();
           //2.预编译sql语句,得到preparedStatement实例
           ps = conn.prepareStatement(sql);
           //3.填充占位符
           for (int i = 0; i < args.length; i++) {
               ps.setObject(i+1,args[i]);
          }
           //4.执行返回结果集
           rs = ps.executeQuery();
           //4.1获取结果集元数据
           ResultSetMetaData rsmd = rs.getMetaData();
           //4.2获取元数据列数
           int columnCount = rsmd.getColumnCount();
           //创建集合
           List<T> list = new ArrayList<>();
           //4.3判断是否有数据
           while (rs.next()){
               //4.3.1实例化对象
               T t = clazz.getDeclaredConstructor().newInstance();
               //处理结果集一行数据的每一列,给T对象赋值
               for (int i = 0; i < columnCount; i++) {
                   //获取列值
                   Object columnValue = rs.getObject(i + 1);
                   //获取列别名
                   String columnLabel = rsmd.getColumnLabel(i + 1);
                   //给指定对象赋值
                   Field field = t.getClass().getDeclaredField(columnLabel);
                   field.setAccessible(true);
                   field.set(t,columnValue);
              }
               list.add(t);
          }
           return list;
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //5.关闭资源
           JdbcUtils.closeResource(null,ps,rs);
      }

       return null;
  }

   /**
    * 查询一些特殊值,支持事务
    * @param conn
    * @param sql
    * @param args
    * @param <T>
    * @return
    */
   public <T> T getValue(Connection conn,String sql,Object...args) {
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           ps = conn.prepareStatement(sql);
           for (int i = 0; i < args.length; i++) {
               ps.setObject(i+1,args[i]);
          }
           rs = ps.executeQuery();
           if (rs.next()){
               return (T) rs.getObject(1);
          }
      } catch (SQLException throwables) {
           throwables.printStackTrace();
      } finally {
           JdbcUtils.closeResource(null,ps,rs);
      }
       return null;
  }
}

 

原文地址:https://www.cnblogs.com/whystudyjava/p/14135423.html