一、基于JDBC项目的基本框架
如图所示:
二、基于JDBC项目的具体操作
1、连接数据库:首先,使用JDBC连接数据库。加载数据库驱动程序,建立与数据库的连接,获取连接对象。
2、插入数据:使用INSERT语句将数据插入数据库表中。创建一个包含插入语句的PreparedStatement对象,并设置参数,然后执行插入操作。
3、查询数据:使用SELECT语句从数据库中检索数据。创建一个包含查询语句的PreparedStatement对象,并设置参数,然后执行查询操作。通过ResultSet对象获取查询结果。
4、更新数据:使用UPDATE语句更新数据库中的数据。创建一个包含更新语句的PreparedStatement对象,并设置参数,然后执行更新操作。
5、删除数据:使用DELETE语句从数据库中删除数据。创建一个包含删除语句的PreparedStatement对象,并设置参数,然后执行删除操作。
6、关闭连接:在完成对数据库的操作后,记得关闭连接,释放资源。关闭Statement、PreparedStatement和ResultSet对象,最后关闭连接对象。
连接数据库如下所示:
package com.hp.study;
import java.sql.Connection;
import java.sql.DriverManager;
public class Jdbc02 {
public static void main(String[] args) throws Exception {
//1.注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf8", "root", "123456");
System.out.println(con);
}
}
三、JDBC工具类
具体例子:
(1)查询多行多列
代码如下:
public static <T> List<T> list(String sql, Class<T> c) {
//创建一个集合,存放所有的对象
List<T> tList = new ArrayList<>();
try {
//注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf8", "root", "123456");
//需要创建statement
Statement statement = con.createStatement();
//statement执行sql,返回结果集
ResultSet rs = statement.executeQuery(sql);
//结果集rs得到结果集原数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
//解析rs
while (rs.next()) { //读取结果集的光标向下移动一行,光标默认在哪一行,列明所在哪一行
//根据每一行数据封装成一个实体对象
T t = c.newInstance();
//取出某一行的每一列数据,封装到对象t的属性中
for (int i = 1; i <= columnCount; i++) {
//通过列的序号获取每一列的值
Object value = rs.getObject(i);
if (value != null) {
//通过列的序号获取每一列的列名
String columnName = md.getColumnName(i);
//因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
Field f = c.getDeclaredField(columnName);
//赋予私有属性的赋值权限
f.setAccessible(true);
//使用反射,把value给到对象t的属性中
f.set(t, value); //理解为:把value赋值给对象t的columnName属性,相对于set方法
}
}
//把对象存入集合中
tList.add(t);
}
//关闭资源
statement.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return tList;
}
(2)查询一行
代码如下:
public static <T> T selectRow(String sql, Class<T> c) {
try {
//注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf8", "root", "123456");
//需要创建statement
Statement statement = con.createStatement();
//statement执行sql,返回结果集
ResultSet rs = statement.executeQuery(sql);
//结果集rs得到结果集原数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
T t = null;
//解析rs
if (rs.next()) { //读取结果集的光标向下移动一行,光标默认在哪一行,列明所在哪一行
//根据每一行数据封装成一个实体对象
t = c.newInstance();
//取出某一行的每一列数据,封装到对象t的属性中
for (int i = 1; i <= columnCount; i++) {
//通过列的序号获取每一列的值
Object value = rs.getObject(i);
if (value != null) {
//通过列的序号获取每一列的列名
String columnName = md.getColumnName(i);
//因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
Field f = c.getDeclaredField(columnName);
//赋予私有属性的赋值权限
f.setAccessible(true);
//使用反射,把value给到对象t的属性中
f.set(t, value); //理解为:把value赋值给对象t的columnName属性,相对于set方法
}
}
}
//关闭资源
statement.close();
con.close();
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
(3)查询一列
代码如下:
public static <T> List<T> selectColumn(String sql, Class<T> c) {
//创建一个集合,存放所有对象
List<T> tList = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf8", "root", "123456");
//需要创建statement
Statement statement = con.createStatement();
//statement执行sql,返回结果集
ResultSet rs = statement.executeQuery(sql);
//结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
//解析rs
while (rs.next()) { //读取结果集的光标向下移动一行,光标默认在哪一行,列明所在哪一行
//通过列的序号,获取每一列的值
T t = (T) rs.getObject(1);
//把对象存入集合中
tList.add(t);
}
//关闭资源
statement.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return tList;
}
(4)查询单个
代码如下:
public static <T> T selectOne(String sql, Class<T> c) {
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf8", "root", "123456");
//需要创建statement
Statement statement = con.createStatement();
//statement执行sql,返回结果集
ResultSet rs = statement.executeQuery(sql);
//结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
T t = null;
//解析rs
if (rs.next()) {
t = (T) rs.getObject(1);
}
//7.关闭资源
statement.close();
con.close();
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
(5)增 删 改
代码如下:
public static int update(String sql) {
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf8", "root", "123456");
//需要创建statement
Statement statement = con.createStatement();
//statement执行sql,返回结果集
int i = statement.executeUpdate(sql);
//关闭资源
statement.close();
con.close();
return i;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
总结:
在学习JDBC时,建议结合实际案例进行练习,掌握JDBC的基本操作和异常处理。同时,了解SQL语句的编写和数据库设计原则也是非常重要的。总之,通过学习JDBC的增删改查操作,你将能够使用Java与数据库进行交互,实现数据的持久化和管理。这是开发Java应用程序的基础知识之一。