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