结合反射和原始的jdbc模拟查询和封装的实现

druid连接池工具类

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtil {
    private static DataSource ds;
    static {
        try {
            FileInputStream fis = new FileInputStream("D:\\Javaweb\\java.10\\src\\druid.properties");
            Properties pro = new Properties();
            pro.load(fis);
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection con() throws SQLException {
        return ds.getConnection();
    }
    public static DataSource getds(){
        return ds;
    }
    public static void close(Statement stat,Connection con){
        if(stat!=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
    public static void close(ResultSet rs, Statement stat,Connection con){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
       close(stat,con);

    }
}

配置文件druid.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///db4?useSSL=false&serverTimezone=UTC
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000

实体类

import java.util.List;

public class Dept {
    private Integer id;
    private String name;
    

    @Override
    public String toString() {
        return "Dept{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public Dept() {
    }

    public Dept(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    
}

实现封装代码

package com;

import com.bean.Emp;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

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

public class TestJdbcTemplate {

    @Test
    public void testQuery1(){
        List<Dept> depts= myQuery("select * from dept where id> ?", Emp.class, 3);
        System.out.println(depts);
    }

    // 结合反射和原始的jdbc模拟查询和封装的实现
    public <T> List<T> myQuery(String sql, Class<T> c,Object ...args){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql:///db3","root","root");
            //3.获取执行sql的对象
            PreparedStatement pstm = con.prepareStatement(sql);
            //4.给占位符赋值
            for (int i = 0; i < args.length; i++) {
                pstm.setObject(i+1,args[i]);
            }
            //5.执行sql
            ResultSet rs = pstm.executeQuery();
            //6.处理结果集--拆开rs
            //元数据--可以获取结果集中的列数,列名,列类型
            ResultSetMetaData md = rs.getMetaData();
            //获取总列数
            int columnCount = md.getColumnCount();
            ArrayList<T> ts = new ArrayList<>();
            while (rs.next()){//外层循环遍历每一行
                T t = c.newInstance();
                for (int i = 1; i <= columnCount; i++) {//外层循环遍历每一行的每一个单元格
                    Object value = rs.getObject(i);
                    String columnName = md.getColumnName(i).toLowerCase();//获取每一个列的列名--和T中的属性名一致的
                    String columnName1 = md.getColumnLabel(i);//获取每一个列的列名--和T中的属性名一致的
                    String columnName2 = md.getColumnClassName(i);//获取每一个列的列名--和T中的属性名一致的
                    System.out.println(columnName+"--"+columnName1+"--"+columnName2);
                    Field f = c.getDeclaredField(columnName);
                    f.setAccessible(true);//开启私有属性的操作权限
                    f.set(t,value);
                }
                ts.add(t);

            }
            return ts;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值