10.1 什么是JDBC
JDBC的全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句完成对数据库中数据的新增、删除、修改和查询等操作。
JDBC要求各个数据库厂商按照统一的规范提供数据库驱动,在程序中由JDBC和具体的数据库驱动联系,因此用户就不必直接与底层的数据库交互,使得代码的通用性更强。
应用程序使用JDBC访问数据库的方式如下图:
10.2 JDBC常用API
JDBC API主要位于java.sql包中,该包定义了一系列访问数据库的接口和类。
(1)Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指MySQL驱动JAR包)。
(2)DriverManager接口
DriverManager接口用于加载JDBC驱动、创建与数据库的连接。
在DriverManager接口中,定义了两个比较重要的静态方法,如下:
方法名称 | 功能描述 |
static void registerDriver(Driver driver) | 用于向DriverManager注册给定的JDBC驱动程序 |
static Connection getConnection (String url,String user,String pwd) | 用于建立和数据库的连接,并返回表示连接的Connection对象 |
(3)Connection接口
Connection接口用于处理与特定数据库的连接,Connection对象是表示数据库连接的对象,只有获得该连接对象,才能访问并操作数据库。
Connection接口的常用方法如下表:
方法名称 | 功能描述 |
Statement createStatement() | 用于创建一个Statement对象将SQL语句发送到数据库 |
PreparedStatement prepareStatement(String sql) | 用于创建一个PreparedStatement对象将参数化的SQL语句发送到数据库 |
CallableStatement prepareCall(String sql) | 用于创建一个CallableStatement对象来调用数据库存储过程 |
(4)Statement接口
Statement接口用于执行静态的SQL语句,并返回一个结果对象。
Statement接口对象可以通过Connection实例的createStatement()方法获得,该对象会把静态的SQL语句发送到数据库中编译执行,然后返回数据库的处理结果。
Statement接口提供了3个常用的执行SQL语句的方法:
方法名称 | 功能描述 |
boolean execute(String sql) | 用于执行各种SQL语句。该方法返回一个boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可以通过Statement的getResultSet()方法获得查询结果。 |
int executeUpdate(String sql) | 用于执行SQL中的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录条数。 |
ResultSet executeQuery(String sql) | 用于执行SQL中的select语句。该方法返回一个表示查询结果的ResultSet对象。 |
(5)PreparedStatement 接口
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。PreparedStatement接口扩展了带有参数SQL语句的执行操作,该接口中的SQL语句可以使用占位符“?”代替参数,然后通过setter()方法为SQL语句的参数赋值。
(Statement接口封装了JDBC执行SQL语句的方法,可以完成Java程序执行SQL语句的操作。然而在使用Statement接口操作这些SQL语句会过于繁琐,并且存在安全方面的问题。)
PreparedStatement接口提供了一些常用方法,如下表:
方法名称 | 功能描述 |
int executeUpdate() | 在PreparedStatement对象中执行 SQL 语句,SQL语句必须是一个DML语句或者是无返回内容的SQL 语句,如 DDL 语句。 |
ResultSet executeQuery() | 在PreparedStatement对象中执行 SQL 查询,该方法返回的是ResultSet对象。 |
void setInt(int parameterIndex, int x) | 将指定参数设置成给定的int值。 |
void setString(int parameterIndex,String x) | 将指定参数设置成给定的String值。 |
(6)ResultSet接口
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。
在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法可以将游标移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next()方法作为 while循环 的条件来迭代ResultSet结果集。
ResultSet接口的常用方法如下表:
方法名称 | 功能描述 |
String getString(int columnIndex) | 用于获取指定字段的String类型的值,参数columnIndex代表字段的索引。 |
String getString (String columnName) | 用于获取指定字段的String类型的值,参数columnName代表字段的名称。 |
int getInt(int columnIndex) | 用于获取指定字段的int类型的值,参数columnIndex代表字段的索引。 |
int getInt(String columnName) | 用于获取指定字段的int类型的值,参数columnName代表字段的名称。 |
boolean next() | 将游标从当前位置向下移一行。 |
/从上个表格中可以看出,ResultSet接口中定义了一些getter方法,而采用哪种getter方法获取数据取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。例如,数据表的第一列字段名为id,字段类型为int,那么既可以使用getInt(1)获取该列的值,也可以使用getInt(“id”)获取该列的值。
10.3 实现第一个JDBC程序
释放资源
由于数据库资源非常宝贵,数据库允许的并发访问连接数量有限,因此,当数据库资源使用完毕后,一定要记得释放资源。为了保证资源的释放,在Java程序中,应该将释放资源的操作放在 finally代码块 中。
获取数据库连接
在新版本中获取数据库连接时需要设置时区为北京时间(serverTimezone=GMT%2B8),因为安装数据库时默认为美国时间。如果不设置时区为北京时间,系统会报MySQL设置时区与当前电脑系统时区不符的错误,如下图:
此外,MySQL高版本需要指明是否进行SSL连接,否则会出现警告信息。警告信息具体如下所示: Fri Mar 20 18:55:47 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
遇到这种情况,只需要在mysql连接字符串url中加入useSSL=true或者false即可,具体示例如下所示。 url=jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=true
导包导包!
!!!!!导包!!!!!!!!!!!!!!!!!!!!
1...在IDEA中新建一个Java项目,使用鼠标右键单击项目名称,选择【New】→【Directory】,在弹出窗口中将该文件夹命名为lib,项目根目录中就会出现一个名称为lib的文件夹。
2...将下载好的MySQL数据库驱动文件mysql-connector-java-8.0.1.jar (我使用了:mysql-connector-java-8.0.16.jar)复制到项目的lib目录中,并把jar包添加到项目里。使用鼠标单击File菜单栏,选择【Project Structure】→【Modules】→【Dependencies】,单击最右侧加号后选择第一项:JARs or directories…,在弹出框中选择下载好的Jar包确认
3...最后可以看到mysql-connector-java-8.0.16.jar包添加到IDEA的依赖项中,添加成功界面如图:
4...mysql-connector-java-8.0.16.jar包添加到依赖项之后,加入数据库驱动后的项目结构如下图:
连接数据库时会用到的快捷方式:
!!!!!添加jar包快捷方式:选中lib目录下的jar包右击鼠标,选择 add as Library
加载驱动Class.forName("com.mysql.cj.jdbc.Driver") 快捷方式:打开jar包,打开com.mysql,打开jdbc,右击Driver选择Copy Reference
项目演示:
JDBC----专升本报名信息系统
1.需求分析
实现一个统计专升本报名学生的信息管理系统。
1.新增报名(姓名,系,专业,报名时间,押金)
2.删除报名
3.修改报名信息
4.查询报名2.系统设计
2.1 数据库设计
数据库设计:
数据库名:enrolldb
表名:student表
字段(id,姓名,系,专业,报名时间,押金,联系方式)
#数据库脚本
#建库
CREATE DATABASE enrolldb ;
use enrolldb ;
#创建学生表
CREATE TABLE student(
id int PRIMARY KEY auto_increment,
stuname VARCHAR(20) not null ,
department VARCHAR(20),
major VARCHAR(20),
registration VARCHAR(50),
deposit int ,
phone VARCHAR(11)
);
#新增语句
#INSERT INTO student VALUES(NULL,?,?,?,?,?,?);
#删除语句
#DELETE FROM student WHERE id=1 ;
第一版: (使用JDBC)
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
/*
报名系统主类
*/
public class EnrollMain {
static Scanner sc = new Scanner(System.in) ;
public static void main(String[] args) {
while (true) {
//1.系统界面设计
System.out.println("************************************");
System.out.println("*********** 专升本报名系统 **********");
System.out.println("************* 1.新增报名 **********");
System.out.println("************* 2.修改报名 **********");
System.out.println("************* 3.删除报名 **********");
System.out.println("************* 4.查询报名 **********");
System.out.println("************* 0.退出系统 **********");
System.out.println("************************************");
System.out.println("请选择序号功能:");
//2.根据用户的选择执行相应的功能
int choice = sc.nextInt();
switch (choice) {
case 1:
addEnroll();
break;
case 2:
modifyEnroll();
break;
case 3:
dropEnroll();
break;
case 4:
queryEnroll();
break;
case 0:
System.out.println("系统退出!");
System.exit(0);
break;
default:
System.out.println("对不起,您的选择有误!");
break;
}
}
}
//新增报名
private static void addEnroll() {
//1.获取报名学生信息
System.out.println("请输入报名学生的姓名");
String stuname = sc.next();
System.out.println("请输入报名学生的所在系");
String department = sc.next();
System.out.println("请输入报名学生的所学专业");
String major = sc.next();
System.out.println("请输入押金");
int deposit = sc.nextInt();
System.out.println("请输入报名学生的联系方式");
String phone = sc.next();
//registration报名时间
LocalDateTime now = LocalDateTime.now();
//指定格式
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
String registration = now.format(ofPattern);
//2.连接数据库,保存信息
PreparedStatement pstmt = null ;
Connection conn = null ;
try {
//2.1加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.2获取连接
String url = "jdbc:mysql://localhost:3306/enrolldb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String user = "用户名"; //大部分初始为root
String password = "密码"; //大部分为初始为root
conn = DriverManager.getConnection(url, user, password);
//2.3获取预编译的语句对象
String sql = "INSERT INTO student VALUES(NULL,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
//2.4执行SQL
pstmt.setString(1,stuname);
pstmt.setString(2,department);
pstmt.setString(3,major);
pstmt.setString(4,registration);
pstmt.setInt(5,deposit);
pstmt.setString(6,phone);
int row = pstmt.executeUpdate();
if (row != 0 ){
System.out.println("数据添加成功!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
if (pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//修改报名
private static void modifyEnroll() {
System.out.println("请输入要修改的学生姓名:");
String stuname = sc.next(); //张三
//1.判断学生是否存在 -- 本质就是执行查询
//连接数据库,查询所有记录
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//2.1 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.2 获取连接
String url = "jdbc:mysql://localhost:3306/enrolldb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
//2.3 获取预编译的执行语句对象
String sql = "SELECT * FROM student WHERE stuname = ?";
pstmt = conn.prepareStatement(sql);
//2.4 执行查询的SQL
pstmt.setString(1,stuname);
rs = pstmt.executeQuery();
//2.5 遍历结果集
if (rs.next()){
//存在
System.out.println("**********************************");
System.out.println("**1.所在系 2.专业 3.押金 4.联系方式**");
System.out.println("**********************************");
System.out.println("请选择要修改的信息:");
int choice = sc.nextInt();
String uptsql = "";
if (choice == 1){
System.out.println("请输入报名学生所在系:");
String department = sc.next();
uptsql = "update student set department = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setString(1,department);
}else if (choice == 2){
System.out.println("请输入报名学生所在专业:");
String major = sc.next();
uptsql = "update student set major = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setString(1,major);
}else if (choice == 3){
System.out.println("请输入押金:");
int deposit = sc.nextInt();
uptsql = "update student set deposit = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setInt(1,deposit);
}else if (choice == 4){
System.out.println("请输入报名学生的联系方式:");
String phone = sc.next();
uptsql = "update student set phone = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setString(1,phone);
}else {
System.out.println("选择有误!");
}
pstmt.setString(2,stuname);
pstmt.executeUpdate();
System.out.println("报名信息修改成功!");
}else {
//不存在
System.out.println("对不起,您要修改的学生不存在!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放数据库资源
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//删除报名
private static void dropEnroll() {
System.out.println("请输入要删除的学生姓名:");
String stuname = sc.next();
//连接数据库,执行删除的SQL
Connection conn = null;
PreparedStatement pstmt = null;
try {
//2.1 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.2 获取连接
String url = "jdbc:mysql://localhost:3306/enrolldb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
//2.3 获取预编译的执行语句对象
String sql = "DELETE FROM student WHERE stuname = ?";
pstmt = conn.prepareStatement(sql);
//2.4 执行SQL
pstmt.setString(1,stuname);
int row = pstmt.executeUpdate();
if (row != 0){
System.out.println("报名信息删除成功!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放数据库资源
if (pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
// 查询报名
private static void queryEnroll() {
//连接数据库,查询所有记录
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//2.1 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.2 获取连接
String url = "jdbc:mysql://localhost:3306/enrolldb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
//2.3 获取预编译的执行语句对象
String sql = "SELECT * FROM student";
pstmt = conn.prepareStatement(sql);
//2.4 执行查询的SQL
rs = pstmt.executeQuery();
//2.5 遍历结果集
System.out.println("编号\t姓名\t所在系\t专业\t\t报名时间\t\t\t押金\t\t联系方式");
while (rs.next()){
int id = rs.getInt(1);
String stuname = rs.getString(2);
String department = rs.getString(3);
String major = rs.getString(4);
String registration = rs.getString(5);
int deposit = rs.getInt(6);
String phone = rs.getString(7);
System.out.println(id + "\t" + stuname + "\t" + department + "\t" +
major + "\t" + registration + "\t" + deposit + "\t" + phone );
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放数据库资源
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
第二版(优化后:)(使用JDBC)
import java.sql.*;
/*
连接数据库的工具类
*/
public class DBUtil {
//1.获取数据库连接
public static Connection getConn(){
Connection conn = null;
//2.1 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//2.2 获取连接
String url = "jdbc:mysql://localhost:3306/enrolldb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String user = "用户名"; //大部分初始为root
String password = "密码"; //大部分为初始为root
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//2.释放资源
public static void closeAll(Connection conn, Statement stmt, ResultSet rs){
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
package com.foxbill.prj;
import com.foxbill.util.DBUtil;
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
public class EnrollMain2 {
static Scanner sc = new Scanner(System.in) ;
public static void main(String[] args) {
while (true) {
//1.系统界面设计
System.out.println("************************************");
System.out.println("*********** 专升本报名系统 **********");
System.out.println("************* 1.新增报名 **********");
System.out.println("************* 2.修改报名 **********");
System.out.println("************* 3.删除报名 **********");
System.out.println("************* 4.查询报名 **********");
System.out.println("************* 0.退出系统 **********");
System.out.println("************************************");
System.out.println("请选择序号功能:");
//2.根据用户的选择执行相应的功能
int choice = sc.nextInt();
switch (choice) {
case 1:
addEnroll();
break;
case 2:
modifyEnroll();
break;
case 3:
dropEnroll();
break;
case 4:
queryEnroll();
break;
case 0:
System.out.println("系统退出!");
System.exit(0);
break;
default:
System.out.println("对不起,您的选择有误!");
break;
}
}
}
//新增报名
private static void addEnroll() {
//1.获取报名学生信息
System.out.println("请输入报名学生的姓名");
String stuname = sc.next();
System.out.println("请输入报名学生的所在系");
String department = sc.next();
System.out.println("请输入报名学生的所学专业");
String major = sc.next();
System.out.println("请输入押金");
int deposit = sc.nextInt();
System.out.println("请输入报名学生的联系方式");
String phone = sc.next();
//registration报名时间
LocalDateTime now = LocalDateTime.now();
//指定格式
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
String registration = now.format(ofPattern);
//2.连接数据库,保存信息
PreparedStatement pstmt = null ;
Connection conn = null ;
try {
conn = DBUtil.getConn();
//2.3获取预编译的语句对象
String sql = "INSERT INTO student VALUES(NULL,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
//2.4执行SQL
pstmt.setString(1,stuname);
pstmt.setString(2,department);
pstmt.setString(3,major);
pstmt.setString(4,registration);
pstmt.setInt(5,deposit);
pstmt.setString(6,phone);
int row = pstmt.executeUpdate();
if (row != 0 ){
System.out.println("数据添加成功!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DBUtil.closeAll(conn,pstmt,null);
}
}
//修改报名
private static void modifyEnroll() {
System.out.println("请输入要修改的学生姓名:");
String stuname = sc.next(); //张三
//1.判断学生是否存在 -- 本质就是执行查询
//连接数据库,查询所有记录
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
DBUtil.getConn();
//2.3 获取预编译的执行语句对象
String sql = "SELECT * FROM student WHERE stuname = ?";
pstmt = conn.prepareStatement(sql);
//2.4 执行查询的SQL
pstmt.setString(1,stuname);
rs = pstmt.executeQuery();
//2.5 遍历结果集
if (rs.next()){
//存在
System.out.println("**********************************");
System.out.println("**1.所在系 2.专业 3.押金 4.联系方式**");
System.out.println("**********************************");
System.out.println("请选择要修改的信息:");
int choice = sc.nextInt();
String uptsql = "";
if (choice == 1){
System.out.println("请输入报名学生所在系:");
String department = sc.next();
uptsql = "update student set department = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setString(1,department);
}else if (choice == 2){
System.out.println("请输入报名学生所在专业:");
String major = sc.next();
uptsql = "update student set major = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setString(1,major);
}else if (choice == 3){
System.out.println("请输入押金:");
int deposit = sc.nextInt();
uptsql = "update student set deposit = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setInt(1,deposit);
}else if (choice == 4){
System.out.println("请输入报名学生的联系方式:");
String phone = sc.next();
uptsql = "update student set phone = ? where stuname = ?";
pstmt = conn.prepareStatement(uptsql);
pstmt.setString(1,phone);
}else {
System.out.println("选择有误!");
}
pstmt.setString(2,stuname);
pstmt.executeUpdate();
System.out.println("报名信息修改成功!");
}else {
//不存在
System.out.println("对不起,您要修改的学生不存在!");
}
}catch (SQLException e) {
e.printStackTrace();
} finally {
//释放数据库资源
DBUtil.closeAll(conn,pstmt,rs);
}
}
//删除报名
private static void dropEnroll() {
System.out.println("请输入要删除的学生姓名:");
String stuname = sc.next();
//连接数据库,执行删除的SQL
Connection conn = null;
PreparedStatement pstmt = null;
try {
DBUtil.getConn();
//2.3 获取预编译的执行语句对象
String sql = "DELETE FROM student WHERE stuname = ?";
pstmt = conn.prepareStatement(sql);
//2.4 执行SQL
pstmt.setString(1,stuname);
int row = pstmt.executeUpdate();
if (row != 0){
System.out.println("报名信息删除成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放数据库资源
DBUtil.closeAll(conn,pstmt,null);
}
}
// 查询报名
private static void queryEnroll() {
//连接数据库,查询所有记录
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
DBUtil.getConn();
//2.3 获取预编译的执行语句对象
String sql = "SELECT * FROM student";
pstmt = conn.prepareStatement(sql);
//2.4 执行查询的SQL
rs = pstmt.executeQuery();
//2.5 遍历结果集
System.out.println("编号\t姓名\t所在系\t专业\t\t报名时间\t\t\t押金\t\t联系方式");
while (rs.next()){
int id = rs.getInt(1);
String stuname = rs.getString(2);
String department = rs.getString(3);
String major = rs.getString(4);
String registration = rs.getString(5);
int deposit = rs.getInt(6);
String phone = rs.getString(7);
System.out.println(id + "\t" + stuname + "\t" + department + "\t" +
major + "\t" + registration + "\t" + deposit + "\t" + phone );
}
}catch (SQLException e) {
e.printStackTrace();
} finally {
//释放数据库资源
DBUtil.closeAll(conn,pstmt,rs);
}
}
}
第三版(优化后:)(使用 Apache )
1.官网下载jar包
2.将其放在lib目录下并添加(详细步骤参考上述JDBC导包步骤
注意:
结果集处理器: ResultSetHandler 1. BeanHandler:把查询结果,封装为单个JavaBean 一般用于查单条记录 ,例如:"SELECT * FROM student where stuname = '张三' "; 2.BeanListHandler:把查询结果,封装为JavaBean的集合 一般用于查多条记录 ,例如:"SELECT * FROM student"; 使用ahaphe调用sql语句需先声明 QueryRunner qr = new QueryRunner() 语句QueryRunner qr = new QueryRunner(); String sql = "INSERT INTO student VALUES(NULL,?,?,?,?,?,?)"; qr.update(DBUtil.getConn(),sql,stuname,department,major,registration,deposit,phone);
- “增删改”问题使用update方法 -------“查询”问题使用query方法
//查询 String sql = "SELECT * FROM student WHERE stuname = ?"; QueryRunner qr = new QueryRunner(); Student student = qr.query(DBUtil.getConn(), sql, new BeanHandler<>(Student.class),stuname); //删除 String sql = "DELETE FROM student WHERE stuname = ?" ; QueryRunner qr = new QueryRunner(); qr.update(DBUtil.getConn(),sql,stuname);
import com.foxbill.entity.Student;
import com.foxbill.util.DBUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Scanner;
public class EnrollMain_Apache {
static Scanner sc = new Scanner(System.in) ;
static QueryRunner qr = new QueryRunner();
public static void main(String[] args) {
while (true) {
//1.系统界面设计
System.out.println("************************************");
System.out.println("*********** 专升本报名系统 **********");
System.out.println("************* 1.新增报名 **********");
System.out.println("************* 2.修改报名 **********");
System.out.println("************* 3.删除报名 **********");
System.out.println("************* 4.查询报名 **********");
System.out.println("************* 0.退出系统 **********");
System.out.println("************************************");
System.out.println("请选择序号功能:");
//2.根据用户的选择执行相应的功能
int choice = sc.nextInt();
switch (choice) {
case 1:
addEnroll();
break;
case 2:
modifyEnroll();
break;
case 3:
dropEnroll();
break;
case 4:
queryEnroll();
break;
case 0:
System.out.println("系统退出!");
System.exit(0);
break;
default:
System.out.println("对不起,您的选择有误!");
break;
}
}
}
//新增报名
private static void addEnroll() {
//1.获取报名学生信息
System.out.println("请输入报名学生的姓名");
String stuname = sc.next();
System.out.println("请输入报名学生的所在系");
String department = sc.next();
System.out.println("请输入报名学生的所学专业");
String major = sc.next();
System.out.println("请输入押金");
int deposit = sc.nextInt();
System.out.println("请输入报名学生的联系方式");
String phone = sc.next();
//registration报名时间
LocalDateTime now = LocalDateTime.now();
//指定格式
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
String registration = now.format(ofPattern);
//2.连接数据库,保存信息
String sql = "INSERT INTO student VALUES(NULL,?,?,?,?,?,?)";
try {
qr.update(DBUtil.getConn(),sql,stuname,department,major,registration,deposit,phone);
System.out.println("数据添加成功!");
} catch (SQLException e) {
e.printStackTrace();
}
}
//修改报名
private static void modifyEnroll() {
System.out.println("请输入要修改的学生姓名:");
String stuname = sc.next(); //张三
//1.判断学生是否存在 -- 本质就是执行查询
//连接数据库,查询所有记录
String sql = "SELECT * FROM student WHERE stuname = ?";
try {
Student student = qr.query(DBUtil.getConn(), sql, new BeanHandler<>(Student.class),stuname);
if (student == null){
//不存在
System.out.println("对不起,您要修改的学生不在!");
}else {
//存在
System.out.println("**********************************");
System.out.println("**1.所在系 2.专业 3.押金 4.联系方式**");
System.out.println("**********************************");
System.out.println("请选择要修改的信息:");
int choice = sc.nextInt();
String uptsql = "";
if (choice == 1){
System.out.println("请输入报名学生所在系:");
String department = sc.next();
uptsql = "update student set department = ? where stuname = ?";
qr.update(DBUtil.getConn(),uptsql,department,stuname);
}else if (choice == 2){
System.out.println("请输入报名学生所在专业:");
String major = sc.next();
uptsql = "update student set major = ? where stuname = ?";
qr.update(DBUtil.getConn(),uptsql,major,stuname);
}else if (choice == 3){
System.out.println("请输入押金:");
int deposit = sc.nextInt();
uptsql = "update student set deposit = ? where stuname = ?";
qr.update(DBUtil.getConn(),uptsql,deposit,stuname);
}else if (choice == 4){
System.out.println("请输入报名学生的联系方式:");
String phone = sc.next();
uptsql = "update student set phone = ? where stuname = ?";
qr.update(DBUtil.getConn(),uptsql,phone,stuname);
}else {
System.out.println("对不起,您的选择有误!");
}
System.out.println("报名信息修改成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除报名
private static void dropEnroll() {
System.out.println("请输入要删除的学生姓名:");
String stuname = sc.next();
//连接数据库,执行删除的SQL
String sql = "DELETE FROM student WHERE stuname = ?";
try {
qr.update(DBUtil.getConn(),sql,stuname);
System.out.println("报名信息删除成功!");
} catch (SQLException e) {
e.printStackTrace();
}
}
// 查询报名
/*
结果集处理器: ResultSetHandler
1. BeanHandler:把查询结果,封装为单个JavaBean 一般用于查单条记录 ,例如:"SELECT * FROM student where stuname = '张三' ";
2.BeanListHandler:把查询结果,封装为JavaBean的集合 一般用于查多条记录 ,例如:"SELECT * FROM student";
*/
private static void queryEnroll() {
String sql = "SELECT * FROM student";
try {
List<Student> list = qr.query(DBUtil.getConn(), sql, new BeanListHandler<>(Student.class));
for (Student student : list) {
System.out.println(student);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}