测试类
package test;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.List;
import java.util.Properties;
public class TestDemo {
public static void main(String[] args) throws Exception {
// 调用自己写的工具类
UtilJdbc uj = new UtilJdbc();
// 获取一个连接池
DataSource ds = uj.getDataSource();
JdbcTemplate jt = new JdbcTemplate(ds);
int update = jt.update("UPDATE tb_brand set status = ? where brand_name =?",0,"小米");
System.out.println(update);
List reasult = jt.select("select * from tb_brand where brand_name = ?",Acnnt.class,"小米");
for (int i = 0; i < reasult.size(); i++) {
System.out.println(reasult.get(i));
}
}
}
封装代码
package test;
import javax.sql.DataSource;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JdbcTemplate {
private DataSource ds;
JdbcTemplate(DataSource ds) {
this.ds = ds;
}
/*
* 执行增删改语句的方法
* sql 要sql语句
* params sql中?占位符对应的参数
* 返回影响的行数
* */
//params是一个可变集合,主要是不知道用户会传递几个参数过来
public int update(String sql,Object...params) throws Exception {
// 建立连接
Connection conn = ds.getConnection();
// 执行sql语句
PreparedStatement psm = conn.prepareStatement(sql);
// 遍历可变集合
for (int i = 0; i < params.length; i++) {
// 将每一个通过所应获取的数据替换掉对应的?符
psm.setObject(i+1,params[i]);
}
// 执行增删改
int i = psm.executeUpdate();
psm.close();
conn.close();
return i;
}
// 返回的是一个未定义泛型的集合,这个泛型是传入的实体类的类型
public <T> List<T> select(String sql, Class<T> aclass, Object...params) throws Exception {
// 建立连接
Connection conn = ds.getConnection();
// 执行sql语句
PreparedStatement psm = conn.prepareStatement(sql);
// 创建一个集合,主要存储实体类对象的,所以泛型也是实体类的类型
List<T> list = new ArrayList<>();
// 遍历传入的Object类型的数组
for (int i = 0; i < params.length; i++) {
// 将每一个对应的?符替换成对应的数据
psm.setObject(i+1,params[i]);
}
// 执行查询语句
ResultSet rs = psm.executeQuery();
while (rs.next()){
// 获取查询结果的元数据对象:列的数量,列的名称
// 意思就是这个元数据对象包含的就是整张表的数据
// 之里面的数据是整个表里面列的行数,列的名称之类的数据
ResultSetMetaData metaData = rs.getMetaData();
// 调用方法getColumnCount()可以查询到这张表有多少列
int columnCount = metaData.getColumnCount();
// 通过反射获取构造方法并且传回一个构造方法集合
Constructor<T> declaredConstructor = aclass.getDeclaredConstructor();
// 通过反射创建实体类对象
T t = declaredConstructor.newInstance();
for (int i = 1; i <= columnCount; i++) {
// 获取到对应列的数据
Object object = rs.getObject(i);
// 获取到对应列的名称
String columnName = metaData.getColumnName(i);
// 通过列名和实体类的字节码对象创建一个PropertyDescriptor对象
// 内省->通过属性名找到对应setXxx方法给属性赋值
PropertyDescriptor descriptor = new PropertyDescriptor(columnName, aclass);
// 将数据赋值给对应的成员变量
Method writeMethod = descriptor.getWriteMethod();//setName("xxx")
// 给实体类的成员变量赋值,当每个成员变量值都赋完时,这个实体类对象就创建完成
writeMethod.invoke(t,object);
}
// 将实体类的对象加入集合
list.add(t);
}
// 返回集合
return list;
}
}
工具类
package test;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;
public class UtilJdbc {
private static DataSource ds;
static {
try {
// 创建Properties对象
Properties pro = new Properties();
// 使用ClassLoader(类加载器)获取到一个io流,这个io流直接连接的就是配置文件
InputStream is = ClassLoader.getSystemResourceAsStream("druid.properties");
// 将Properties对象读取配置文件
pro.load(is);
is.close();
// 调用DruidDataSourceFactory(Druid数据资源工厂)中的createDataSource(创建数据资源)
// 初始化连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
public DataSource getDataSource(){
return ds;
}
}
实体类
package test;
public class Acnnt {
private int id;
private String brand_name;
private String company_name;
private int ordered;
private String description;
private int status;
public Acnnt() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBrand_name() {
return brand_name;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public String getCompany_name() {
return company_name;
}
public void setCompany_name(String company_name) {
this.company_name = company_name;
}
public int getOrdered() {
return ordered;
}
public void setOrdered(int ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return "Acnnt{" +
"id=" + id +
", brand_name='" + brand_name + '\'' +
", company_name='" + company_name + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}