JDBC通过泛型实现通用查询
//用于接收数据的类,通过反射创建对象并赋值
package util;
public class Student {
private int id;
private String stuName;
private Integer sex;
private Integer claId;
private Integer grade;
private String stuNo;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getClaId() {
return claId;
}
public void setClaId(Integer claId) {
this.claId = claId;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public void print(){
System.out.println("id="+id+" stuName="+stuName+" sex="+sex);
}
}
package util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
public class Conn2 {
// 数据库地址URL
private static final String URL = "jdbc:mysql://localhost:3306/mydb?" + "userUnicode=true&characterEncoding=utf8"
+ "&serverTimezone=Asia/Shanghai&useSSL=false";
// 数据库账户名
private static final String USER = "root";
// 数据库密码
private static final String PASS = "2411030483";
// 数据库连接类
static Connection conn = null;
// 接收查询返回的结果集
static ResultSet rs = null;
// 预编译sql语句的对象
static PreparedStatement ps = null;
// 1.连接初始化
public static void init() {
if (conn == null) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(URL, USER, PASS);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("数据库连接失败");
e.printStackTrace();
}
System.out.println("数据库连接成功");
} else {
System.out.println("数据库连接失败");
}
}
// 2.关闭连接
public static void close() {
if (rs != null)
rs=null;
if (ps != null)
ps=null;
if (conn != null)
conn=null;
}
/*
* 泛型 <T>声明此方法持有一个类型T,也可以理解此方法为一个泛型方法
* List<T>声明此方法的返回值类型为List集合,且集合中的元素是泛型T类型 Class<T> cls指明泛型T的类型
*Class<T> cls指明泛型T的具体类型
*/
public static <T> List<T> queryAll(String sql, Class<T> cls,Object... params) {
init();
try {
ps = conn.prepareStatement(sql);
if(params!=null){
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
}
rs = ps.executeQuery();
//检索此ResultSet对象的列数、类型和字段
ResultSetMetaData rsd = rs.getMetaData();
List<T> list=new ArrayList<T>();
while (rs.next()) {//向下读一行
//泛型实例化
T t = cls.newInstance();
for (int i = 0; i < rsd.getColumnCount(); i++) {
try{
//获取指定列的别名,如果sql语句中没有指定别名,则返回值与getColumnName方法相同
String column = rsd.getColumnLabel(i + 1);
Object value = rs.getObject(column);
//通过反射获取变量Field对象
Field field = cls.getDeclaredField(getParam(column));
//开启允许访问私有变量的权限
field.setAccessible(true);
//给变量赋值
field.set(t, value);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
list.add(t);
}
return list;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}finally{
close();
}
}
// 数据库字段转变量,例如stu_name转为stuName
public static String getParam(String column) {
String[] arr = column.split("_");
StringBuffer sf = new StringBuffer(arr[0]);
for (int i = 1; i < arr.length; i++) {
sf.append(arr[i].substring(0, 1).toUpperCase() + arr[i].substring(1));
}
return sf.toString();
}
public static void main(String[] args) {
String sql="select * from stu_info where id=? and stu_name=?";
List<Student> list=queryAll(sql, Student.class, 1,"张三");
for (Student student : list) {
student.print();
}
}
}
版权声明:本文为qq_43238335原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。