目录
一、基于PreparedStatement实现CRUD
1.查询单行单列
package com.myblog;
import java.sql.*;
import org.junit.Test;
public class JdbcExample {
@Test
public void testQuerySingleRowAndCol() throws Exception {
//1.注册驱动(可以省略)
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码
//3.预编译SQL语句得到PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("SELECT COUNT(*) as count FROM employee");
//4.执行SQL语句,获取结果
ResultSet resultSet = preparedStatement.executeQuery();
//5.处理结果
// 如果自己明确一定只有一个结果,那么resultSet最少要做一next的判断,才能拿到我们要的列的结果
if (resultSet.next()) {
int count = resultSet.getInt("count");
System.out.println(count);
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
2.查询单行多列
package com.myblog;
import java.sql.*;
import org.junit.Test;
public class JdbcExample {
@Test
public void testQueryRowAndCol() throws Exception {
//1.注册驱动(略)
//2.获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码
//3.预编译SQL语句得到PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("SELECT id, name, salary, age FROM employee WHERE id = ?");
//4.执行SQL语句,获取结果
//有占位符要赋值
preparedStatement.setInt(1, 5);
ResultSet resultSet = preparedStatement.executeQuery();
//5.处理结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double salary = resultSet.getDouble("salary");
int age = resultSet.getInt("age");
System.out.println(id + "\t" + name + "\t" + salary + "\t" + age);
}
//6.资源释放
resultSet.close();
preparedStatement.close();
connection.close();
}
}
3.查询多行多列
package com.myblog;
import java.sql.*;
import org.junit.Test;
public class JdbcExample {
@Test
public void testQueryMoreRow() throws Exception {
// 获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码
// 预编译SQL语句得到PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("SELECT id, name, salary, age FROM employee WHERE age > ?");
// 为占位符赋值,并接受结果
preparedStatement.setInt(1, 25);
ResultSet resultSet = preparedStatement.executeQuery();
// 处理结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double salary = resultSet.getDouble("salary");
int age = resultSet.getInt("age");
System.out.println(id + "\t" + name + "\t" + salary + "\t" + age);
}
// 释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
4.新增
package com.myblog;
import java.sql.*;
import org.junit.Test;
public class JdbcExample {
@Test
public void testInsert() throws Exception {
// 获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码
// 预编译SQL语句得到PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO employee(name, salary, age) VALUES(?,?,?)");
// 为占位符赋值
preparedStatement.setString(1, "rose");
preparedStatement.setDouble(2, 345.67);
preparedStatement.setInt(3, 28);
// 执行插入操作
int result = preparedStatement.executeUpdate();
// 根据受影响行数,判断操作是否成功
if (result > 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
// 释放资源
preparedStatement.close();
connection.close();
}
}
5.修改
package com.myblog;
import java.sql.*;
import org.junit.Test;
public class JdbcExample {
@Test
public void testUpdate() throws Exception {
// 获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码
// 预编译SQL语句得到PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE employee SET salary = ? WHERE id = ?");
// 为占位符赋值
preparedStatement.setDouble(1, 8888.88);
preparedStatement.setInt(2, 6);
// 执行更新操作
int result = preparedStatement.executeUpdate();
// 根据受影响行数,判断操作是否成功
if (result > 0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败...");
}
// 释放资源
preparedStatement.close();
connection.close();
}
}
6.删除
package com.myblog;
import java.sql.*;
import org.junit.Test;
public class JdbcExample {
@Test
public void testDelete() throws Exception {
// 获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码
// 预编译SQL语句得到PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM employee WHERE id = ?");
// 为占位符赋值
preparedStatement.setInt(1, 6);
// 执行删除操作
int result = preparedStatement.executeUpdate();
// 根据受影响行数,判断操作是否成功
if (result > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败...");
}
// 释放资源
preparedStatement.close();
connection.close();
}
}
7.总结
- 注册驱动:通常通过Class.forName()注册JDBC驱动(这一步可以省略)。
- 获取连接:通过DriverManager.getConnection()获取数据库连接。
- 创建PreparedStatement对象:编写SQL语句,使用Connection.prepareStatement()创建PreparedStatement对象。
- 设置参数:通过setXXX方法为SQL语句中的占位符赋值。
- 执行操作:通过executeQuery()执行查询操作,通过executeUpdate()执行插入、更新或删除操作。
- 处理结果:查询操作需要遍历ResultSet对象,处理结果。插入、更新和删除操作通过受影响的行数判断操作是否成功。
- 释放资源:按顺序关闭ResultSet、PreparedStatement和Connection对象,确保资源不泄露。
二、常见问题
1.资源的管理
在使用JDBC的相关资源时,比如Connection、PreparedStatement、ResultSet,使用完毕后,要及时关闭这些资源以释放数据库服务器资源和避免内存泄漏是很重要的。
2.SQL语句问题
java.sql.SQLSyntaxErrorException:SQL语句错误异常,一般有几种可能:
-
SQL语句有错误,检查SQL语句!建议SQL语句在SQL工具中测试后再复制到Java程序中!
-
连接数据库的URL中,数据库名称编写错误,也会报该异常!
3.SQL语句未设置参数问题
java.sql.SQLException:No value specified for parameter 1
在使用预编译SQL语句时,如果有?占位符,要为每一个占位符赋值,否则报该错误!
4.用户名或密码错误问题
java.sql.SQLException: Access denied for user 'root123'@'localhost' (using password: YES)
连接数据库时,如果用户名或密码输入错误,也会报SQLException,容易混淆!所以一定要看清楚异常后面的原因描述
5.通信异常
在连接数据库的URL中,如果IP或端口写错了,会报如下异常:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
总结
本篇对JDBC技术的基础增删改查和常见错误进行了汇总,便于理解和运用。部分内容源自网络,如有侵权请联系作者删除,谢谢!