【加强】对代码进行封装,创建一个工具类,用到了反射还有内省

测试类

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 +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值