今天分享又来了呀。ღ( ´・ᴗ・` ) 一起学习进步ღゝ◡╹)ノ♡****
摘要:通用型工具类,从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 -
本文为原创文章
❤:在这里跟我一起学习技术、职场、人生、原理、健身、摄影、生活等知识吧!
❤: 欢迎点个关注一起学习,进步充实人生。
关注公众号,回复“资料全集”,不定期最新大数据业内资讯。