DaoUtils:

import d_druid.DruidUtils;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DaoUtils {
    public static int  commonUpdate(String sql,Object...obs){
        Connection conn=null;
        PreparedStatement ps=null;

        try {
            conn= DruidUtils.getConnection();
            ps=conn.prepareStatement(sql);
            for (int i=0;i<obs.length;i++){
                ps.setObject(i+1,obs[i]);
            }
            int i=ps.executeUpdate();
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            DruidUtils.closeAll(ps,conn);
        }
        return 0;
    }

    public  static <T> List<T> selectAll(String sql,Class<T> clazz,Object...obs){
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        List<T> list=new ArrayList<>();
        try {
            conn=DruidUtils.getConnection();
            ps=conn.prepareStatement(sql);
            for (int i=0;i<obs.length;i++){
                ps.setObject(i+1,obs[i]);
            }
            rs=ps.executeQuery();
            Field[] fields=clazz.getDeclaredFields();
            while (rs.next()){
                try {
                    T t = clazz.newInstance();
                    for (Field f:fields){
                            f.setAccessible(true);
                            f.set(t,rs.getObject(f.getName()));
                    }
                    list.add(t);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  list;
    }
}

DBUtils工具类:

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtils {
    private  static Properties p=new Properties(); //将properties对象声明为static,因为要在静态代码块中使用
    private  static ThreadLocal<Connection> TH=new ThreadLocal<>(); //本地线程对象管理连接对象,实现共享同一个连接对象,方便进行事务
    static{
        try {
            p.load(new FileInputStream("db.properties")); //将properties对象读取配置文件的操作以及加载驱动放入静态代码块中
            Class.forName(p.getProperty("driver"));   //这样就会在类加载前进行加载,并且只加载一次
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public  static Connection getConnecton(){
        Connection conn=null;
        conn=TH.get(); //通过本地线程对象获取连接对象
        try {
            if(conn==null){ //如果连接对象为空,则创建
                //通过properties对象读取配置文件中的key,从而获取它们的值进行创建连接,这样可以实现软编码
                //以后变更连接信息,不需要修改java代码,只需要修改配置文件即可,更加灵活方便,properties配置文件中key与value是通过=号进行分隔
                conn= DriverManager.getConnection(p.getProperty("url"),p.getProperty("user"),p.getProperty("password"));
                TH.set(conn);
            }


        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //开启事务
    public  static  void begin(){
        Connection conn=null;
            try {
                conn=getConnecton();
                conn.setAutoCommit(false);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    //提交事务
    public static  void commit(){
        Connection conn=null;

        try {
            conn=getConnecton();
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            TH.remove();
            closeAll(conn);
        }
    }

    public static  void rollback(){
        Connection conn=null;

        try {
            conn=getConnecton();
            conn.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            TH.remove();
            closeAll(conn);
        }
    }



    //封装JDBC的连接关闭操作
    public  static  void closeAll(AutoCloseable ...ac){
        for (AutoCloseable a:ac) {
            /*if(a instanceof Connection){
                TH.remove(); //本地线程对象中移除线程
                System.out.println("移除连接对象");
            }*/
            if(a!=null){
                try {
                    a.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Student.java:

package e_work;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    private  int age;
    private String stno;
}

StudentDaoImpl.java:

import com.sun.corba.se.pept.transport.ConnectionCache;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class StudentDaoImpl {
    public  int commonUpdate(){
        Connection conn=null;
        try {
            conn=DBUtils.getConnecton();
            conn.setAutoCommit(false);
            String sql="insert into stu values(null,?,?,?)";
            String sql2="select * from stu where stno=?";
            List<Student>list=DaoUtils.selectAll(sql2,Student.class,"2002");
            if (list.size()==0){
                return DaoUtils.commonUpdate(sql,"zls",18,"2002");
            }
           conn.commit();
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("事务回滚");
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        finally {
            DBUtils.closeAll(conn);
        }
        return 0;

    }

    public List<Student> selectAll(){
        String sql="select * from stu";
        List<Student> list=DaoUtils.selectAll(sql,Student.class);
        return list;
    }
}

最后的main函数Test类:

package e_work;

import java.util.List;

public class Test {
    public static void main(String[] args) {
     //添加
    StudentDaoImpl studentDao=new StudentDaoImpl();
    int n=studentDao.commonUpdate();
    if (n==0){
        System.out.println("用户已存在,添加失败");
    }
    else {
        System.out.println("成功添加"+n+"条数据");
    }


    //查询
        List<Student>list=studentDao.selectAll();
        System.out.println(list);
    }
}