JDBC工具类模块
package com.kaikeba.task.task010404.utils;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.*;
import java.util.List;
import java.util.ResourceBundle;
public class JDBCUtils {
// 1、定义初始变量
// 1.1 连接对象
private Connection conn;
// 1.2 预状态通道对象
private PreparedStatement ps;
// 1.3 结果集对象
private ResultSet resultSet;
// 1.4 存储受影响的行数数据
private int count;
// 1.5 数据库连接地址
private static final String url;
// 1.6 用户名
private static final String username;
// 1.7 密码
private static final String password;
// 1.8 驱动地址
private static final String driverClassName;
// 1.9 创建德鲁伊数据池连接对象
private static final DruidDataSource dds = new DruidDataSource();
// 加载驱动
static {
// 读取属性文件数据
ResourceBundle bundle = ResourceBundle.getBundle("dbConfig");
driverClassName = bundle.getString("driverClassName");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
// 设置属性
dds.setUsername(username);
dds.setPassword(password);
dds.setUrl(url);
dds.setDriverClassName(driverClassName); // 驱动地址
// dds.setInitialSize(20); // 设置初始连接个数
dds.setTestWhileIdle(false); // 解决报错【testWhileIdle is true, validationQuery not set】
}
/**
* 获得连接
*
* @return 连接对象
*/
public Connection getConn() {
try {
conn = dds.getConnection();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return conn;
}
/**
* 获得预状态通道对象
*
* @param sql sql语句
* @return 预状态通道对象
*/
public PreparedStatement getPs(String sql) {
try {
ps = getConn().prepareStatement(sql);
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return ps;
}
/**
* 绑定参数
*
* @param list 参数列表
*/
private void params(List<Object> list) {
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
try {
ps.setObject(i + 1, list.get(i));
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
}
}
/**
* 执行【增删改】操作
*
* @param sql sql语句
* @param list 参数列表
* @return 影响行数
*/
public int update(String sql, List<Object> list) {
getPs(sql);
params(list);
try {
count = ps.executeUpdate();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return count;
}
/**
* 执行【查询】操作
*
* @param sql sql语句
* @param list 参数列表
* @return 查询得到的数据
*/
public ResultSet query(String sql, List<Object> list) {
getPs(sql);
params(list);
try {
resultSet = ps.executeQuery();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return resultSet;
}
/**
* 查询全部数据
* @param sql SQL语句
* @return 全部数据
*/
public ResultSet queryAll(String sql) {
getPs(sql);
try {
resultSet = ps.executeQuery();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return resultSet;
}
/**
* 关闭所有资源
*/
public void closeAll() {
try {
if (resultSet != null)
resultSet.close();
if (ps != null)
ps.close();
if (conn != null)
conn.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
}
AirInfo
package com.kaikeba.task.task010404.bean;
public class AirInfo {
// 编号
private int number;
// 航班号
private int flightNumber;
// 目的地
private String destination;
// 起飞日期
private String date;
public AirInfo() {
}
public AirInfo(int number, int flightNumber, String destination, String date) {
this.number = number;
this.flightNumber = flightNumber;
this.destination = destination;
this.date = date;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getFlightNumber() {
return flightNumber;
}
public void setFlightNumber(int flightNumber) {
this.flightNumber = flightNumber;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "AirInfo{" +
"number=" + number +
", flightNumber=" + flightNumber +
", destination='" + destination + '\'' +
", date=" + date +
'}';
}
}
Dao模块
package com.kaikeba.task.task010404.dao;
import com.kaikeba.task.task010404.bean.AirInfo;
import java.util.List;
public interface AirInfoDao {
/**
* 根据起飞时间查询
* @param date 起飞时间
* @return 对应的航班信息
*/
public List<AirInfo> findByDate(String date);
/**
* 根据目的地查询
* @param destination 目的地
* @return 对应的航班信息
*/
public List<AirInfo> findByDestination(String destination);
/**
* 查看所有航班
* @return 所有航班信息
*/
public List<AirInfo> findAll();
/**
* 更新航班信息【根据编号】
* @param airInfo 航班信息
* @return 影响行数
*/
public int update(AirInfo airInfo);
/**
* 删除航班信息【根据编号】
* @param number 编号
* @return 影响行数
*/
public int delete(int number);
}
Dao实现类模块
package com.kaikeba.task.task010404.dao.impl;
import com.kaikeba.task.task010404.bean.AirInfo;
import com.kaikeba.task.task010404.dao.AirInfoDao;
import com.kaikeba.task.task010404.utils.JDBCUtils;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class AirInfoDaoImpl extends JDBCUtils implements AirInfoDao {
@Override
public List<AirInfo> findByDate(String date) {
// 定义SQL查询语句
String sql = "SELECT number,flightNumber,destination,date FROM air_info WHERE date=?";
// 声明一个空数组,用于存储查询参数
List<Object> list = new ArrayList<>();
// 将查询参数添加到数组中
list.add(date);
// 执行查询语句
ResultSet resultSet = query(sql, list);
// 声明一个空数组,用于存放查询得到的数据
List<AirInfo> airInfos = new ArrayList<>();
try {
while (resultSet.next()) {
// 声明一个 AirInfo 对象
AirInfo airInfo = new AirInfo();
// 设置属性
airInfo.setNumber(resultSet.getInt("number"));
airInfo.setFlightNumber(resultSet.getInt("flightNumber"));
airInfo.setDestination(resultSet.getString("destination"));
airInfo.setDate(resultSet.getString("date"));
// 将 AirInfo 对象数据添加到列表中
airInfos.add(airInfo);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 关闭资源
closeAll();
}
return airInfos;
}
@Override
public List<AirInfo> findByDestination(String destination) {
// 定义SQL查询语句
String sql = "SELECT number,flightNumber,destination,date FROM air_info WHERE destination=?";
// 声明一个空数组,用于存储查询参数
List<Object> list = new ArrayList<>();
// 将查询参数添加到数组中
list.add(destination);
// 执行查询语句
ResultSet resultSet = query(sql, list);
// 声明一个空数组,用于存放查询得到的数据
List<AirInfo> airInfos = new ArrayList<>();
try {
while (resultSet.next()) {
// 声明一个 AirInfo 对象
AirInfo airInfo = new AirInfo();
// 设置属性
airInfo.setNumber(resultSet.getInt("number"));
airInfo.setFlightNumber(resultSet.getInt("flightNumber"));
airInfo.setDestination(resultSet.getString("destination"));
airInfo.setDate(resultSet.getString("date"));
// 将 AirInfo 对象数据添加到列表中
airInfos.add(airInfo);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 关闭资源
closeAll();
}
return airInfos;
}
@Override
public List<AirInfo> findAll() {
// 声明一个空数组,用于存放查询得到的数据
List<AirInfo> airInfos = new ArrayList<>();
// 定义查询SQL语句
String sql = "SELECT number,flightNumber,destination,date FROM air_info";
// 执行查询语句,获取查询结果
ResultSet resultSet = queryAll(sql);
try {
while (resultSet.next()) {
// 声明一个 AirInfo 对象
AirInfo airInfo = new AirInfo();
// 设置属性
airInfo.setNumber(resultSet.getInt("number"));
airInfo.setFlightNumber(resultSet.getInt("flightNumber"));
airInfo.setDestination(resultSet.getString("destination"));
airInfo.setDate(resultSet.getString("date"));
// 将 AirInfo 对象数据添加到列表中
airInfos.add(airInfo);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 关闭资源
closeAll();
}
return airInfos;
}
@Override
public int update(AirInfo airInfo) {
// 定义SQL查询语句
String sql = "UPDATE air_info SET flightNumber=?,destination=?,date=? WHERE number=?";
// 声明一个空数组,用于存储查询参数
List<Object> list = new ArrayList<>();
// 将查询参数添加到数组中
list.add(airInfo.getFlightNumber());
list.add(airInfo.getDestination());
list.add(airInfo.getDate());
list.add(airInfo.getNumber());
// 执行查询语句
return update(sql, list);
}
@Override
public int delete(int number) {
// 定义SQL查询语句
String sql = "DELETE FROM air_info WHERE number=?";
// 声明一个空数组,用于存储查询参数
List<Object> list = new ArrayList<>();
// 将查询参数添加到数组中
list.add(number);
// 执行查询语句
return update(sql, list);
}
}
视图模块
package com.kaikeba.task.task010404.view;
import com.kaikeba.task.task010404.bean.AirInfo;
import java.util.List;
import java.util.Scanner;
public class Views {
// 声明一个数据输入对象
Scanner input_in = new Scanner(System.in);
/**
* 欢迎语
*/
public void welcome() {
System.out.println("********* 欢迎使用航班信息管理系统 *********");
}
/**
* 开始菜单
*
* @return 服务编号
*/
public int menu() {
// 提示用户输入服务编号
System.out.print("请选择操作(1、列出所有航班;2、按起飞时间查询;3、按目的地查询;4、删除航班;5、更新航班;6、离开系统):");
// 接收用户输入数据,并校验,数据校验正确,将其返回
return checkData(1, 6);
}
/**
* 校验数据
*
* @param start 开始数字
* @param end 结束数字
* @return 校验无误的数据
*/
public int checkData(int start, int end) {
// 声明一个整数变量用于接受用户输入的服务编号
int num;
// 开启 while 循环用于校验用户输入数据是否有误
while (true) {
// 接受用户输入的数据
String input_text = input_in.nextLine();
try {
// 将用户输入的数据转换为 int 类型
num = Integer.parseInt(input_text);
} catch (Exception e) {
System.out.println("输入有误,请重新输入!");
continue;
}
// 判断用户输入数据是否小于初始值或大于结束值
if (num < start || num > end) {
System.out.println("输入有误,请重新输入!");
continue;
}
// 返回数据
return num;
}
}
/**
* 校验用户输入数据是否可转换为整数类型
*
* @return 用户输入数据
*/
public int checkInt() {
// 声明一个整数变量用于接受用户输入的服务编号
int num;
// 开启 while 循环用于校验用户输入数据是否有误
while (true) {
// 接受用户输入的数据
String input_text = input_in.nextLine();
try {
// 将用户输入的数据转换为 int 类型
num = Integer.parseInt(input_text);
} catch (Exception e) {
System.out.println("输入有误,请重新输入!");
continue;
}
// 返回数据
return num;
}
}
/**
* 输入时间
*
* @return 时间
*/
public String enterDate() {
System.out.print("请输入日期(格式:2021-01-01):");
return input_in.nextLine();
}
/**
* 输入目的地
*
* @return 目的地数据
*/
public String enterDestination() {
System.out.print("请输入目的地:");
return input_in.nextLine();
}
/**
* 删除航班
*
* @return 航班编号
*/
public int delete() {
System.out.print("请输入需要删除的航班编号:");
return checkInt();
}
/**
* 删除成功
*/
public void deleteSuccess() {
System.out.println("删除成功!");
}
/**
* 删除失败
*/
public void deleteFail() {
System.out.println("删除失败,请检查航班编号是否存在!");
}
/**
* 更新航班
*
* @return AirInfo 对象
*/
public AirInfo update() {
AirInfo airInfo = new AirInfo();
System.out.print("请输入需要更新的航班编号:");
airInfo.setNumber(checkInt());
System.out.print("请输入新的航班号:");
airInfo.setFlightNumber(checkInt());
System.out.print("请输入新的目的地:");
airInfo.setDestination(input_in.nextLine());
System.out.print("请输入新的起飞日期(格式:2021-01-01):");
airInfo.setDate(input_in.nextLine());
return airInfo;
}
/**
* 更新成功
*/
public void updateSuccess() {
System.out.println("更新成功!");
}
/**
* 更新失败
*/
public void updateFail() {
System.out.println("更新失败,请检查航班编号是否存在!");
}
/**
* 退出提示
*/
public void signOut() {
System.out.println("很高兴为您服务,期待您的再次使用!");
}
/**
* 展示航班信息
*
* @param list 航班数据列表
*/
public void show(List<AirInfo> list) {
System.out.println("\t编号 \t航班号 \t目的地 \t起飞日期");
if (list.size()>0){
for (AirInfo airInfo : list) {
System.out.println("\t" + airInfo.getNumber() + " \t\t" + airInfo.getFlightNumber() + " \t" + airInfo.getDestination() + " \t" + airInfo.getDate());
}
}else {
System.out.println("当前航班信息为空");
}
}
}
调度模块
package com.kaikeba.task.task010404;
import com.kaikeba.task.task010404.bean.AirInfo;
import com.kaikeba.task.task010404.dao.AirInfoDao;
import com.kaikeba.task.task010404.dao.impl.AirInfoDaoImpl;
import com.kaikeba.task.task010404.view.Views;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 声明一个视图对象
Views vs = new Views();
// 声明一个数据库对象
AirInfoDao dao = new AirInfoDaoImpl();
// 声明一个 List 集合用于存放数据
List<AirInfo> data;
// 初始化变量
int number;
int result;
// 欢迎语句
vs.welcome();
w:
while (true) {
// 菜单选项,接收用户输入服务编号
number = vs.menu();
switch (number) {
// 列出所有航班
case 1:
data = dao.findAll();
vs.show(data);
break;
// 按起飞时间查询
case 2:
String date = vs.enterDate();
data = dao.findByDate(date);
vs.show(data);
break;
// 按目的地查询
case 3:
String destination = vs.enterDestination();
data = dao.findByDestination(destination);
vs.show(data);
break;
// 删除航班
case 4:
int num = vs.delete();
result = dao.delete(num);
if (result > 0) {
vs.deleteSuccess();
} else {
vs.deleteFail();
}
break;
// 更新航班
case 5:
AirInfo airInfo = vs.update();
result = dao.update(airInfo);
if (result > 0) {
vs.updateSuccess();
} else {
vs.updateFail();
}
break;
// 离开系统
case 6:
vs.signOut();
break w;
}
}
}
}