我们在实现JDBC写数据之前需要先工具类做一些前置准备。—封装DbUtils工具类,是一个用于操作数据库的工具类,它提供了一些便捷的方式来执行SQL语句,获取数据库连接等。简化程序的开发。DbUtils工具类主要帮我们封装,打开连接,关闭连接的对应方法。
定义DbUtils类,用于与MySQL数据库建立连接以及关闭数据库连接资源
import java.sql.*;
public class DbUtils {
/**
* 创建新的数据库连接
*
* @return 返回新的Connection对象
* @throws SQLException
* @throws ClassNotFoundException
*/
public static Connection getConnection() throws SQLException, ClassNotFoundException {
//1.加载并注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/shanghai", "root", "root");
return conn;
}
/**
* 关闭连接,释放资源
*
* @param rs 结果集对象
* @param stmt Statement对象
* @param conn Connection对象
*/
public static void closeConnection(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在JDBC中如何新增员工数据,在SQL中使用INSERT语句
创建InsertCommand公共类 并声明该类实现Command接口,意味着该类必须实现Command接口中定义的方法
public interface Command {
public void execute();//定义方法
}
//定义一个名为Command的接口,而实现该接口的类必须提供这些方法的具体实现。
package hrapp;
import common.DbUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 新增员工数据
*/
public class InsertCommand implements Command {
@Override
public void execute() {
Scanner in = new Scanner(System.in);
System.out.print("请输入员工编号");
int eno = in.nextInt();
System.out.print("请输入员工姓名");
String ename = in.next();
System.out.print("请输入员工薪资");
float salary = in.nextFloat();
System.out.print("请输入隶属部门");
String dname = in.next();
Connection conn = null;
PreparedStatement pstmt = null;
//新增数据 使用DbUtils获取数据库连接以及释放资源
try {
conn = DbUtils.getConnection();//会抛出俩个异常,用try-catch捕获
String sql = "insert into employee(eno,ename,salary,dname)values(?,?,?,?) ";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, eno);//1代表第一个参数
pstmt.setString(2, ename);
pstmt.setFloat(3, salary);
pstmt.setString(4, dname);
int cnt = pstmt.executeUpdate();//所有写操作都使用executeUpdate
System.out.println("cnt:" + cnt);
System.out.println(ename + "员工入职手续已办理");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
DbUtils.closeConnection(null, pstmt, conn);
}
}
}
重点理解这些有关新增数据的代码操作
Connection conn = null;
....
conn = DbUtils.getConnection();
使用之前定义过的DbUtils来获取数据库连接和释放资源,得到的是一个Connection对象,他会抛出俩个异常,故用try—catch进行捕获,同时将Connection对象在try块外面进行声明。
String sql = "insert into employee(eno,ename,salary,dname)values(?,?,?,?) ";
作用为SQL插入语句
PreparedStatement pstmt = null;
......pstmt = conn.prepareStatement(sql);
通过调用conn.prepareStatement(sql)方法创建一个预编译的SQL语句对象pstmt。预编译的语句可以提高性能并防止SQL注入攻击
pstmt.setInt(1, eno);//1代表第一个参数
pstmt.setString(2, ename);
pstmt.setFloat(3, salary);
pstmt.setString(4, dname);
设置SQL语句中的参数,第一个参数是参数的位置索引,从1开始。通过这些方法,可以将Java变量的值绑定到SQL语句中的参数,确保SQL语句的动态性和安全性。
int cnt = pstmt.executeUpdate();
执行SQL语句,这里用于插入一条员工记录。executeUpdate()方法返回一个整数,表示受SQL语句影响的行数。如果插入成功,通常返回值为1。
System.out.println("cnt:" + cnt);
输出受影响的行数,用于确认插入操作是否成功执行
System.out.println(ename + "员工入职手续已办理");
输出一条提示信息,表明员工的入职手续已办理完成,使用了参数ename来显示员工的名字
DbUtils.closeConnection(null, pstmt, conn);
以上是有关员工的新增记录操作代码,然后我们打开入口类 HumanResourceApplication
,在入口类增加 办理员工入职的对应菜单
import java.util.Scanner;
public class HumanResourceApplication {
public static void main(String[] args) {
System.out.println("1-查询部门员工");
System.out.println("2-办理员工入职");
System.out.println("请选择功能:");
Scanner in = new Scanner(System.in);
Integer cmd = in.nextInt();
Command command = null;
switch (cmd) {
case 1: //查询部门员工
command = new PstmtQueryCommand();
command.execute();
break;
case 2: //办理员工入职
command = new InsertCommand();
command.execute();
break;
}
}
}
此时,代码创建完成,运行测试看新增员工数据操作能否实现
逐步输入要添加的员工数据
查看数据库,此条新增的员工数据被成功添加。