先看资源包,这里我们用到的是我红色框起来的资源包
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/train?sueSSL=false&serverTimezone=UTC
username=root
password=123456
封装的代码如下
package ReflectJdbcSellectAll;
import org.apache.commons.beanutils.BeanUtils;
import reflectionJdbc.jdbcUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.*;
@SuppressWarnings("all")
public class JdbcUtils {
private static String driverClass;
private static String url;
private static String username;
private static String password;
static {
Properties properties = new Properties();
//通过反射Class实例获取类加载器,然后通过类加载器获取数据流对象
//方法①/*InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("selectJdbc.properties");*/
/*properties.load(resourceAsStream);*/
try {
//方法②
properties.load(new FileInputStream("src/selectJdbc.properties"));
//将properties中的有效值提取出来
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
try {
//获取类加载驱动
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取连接
*
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
/**
* 进行预处理
*
* @param sql 传入的sql语句
* @param conn 获取连接
* @param values 传入的参数
* @return 返回预处理结果
* @throws SQLException
*/
public static PreparedStatement getPreparedStatement(String sql, Connection conn, Object... values) throws SQLException {
PreparedStatement preparedstatement = conn.prepareStatement(sql);
//获取元数据
ParameterMetaData parameterMetaData = preparedstatement.getParameterMetaData();
//通过元数据获取需要传入参数的数量
int parameterCount = parameterMetaData.getParameterCount();
//判断什么情况才需要给预编译对象赋值
if (parameterCount > 0 && values != null && values.length > 0) {
for (int i = 0; i < parameterCount; i++) {
preparedstatement.setObject(i + 1, values[i]);
}
}
//返回预处理结果
return preparedstatement;
}
/**
* 第1种
* 通过反射将你的JavaBean对象装入集合当中
*
* @param sql 传入的sql语句
* @param c Class<T> c 相当于 Class<T> c = T.class()
* @param values 传入的参数
* @param <T> 你所要查询的JavaBean
* @return list集合,里面全是T对象
* @throws SQLException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static <T> List<T> ListSelect(String sql, Class<T> c, Object... values) throws SQLException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//获取连接
Connection connection = JdbcUtils.getConnection();
//进行预处理
PreparedStatement preparedStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
//获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
//通过结果集获取元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//获取结果集当中的所有列数
int columnCount = metaData.getColumnCount();
List<T> list = new ArrayList<>();
//遍历结果集
while (resultSet.next()) {
T bean = c.getConstructor().newInstance();
for (int i = 0; i < columnCount; i++) {
/**
* BeanUtils.setProperty() 函数是 Apache Commons BeanUtils库中提供的一个函数,
* 它可以帮助我们通过 Java 反射机制动态设置 JavaBean 对象的属性值,
* 无需手动编写 JavaBean 的 set方法。该函数的作用是通过反射机制找到目标对象的相应属性,
* 并且将属性值设置为给定值。
*
* 其中bean就是上述所说的JavaBean
* metaData.getColumnName()就是获取bean当中set方法
* resultSet.getObject()就是获取结果集当中的值,()当中可以通过列数获取,也可以通过列名获取
*/
BeanUtils.setProperty(bean, metaData.getColumnName(i + 1), resultSet.getObject(i + 1));
}
list.add(bean);
}
close(connection,preparedStatement,resultSet);
return list;
}
/** 第2种
* 封装查询 思想,传入一个泛型类,然后将查询结果以指定类的形式返回
* sql 泛型类 可变参数
* BeanUtils可以帮助我们把属性封装当JavaBean对象的对应属性中,
* 比如可以把提交的表单数据封装到一个实体对象中。
* 封装时要求参数名称和JavaBean的属性明相同
* @param sql 根据给定的条件参数从表中查询数据
* @param c 反射对象类
* @param values 查询条件的参数列表
* @param <T> 传进去的任意类型
* @return 将查询结果以指定类的形式返回
* @throws SQLException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static <T> T BeanQuery(String sql, Class<T> c, Object... values) throws
SQLException, NoSuchMethodException, InvocationTargetException,
InstantiationException, IllegalAccessException {
Connection connection = JdbcUtils.getConnection();
//预处理
PreparedStatement preparedStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
//获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
//获取元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//获取列数
int columnCount = metaData.getColumnCount();
T t = null;
while (resultSet.next()) {
t = c.getConstructor().newInstance();
for (int i = 0; i < columnCount; i++) {
/**
* BeanUtils.setProperty() 函数是 Apache Commons BeanUtils库中提供的一个函数,
* 它可以帮助我们通过 Java 反射机制动态设置 JavaBean 对象的属性值,
* 无需手动编写 JavaBean 的 set方法。该函数的作用是通过反射机制找到目标对象的相应属性,
* 并且将属性值设置为给定值。
*
* 其中bean就是上述所说的JavaBean
* metaData.getColumnName()就是获取bean当中set方法
* resultSet.getObject()就是获取结果集当中的值,()当中可以通过列数获取,也可以通过列名获取
*/
BeanUtils.setProperty(t, metaData.getColumnName(i + 1), resultSet.getObject(i + 1));
}
}
//释放资源
close(connection, preparedStatement, resultSet);
return t;
}
/** 第3种
* 返回数据以Map<String,Object>形式返回 String表示sql表项(不可重复),
* Object表示每个表项对应的值
* @param sql
* @param values
* @return
*/
public static Map<String, Object> queryMap(String sql, Object... values) {
HashMap<String, Object> map = null;
try {
//获取连接
Connection connection = JdbcUtils.getConnection();
//进行预处理
PreparedStatement prepareStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
//获取结果集
ResultSet resultSet = prepareStatement.executeQuery();
//获取元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//获取列数
int columnCount = metaData.getColumnCount();
//定义一个Map集合
map = new HashMap<>();
while (resultSet.next()) {
for (int i = 0; i < columnCount; i++) {
String columnName = metaData.getColumnName(i + 1);
Object object = resultSet.getObject(i + 1);
map.put(columnName, object);
}
}
JdbcUtils.close(connection, prepareStatement, resultSet);
} catch (SQLException e) {
e.printStackTrace();
}
return map;
}
/** 第4种
* 结果以list<Object[]>形式返回 list集合中元素都是数组
* @param sql
* @param parameters 可变参数列表
* @return
*/
public static List<Object[]> queryArrayList(String sql,Object...values){
ArrayList<Object[]> ArrayListobjects = null;
try {
Connection connection = JdbcUtils.getConnection();
PreparedStatement prepareStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
ResultSet resultSet = prepareStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
//通过元数据获取列数
int columnCount = metaData.getColumnCount();
ArrayListobjects = new ArrayList<>();
while (resultSet.next()){
//这个数组的长度刚好是查询的列数
Object[] objs = new Object[columnCount];
for (int i = 0; i < columnCount; i++) {
objs[i] = resultSet.getObject(i + 1);
}
ArrayListobjects.add(objs);
}
JdbcUtils.close(connection,prepareStatement,resultSet);
} catch (SQLException e) {
e.printStackTrace();
}
return ArrayListobjects;
}
/** 第5种
* 功能:结果以数组形式保存并且返回
* @param sql 查询的sql
* @param parameters 参数列表
* @return 返回 Object[]
*/
public static Object[] queryArray(String sql,Object...values){
Object[] objs = new Object[0];
try {
Connection connection = JdbcUtils.getConnection();
PreparedStatement prepareStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
ResultSet resultSet = prepareStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
//通过元数据获取列数
int columnCount = metaData.getColumnCount();
//这个数组的长度刚好是查询的列数
objs = new Object[columnCount];
while (resultSet.next()){
for (int i = 0; i < columnCount; i++) {
//列数是从第一列开始的
objs[i] = resultSet.getObject(i + 1);
}
}
JdbcUtils.close(connection,prepareStatement,resultSet);
} catch (SQLException e) {
e.printStackTrace();
}
return objs;
}
public static void close(Connection connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection connection, PreparedStatement preparedStatement) {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
try {
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这里我们就以JavaBean当中的students为例进行结果演示,以封装的第1种方法为例进行查询
package ReflectJdbcSellectAll;
import ReflectJdbcSellectAll.JavaBean.students;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
public class TextRun {
public static void main(String[] args) throws SQLException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
String sql = "select * from students where ssex = ?";
List<students> list = JdbcUtils.ListSelect(sql, students.class,"男");
System.out.println("sno"+'\t'+'\t'+"sname"+'\t'+'\t'+"ssex"+'\t'+'\t'+"sbirthday"+'\t'+'\t'+"calssz");
for (students students : list) {
System.out.println(students.getSno()+'\t'+'\t'+
students.getSname()+'\t'+'\t'+
students.getSsex()+'\t'+'\t'+
students.getSbirthday()+'\t'+'\t'+'\t'+'\t'+
students.getClassz());
}
}
}
格式尽力在对齐了...