关于jdbc的通用查询方法,以及获取结果集RsultSet的处理

关于jdbc的通用查询方法,以及获取结果集RsultSet的处理

第一步:先导入jar包

在网上下载mysql-connector-java-5.1.45.jar

然后新建一个lib包用来存放jar包

C:\Users\杨朋朋\OneDrive\桌面\1.png

之后将下载好的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集合中返回给方法调用者。

jdbc的通用查询方法就到这里讲解完毕了,下次再会
发布了1 篇原创文章 · 获赞 3 · 访问量 23

猜你喜欢

转载自blog.csdn.net/java_yeluo/article/details/104930559
今日推荐