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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>