**
一、相关概念
**
1.什么是JDBC
JDBC(数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2.数据库驱动
我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
3、创建驱动
MySql驱动:Class.forName(“com.mysql.jdbc.Driver”);
4、JAVA使用JDBC访问数据库的步骤:
-
得到数据库驱动程序
-
创建数据库连接
-
执行SQL语句
-
得到结果集
-
对结果集做相应的处理(增,删,改,查)
-
关闭资源:这里释放的是DB中的资源
5、常用方法:
- createStatement():创建向数据库发送sql的statement对象。
- Statement(sql) :创建向数据库发送预编译sql的Satement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
操作代码如下:
private static void f1() throws Exception {
//1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");
System.out.println(conn);
//3、定义sql
String sql="insert into t_dept values(null,'乌克兰分部','基辅','陈总')";
//4、需要创建statement
var st = conn.createStatement();
//5、statement 执行sql,返回 插入了几行
var i = st.executeUpdate(sql);
System.out.println("向数据库t_dept表中插入了"+i+"行数据");
//6、关闭资源
st.close();
conn.close();
}
封装使其代码在后面运用的时候更简单
查询封装(反射机制)
package com.hp.utils;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//jdbc工具类
public class JdbcUtil {
//查询多行多列
public static <T> List<T> list(String sql,Class<T> c){
//创建一个集合,存放所有的对象
List<T> tList=new ArrayList<>();
try {
//1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");
//3、定义sql
//4、需要创建statement
var st = conn.createStatement();
//5、statement 执行sql,返回 结果集
var rs = st.executeQuery(sql);
//结果集rs得到结果集元数据
ResultSetMetaData md=rs.getMetaData();
//获取结果集总列数
var columnCount = md.getColumnCount();
//6、解析rs
while (rs.next()) {
//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行
//根据每一行数据,封装成一个实体对象
T t = c.newInstance();
// 1、取出某一行的每个数据,封装到对象t的属性中
for (int i = 1; i <= columnCount; i++) {
//通过列的序号,获取每一列的值
var value = rs.getObject(i);
if (value!=null){
//通过列的序号,获取每一列的列名
var columnName = md.getColumnName(i);
//因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
var f = c.getDeclaredField(columnName);
//赋予私有属性的赋值权限
f.setAccessible(true);
//使用反射,把value给到对象t的属性中
f.set(t,value);//理解为:把value赋值给对象t的ColumName,相当于set方法
}
}
//把对象存入集合中
tList.add(t);
}
//7、关闭资源
st.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return tList;
}
}
还有一种封装方法,不需要用到反射
关闭资源
二次封装: