JDBC的工具类简单实现
一般实现步骤
-
实现之前,我们创建一个JDBC项目,新建目录lib以存储相关的各种包,然后将下载JDBC解压后得到的mysql-connector-java的jar文件复制到此lib目录下,并双击设置为库,这样我们的驱动包就导入完成啦。
-
下面用SQL实现对数据库的操作:
src下建JDBC包,分别新建了JDBCUtil类(包含各个基本方法)和JDBCTest类(测试工具类方法),我们先来看看代码
基本代码
- 这是工具类
package JDBC;
import java.sql.*;
public class JDBCUtil {
// MySQL 5应为com.mysql.cj.jdbc.Driver
private static final String driver = "com.mysql.cj.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
private static final String userName = "root";
private static final String password = "123456";
// 获取数据库连接
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, userName, password);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return con;
}
// 数据库查询,返回结果集
public static ResultSet query(Connection con, PreparedStatement st, ResultSet rs, String sql
, Object[] params) throws SQLException {
st = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
if (params != null) {
for (int i = 0; i < params.length; i++) {
st.setObject(i + 1, params[i]);
}
}
rs = st.executeQuery();
return rs;
}
// 数据库增删改
public static int update(Connection con,PreparedStatement st, String sql
, Object[] params) throws SQLException {
st = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
st.setObject(i + 1, params[i]);
}
return st.executeUpdate();
}
// 关闭数据库连接
public static void release(Connection con, Statement st, ResultSet rs) {
boolean flag = true;
if (rs != null) {
try {
rs.close();
rs = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if (st != null) {
try {
st.close();
st = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if (con != null) {
try {
con.close();
con = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
}
}
-
这是测试类
package JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JDBCTest { public static void main(String[] args) { Connection con; PreparedStatement st = null; ResultSet rs = null; try { // 获取链接 con = JDBCUtil.getConnection(); String sql = "SELECT * FROM book WHERE id = ? OR book = ?"; //SQL预处理,获取prepareStatement对象 st = con.prepareStatement(sql); //设置参数数组 Object[] params = {1, "白夜行"}; //在此方法中完成对 SQL的查询,并将结果放入rs结果集中 rs = JDBCUtil.query(con, st, rs, sql, params); //用next来遍历数据结果集,并输出 while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); double price = rs.getDouble(3); System.out.println(id + " " + name + " " + price); } // 关闭数据库 JDBCUtil.release(con, st, rs); } catch (SQLException e) { e.printStackTrace(); } } }
各种操作及运行结果
查找
sql语句是SELECT,表示在连接的数据库中进行查找操作,输出的是在数据表book中查找的记录
代码
public static void main(String[] args) {
Connection con;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 获取链接
con = JDBCUtil.getConnection();
//这里AND表示用两个条件约束来查找数据库demo中数据表book的记录
String sql = "SELECT * FROM book WHERE id = ? AND name = ?";
//SQL预处理,获取prepareStatement对象
st = con.prepareStatement(sql);
//设置参数数组
Object[] params = {1, "霍乱时期的爱情"};
//在此方法中完成对 SQL的查询,并将结果放入rs结果集中
rs = JDBCUtil.query(con, st, rs, sql, params);
//这里把刚刚上面的输出代码装成了一个方法traverse
traverse(rs);
// 关闭数据库
JDBCUtil.release(con, st, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
运行结果
我们还可以将代码中AND改为OR,
String sql = "SELECT * FROM book WHERE id = ? OR name = ?";
Object数组也进行相应更改,来查询两条记录
Object[] params = {1, "白夜行"};
运行结果:
当然也可以查询所有记录
String sql = "SELECT * FROM book " ;
Object[] params = {};
这样设置,就可以了
运行结果
更新(增删改)
代码
public static void main(String[] args) {
Connection con;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 获取链接
con = JDBCUtil.getConnection();
//1.删除第4本书“天堂旅行团”的记录
//此时SQL是删除语句
String sql = "DELETE FROM book WHERE id = ? AND name = ?";
//SQL预处理,获取prepareStatement对象
st = con.prepareStatement(sql);
//设置参数数组,根据要删除的记录
Object[] params = {4,"天堂旅行团"};
int i = JDBCUtil.update(con, st, sql, params);
if (i != 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
//2.插入书籍作为第5本书,操作类似
String sql1 = "INSERT INTO book VALUES(?,?,?)";
st = con.prepareStatement(sql1);
Object[] params1 = {5, "教父", 100};
int j = JDBCUtil.update(con, st, sql1, params1);
if (j != 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
//3.更改第7本书
String sql2 = "UPDATE book SET price =? WHERE id =?";
st = con.prepareStatement(sql2);
Object[] params2 = {50,7};
int k = JDBCUtil.update(con, st, sql2, params2);
if (k != 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
//4.查询最终结果
String sql0 = "SELECT * FROM book";
st = con.prepareStatement(sql0);
rs = JDBCUtil.query(con, st, rs, sql0, null);
traverse(rs);
// 关闭数据库
JDBCUtil.release(con, st, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
运行结果
在数据表中:
原本:
现在:
总结
SQL用于管理关系数据库管理系统RDBMS,这里我们用的是MySQL数据库管理系统以及其可视化软件Navicat,通过SQL命令对数据库进行操作管理;
中间报异常的时候,大多因为:
1.参数没有对应传入
2.数据表中已经增加过了某条记录,但是因为要测试又加了一遍,不会显示“增加失败”,反而是直接异常了,但是已经删除过后再删除,就可以显示“删除失败”,emmmmm……
用的是prepareStatement,举一反三,学会了它的各种更新操作
知识广度和深度都还不够啊!