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);
}
}