关于jdbc的通用查询方法,以及获取结果集RsultSet的处理
第一步:先导入jar包
在网上下载mysql-connector-java-5.1.45.jar
然后新建一个lib包用来存放jar包
之后将下载好的mysql-connector-java-5.1.45.jar复制粘贴进这个包,也就是在你需要导入的Jar包上,点击右键,选择Add as Library…会出现一个小窗口点OK就行了
第二步:首先链接数据库需要写个获取链接方法,在以后的编写代码中不用多次书写。
因为以后要经常用到jdbc各种方法,所以我直接用jdbc工具类的方式
首先我们需要连接数据库需要什么,也就是进入数据库需要什么
URL:数据库的地址
USERNAME:进入数据库的用户名
PASSWORD:进入数据库的密码
//首先我们先创建一个类
public class JdbcUtil {
//链接数据库需要传入这些参数,我们先声明出来
private static final String URL = "jdbc:mysql:///db2?characterEncoding=utf8";
private static final String USERNAME = "root";
private static final String PASSWORD = "1111";
//然后我们写一个链接方法用来链接数据库、返回的是一个链接对象
public static Connection getConnection() {
//这里是Connection的引用声明,因为要返回给调用者,所以不能在try里声明
Connection conn = null;
try {
/*
*当程序运行到 Class.forName(“com.mysql.jdbc.Driver”); 时,类加载器加载了com.mysql.jdbc.Driver这个类。
*/
Class.forName("com.mysql.jdbc.Driver");
//DriverManager:提供管理一组 JDBC 驱动程序的基本服务。通过它来使用驱动类
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
第三步:写查询方法,在工具类中添加一个新的方法executeQuery
因为查询的表的结构我们不知道,也就是一行有多少列,所以我们可以用反射写个通用的查询方法。
而且我们也不知道具体的实体类是什么结构,所以我们要用到反射获取类的属性字段。
public static <T> List<T> query(Class<T> clazz,String sql,Object...data){
List list = new ArrayList();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//调用链接方法获取与数据库的链接
conn = getConnection();
//利用传入的sql语句创建一个pstmt对象,以便于我们把传入的数组里的数据放到sql语句中
pstmt = conn.prepareStatement(sql);
if (data != null){
for (int i = 0; i < data.length; i++) {
pstmt.setObject(i+1,data[i]);
}
}
//通过executeQuery方法执行最终的sql语句,获取到结果集rs对象
rs = pstmt.executeQuery();
//通过next方法遍历rs
while(rs.next()){
ResultSetMetaData metaData = rs.getMetaData();//获取标的元数据,也就是 表的行
T obj = clazz.newInstance();
//一行有很多列,用for遍历列getColumnCont方法是获取有多少列的
for (int i = 0; i < metaData.getColumnCount(); i++) {
//getColumnName()方法,括号是从1开始的列,每次循环i++,这个方法是获取下标所对应的列名
String columnName = metaData.getColumnName(i+1);//元数据metadate中的数据也是从1开始,不要忘i是0所以要加一
Object object = rs.getObject(columnName);//根据列明从rs结果集中获取数据
Field field = clazz.getDeclaredField(columnName);//根据列明获取传入的类的属性的字段,也就是获取属性名
field.setAccessible(true);//更改访问模式 ,强制访问私有属性
field.set(obj,object);//将数据写入字段,obj实际上就是传入的类的class的实例对象,就是这个 T obj = clazz.newInstance();
}
list.add(obj);
}
} catch (SQLException | InstantiationException | IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}
return list;
}
上述代码对于结果集的处理我已经做了详细的注释,其实就是我们通过驱动类执行我们需要的sql语句,然后获取到结果集rs,通过rs中的方法获取对应的数据。然后再依据传入的类名创建该类的对象,之后用set方法进行封装,并放到List集合中返回给方法调用者。