JDBC连接数据库实现增删改查,我连接成功了但是没有运行成功,我想要一份关于这个连接后的代码
java
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
// 查询数据
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
// 新增数据
PreparedStatement pstmt = conn.prepareStatement("insert into user(name, age) values (?, ?)");
pstmt.setString(1, "张三");
pstmt.setInt(2, 30);
pstmt.executeUpdate();
// 修改数据
pstmt = conn.prepareStatement("update user set age=? where name=?");
pstmt.setInt(1, 35);
pstmt.setString(2, "张三");
pstmt.executeUpdate();
// 删除数据
pstmt = conn.prepareStatement("delete from user where name=?");
pstmt.setString(1, "张三");
pstmt.executeUpdate();
// 关闭连接
conn.close();
1、项目中引入druid的jar包
首先把阿里巴巴提供的数据库连接池druid(此druid为数据库连接池,而不是数据存储里的druid),复制到lib目录,并添加到项目库中。
driverName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/实验数据库?serverTimezone=UTC&charactorEncoding=utf8
user=root
password=123456
MaxActive=10
MinIdle=10
InitialSize=10
public class JDBCDemo {
static DruidDataSource pool;
static {
try {
pool = new DruidDataSource();
pool.setDriverClassName(getProperties().getProperty("driverName"));
pool.setUrl(getProperties().getProperty("url"));
pool.setUsername(getProperties().getProperty("user"));
pool.setPassword(getProperties().getProperty("password"));
pool.setMaxActive(Integer.valueOf(getProperties().getProperty("MaxActive")));//最大允许的连接数量
pool.setMinIdle(Integer.valueOf(getProperties().getProperty("MinIdle")));//最小的空闲连接数量
pool.setInitialSize(Integer.valueOf(getProperties().getProperty("InitialSize")));//创建池时初始创建的连接数量
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
for (int i = 0; i <100 ; i++) {
new Thread(){
@Override
public void run() {
Connection connection=getConnection();
System.out.println(connection);
try {
connection.close(); //归还连接对象给连接池。(因为此时是连接池)
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}.start();
}
}
private static Properties getProperties(){
Properties properties = new Properties();
try {
properties.load(new FileReader("E:\\IDEA .3代码文件\\src\\db.properties"));
return properties;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static Connection getConnection() {
try {
return pool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
此时,不光使用了db.properties来存储那些重要的连接属性了,同时还使用了数据库连接池,来替代了之前单独通过DriverManager
类来获取Connection
连接对象的实现方法(这种方式获取Connection连接对象是单例的,也就是无论从DriverManager
类获取多少次Connection连接对象,返回的都是同一对象),而是使用数据库连接池来直接创建一些Connection
连接对象,在使用完时,使用close()
方法,来使Connection
连接对象返回数据库连接池中反复利用,避免了反复创建与销毁Connection
连接对象,降低了所消耗的时间与资源。
我可以提供一份连接数据库后实现增删改查的代码。代码如下:
package com.example.jdbc;
import java.sql.*;
public class JdbcDemo {
// JDBC 驱动和数据库 URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/实验数据库?serverTimezone=UTC&charactorEncoding=utf8";
// 数据库的用户名与密码
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动器
Class.forName(JDBC_DRIVER);
// 打开连接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 执行查询
System.out.println("实例化statement对象...");
stmt = conn.createStatement();
String sql = "SELECT * FROM 用户表";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while (rs.next()) {
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
String address = rs.getString("address");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 姓名: " + name);
System.out.print(", 性别: " + gender);
System.out.print(", 地址: " + address);
System.out.print("\n");
}
// 插入操作
System.out.println("\n插入一条数据...");
String sql_insert = "INSERT INTO 用户表 (id, name, gender, address) VALUES (4, 'Mark', '男', '上海')";
int result_insert = stmt.executeUpdate(sql_insert);
if (result_insert > 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
// 更新操作
System.out.println("\n更新一条数据...");
String sql_update = "UPDATE 用户表 SET name='Lucy' WHERE id=4";
int result_update = stmt.executeUpdate(sql_update);
if (result_update > 0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
// 删除操作
System.out.println("\n删除一条数据...");
String sql_delete = "DELETE FROM 用户表 WHERE id=4";
int result_delete = stmt.executeUpdate(sql_delete);
if (result_delete > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
} catch (SQLException | ClassNotFoundException se) {
// 处理 JDBC 错误
se.printStackTrace();
} finally {
// 关闭资源
try {
if (stmt != null) stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
另外,我也注意到你提到了使用数据库连接池来连接数据库。这种方式比单独通过DriverManager
来获取连接对象更加高效、安全和可靠。以下是使用Druid
数据库连接池来连接数据库的示例代码:
package com.example.jdbc;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcDemoWithPool {
private static DruidDataSource dataSource;
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 初始化数据源
dataSource = new DruidDataSource();
dataSource.setUrl(getProperties().getProperty("url"));
dataSource.setUsername(getProperties().getProperty("user"));
dataSource.setPassword(getProperties().getProperty("password"));
dataSource.setInitialSize(Integer.parseInt(getProperties().getProperty("InitialSize")));
dataSource.setMinIdle(Integer.parseInt(getProperties().getProperty("MinIdle")));
dataSource.setMaxActive(Integer.parseInt(getProperties().getProperty("MaxActive")));
// 打开连接
System.out.println("连接数据库...");
conn = dataSource.getConnection();
// 执行查询
System.out.println("实例化statement对象...");
stmt = conn.createStatement();
String sql = "SELECT * FROM 用户表";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while (rs.next()) {
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
String address = rs.getString("address");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 姓名: " + name);
System.out.print(", 性别: " + gender);
System.out.print(", 地址: " + address);
System.out.print("\n");
}
// 插入操作
System.out.println("\n插入一条数据...");
String sql_insert = "INSERT INTO 用户表 (id, name, gender, address) VALUES (4, 'Mark', '男', '上海')";
int result_insert = stmt.executeUpdate(sql_insert);
if (result_insert > 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
// 更新操作
System.out.println("\n更新一条数据...");
String sql_update = "UPDATE 用户表 SET name='Lucy' WHERE id=4";
int result_update = stmt.executeUpdate(sql_update);
if (result_update > 0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
// 删除操作
System.out.println("\n删除一条数据...");
String sql_delete = "DELETE FROM 用户表 WHERE id=4";
int result_delete = stmt.executeUpdate(sql_delete);
if (result_delete > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} finally {
// 关闭资源
try {
if (stmt != null) stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
private static Properties getProperties() {
Properties properties = new Properties();
try {
properties.load(JdbcDemoWithPool.class.getResourceAsStream("/db.properties"));
return properties;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
除了少量的语法上的差异,这份代码和前面那份代码非常相似。主要不同之处在于连接数据库的方式。这里使用了Druid
数据库连接池来管理数据库连接,并通过读取配置文件来获取数据库连接的相关信息。它支持连接数池、预编译语句池、防火墙、负载均衡、监控等功能,可以大幅提高数据库操作的执行效率和灵活性。
这里是一个使用JDBC连接MySQL数据库的示例:
java
// 1. 加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 2. 连接数据库
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
// 3. 创建语句对象
String sql = "SELECT * FROM user";
Statement stmt = conn.createStatement();
// 4. 执行查询语句
ResultSet rs = stmt.executeQuery(sql);
// 5. 处理结果
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
System.out.println(id + ", " + name + ", " + password);
}
// 6. 关闭连接
rs.close();
stmt.close();
conn.close();
这个示例连接到test数据库,执行查询user表的SQL,并输出结果。
关于增删改的示例:
java
// INSERT
String sql = "INSERT INTO user(name, password) VALUES('Tom', '1234')";
stmt.executeUpdate(sql);
// UPDATE
String sql = "UPDATE user SET name='John' WHERE id=1";
stmt.executeUpdate(sql);
// DELETE
String sql = "DELETE FROM user WHERE id=2";
stmt.executeUpdate(sql);
使用`executeUpdate()`方法执行INSERT、UPDATE和DELETE语句。
希望这个示例能帮助你连接MySQL并实现基本的CRUD操作。如有任何其他问题,欢迎在评论区提出。