从Mysql查询数据工具类

351 阅读5分钟

今天分享又来了呀。ღ( ´・ᴗ・` ) 一起学习进步ღゝ◡╹)ノ♡****

摘要:通用型工具类,从mysql数据库中查询数据,查完后把查询到的数据封装成对象。

加油,好好学习,天天向上~ \

I:

jdbc编程有6个步骤(套路):

1 注册驱动 

2 创建连接 

3 创建数据库操作对象 

4 执行SQL语句 

5 处理结果集 

6 释放资源

****驱动。我们要想使用驱动,前提是,把驱动的程序或者依赖给加入进来。它在哪呢?

粘贴后:com.mysql.jdbc.Driver

:

一个完整的工具类写法

package com.alibaba.gmall.realtime.utils;


import com.alibaba.gmall.realtime.bean.TableProcess;
import com.google.common.base.CaseFormat;   谷歌的工具类。
import org.apache.commons.beanutils.BeanUtils;


import java.sql.*;
import java.util.ArrayList;
import java.util.List;


/**
 * Desc: 从MySQL数据中查询数据的工具类
 * 完成ORM,对象关系映射
 * O:Object对象       Java中对象
 * R:Relation关系     关系型数据库
 * M:Mapping映射      将Java中的对象和关系型数据库的表中的记录建立起映射关系。具体如下:
 * 数据库                 Java
 * 表t_student           类Student
 * 字段id,name           属性id,name
 * 记录 100,zs           对象100,zs
我们把对象关系理解好之后,我们需要自己写一个程序,把数据库和java对象的对应关系建立起来。
数据库查询出来的:java中用集合来存放:
 * ResultSet(一条条的记录)             List(一个个的Java对象)
 */


工具类里面的方法都是静态的。


public class MySQLUtil {
    /**
     * @param sql               执行的查询语句
     * @param clz               返回的数据类型
     * @param underScoreToCamel 是否将下划线转换为驼峰命名法
     * @param <T>
     * @return
     */
  到某张表里查询数据,返回的应该是多条数据,如果是jdbc,返回的应该是resultSet。
  如果是java的话,那么就应该是用过集合来接收,所以写成List,但是集合中来接收什么类型的数据呢?所以写成泛型List<?>。
  应该存放当前mysql表里查询出的数据能封装的类型。这里就涉及一个操作,叫ORM


传入的参数,
①查询的sql语句需要传入进去并执行;
②工具类,通用,把数据库中查询出来的数据,封装成对应的java对象。所以要告诉程序,封装对象的类型是什么。
第二个参数,就是具体的类型。写法,泛型模板,这样才能保证编译成功:public static <T> List<T> queryList(String sql, Class<T> clz)
③功能扩展,mysql中如果某个表名有多个单词组成,比如 trade_make,但在java中我们一般使用驼峰命名法,首字母小写,后面单词首字母都是大写
晓峰老师说,下面的就是最标准的写法:


    public static <T> List<T> queryList(String sql, Class<T> clz, boolean underScoreToCamel) {
        Connection conn = null;         声明。初始化连接,这里作用就是提升 变量 的 作用域范围。
        PreparedStatement ps = null;      初始化数据库操作对象。
        ResultSet rs = null;         初始化结果集。在外面声明。




        try {
            // 1 注册驱动
            Class.forName("com.mysql.jdbc.Driver");  驱动。我们要想使用驱动,前提是,把驱动的程序或者依赖给加入进来。它在哪呢?如下两个截图,然后在括号里进行粘贴。
            
            // 2 创建连接
            conn = DriverManager.getConnection(
                "jdbc:mysql://hadoop202:3306/gmall0820_realtime?characterEncoding=utf-8&useSSL=false",    第一个参数是URL地址。
                "root",   第二个参数是用户名
                "123456");   第三个参数是密码
           
            // 3 创建数据库操作对象
            ps = conn.prepareStatement(sql); // 传入SQL语句


            // 4 执行SQL语句
结果集查询如下,接下来就是把查询出来的结果给java的某个对象赋值过去。所以我们要知道这个java对象的类型是什么,要把100这个值给java对象的哪个属性、zs ls给哪个属性赋值。
所以我们在处理结果集时,光有如下的值是不够的。就需要查询出元数据信息。


            // 100    zs    20
            // 200    ls     30
            rs = ps.executeQuery();   // 返回的结果就是查询结果集ResultSet 
            
            //5 处理结果集(重点就是结果集的处理上)
            // 查询结果的元数据信息
            // id    student_name  age
            ResultSetMetaData metaData = rs.getMetaData(); // 通过metaData调用方法,我们可以查询到列名、列的数量等各种描述信息
            
            // 最终我们是要返回一个集合
            List<T> resultList = new ArrayList<T>();  


// 到了这一步,这个集合里面还没有数据呢 。我们要把查询到的结果集数据给封装成一个一个的对象,然后放入到集合里面。最后再把这个集合给返回出去。
// 为了完成这个功能,就要把查询结果集里面的数据一个一个的取出来。因为查询的数据有多条,所以得用循环。java中有2大循环,for、while循环,不知道循环次数用while循环。


            //判断结果集中是否存在数据,如果有,那么进行一次循环
            while (rs.next()) {  // 这样就把数据给取出来了,取出来之后要封装成一个java对象。rs.next() 有数据就是true,没有数据就是false
                //创建一个对象,用于封装查询出来一条结果集中的数据。封装对象的前提是创建一个对象。
                我们不知道明确的对象类型,只知道是个T类型的对象。换一种方式来创建对象。
         
                T obj = clz.newInstance();  当前类对象创建,得到类的对象。目前有个问题?类的属性,我们还不知道。要想办法给对象的属性赋值。
                // 前提:要知道我们从mysql查询出来的值是哪一列的值,他的列名是什么?




                //对查询的所有列进行遍历,获取每一列的名称
                for (int i = 1; i <= metaData.getColumnCount(); i++) {   // 通过元数据获得一共有多少列。循环,从1开始。
                    String columnName = metaData.getColumnName(i); // 获取每一列的名字。光知道列名还不行,要把列名和属性名对应起来。举例,mysql中字段名是student_name,但是java中的属性名是studentName。所以我们要进行一个转化。
                    String propertyName = columnName;
                    if(underScoreToCamel){ // 如果传入的参数值是true的话。
                        //如果指定将下划线转换为驼峰命名法的值为true,通过guava工具类,将表中的列转换为类属性的驼峰命名法的形式
                        propertyName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName); // 给变量名进行赋值。
                    }


                    // 调用apache的commons-bean中工具类,给对象obj属性赋值。之前都是get、set方法来赋值,现在连对象是谁都不知道。
                    BeanUtils.setProperty(obj,propertyName,rs.getObject(i));  参数介绍: 给obj这个对象赋值;给对象的哪个属性赋值;查询结果集中对应的值,赋值给我们对象的属性(参数2)。
                }


                // 将当前结果中的一行数据封装的obj对象放到list集合中
                resultList.add(obj);
            }   
            return resultList;   // 此时结果集的处理完毕,进行返回


        } catch (Exception e) {                 这个地方的异常,我捕获大一点
            e.printStackTrace();                异常的堆栈对象给打印出来
            throw new RuntimeException("从MySQL查询数据失败");    如果发生异常了,抛出异常对象
        } finally {
            
            // 6 释放资源 这一步放到finally里面来
            if (rs != null) {    按照步骤来,先关闭结果集。如果是空的,表示没有结果集,没有赋值过。
                try {
                    rs.close();     处理下异常。
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {    数据库操作对象。
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {     连接
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }


// 使用主方法来进行测试:
    public static void main(String[] args) {
        List<TableProcess> list = queryList("select * from table_process", TableProcess.class, true); // 获取类对象的三种方式之一:.class
        for (TableProcess tableProcess : list) {
            System.out.println(tableProcess);
        }
    }
}

涉及到的知识点,ORM,对象关系映射。

查询结果截图:

- END -

本文为原创文章

❤:在这里跟我一起学习技术、职场、人生、原理、健身、摄影、生活等知识吧!

❤: 欢迎点个关注一起学习,进步充实人生。

关注公众号,回复“资料全集”,不定期最新大数据业内资讯。