記事ディレクトリ
ミッション概要
ユーザーエクスペリエンスを向上させるために、航空会社はフライト情報システムを構築したいと考えており、ユーザーはニーズに応じてフライト情報を操作できます。
- フライト情報システムのメインメニューを表示する
- すべてのフライト情報を確認する
- 出発時刻から探す
- 目的地から探す
- フライトの削除
- フライトを更新する
- 出口システム
特定の要件
Java コードを通じてデータベースを操作することで、ユーザーはコンソール上で対応する操作を実行できます。
ナレッジポイントの関与
3. カスタム ツール クラスとプロパティ構成ファイルの使用
タスクプロセス
1. データベーステーブル airinfo を作成し、テストデータを追加すると、主キーが自動的に増加します。
2. 新しいオブジェクト パッケージ pojo を作成し、エンティティ クラス AirInfo を作成し、業務に応じて必要なコンストラクターとセッター/ゲッター メソッドを提供します。
3. 新しいツールキット utils を作成し、DBUtils クラスを作成し、データベース操作メソッドをカプセル化し、データベース接続およびシャットダウン機能を実装します。
4. 新しい例外パッケージ例外を作成し、カスタム例外クラス OutNumberBoundException を作成します。
5. 新しいビュー パッケージ ビューを作成し、ユーザーに入力と出力を求める AirInfoView クラスを作成します。
6. 新しいデータ操作パッケージ dao を作成し、AirInfoDao インターフェイスを作成し、すべてのフライトのクエリ、出発時刻と目的地によるフライトのクエリ、フライトの削除、およびフライトの更新のメソッドを定義します。
7. データ操作パッケージ dao で、AirInfoDaoImpl クラスを作成し、DBUtils クラスを継承し、AirInfoDao インターフェイスを実装し、JDBC を使用して対応するデータベース操作を完了します。
8. 新しいテスト パッケージ test を作成し、Platform クラスを作成し、コンソールへのメッセージ情報の表示とユーザーによるメッセージの追加の操作を完了し、システムを起動して実行します。
アイデアとコードの実装
1. ツールキット
utils パッケージを作成し、新しいクラス DBUtils を作成し、新しい構成ファイル db.properties を作成します。
プロパティ設定ファイル
ResourceBundle を使用してローカル リソースにアクセスし、そこから必要な値を読み取ります
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username=root
password=123456
DBUtils
JDBC ツール クラスは SQL を操作するためのメソッドをカプセル化するため、静的メソッドを推奨します。
- 変数の定義
//定义需要的工具类对象(变量定义)
protected static Connection connection = null;
protected static PreparedStatement pps = null;//后续都是用预状态通道来实现
protected static ResultSet rs = null;//结果集
protected static int count = 0;//受影响的行数
//登录的用户名和密码
private static String username;
private static String password;
private static String url;
private static String driverName;
//Druid连接池
private static DruidDataSource druidDataSource = new DruidDataSource();
- ドライバーをロードする
//加载驱动
static {
//Druid
ResourceBundle bundle = ResourceBundle.getBundle("db");//参数只写属性文件名,不需要写后缀
//加载属性文件
driverName = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setUrl(url);
druidDataSource.setDriverClassName(driverName);
}
- リンクを取得
protected static Connection getConnection() {
try {
connection = druidDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
- 状態前のチャネルを取得してパラメータをバインドします
//得到预状态通道
protected static PreparedStatement getPps(String sql) {
try {
getConnection();
pps = connection.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return pps;
}
//绑定参数,给占位符赋值,list中保存的是给占位符所赋的值
private static void setParams(List list) {
try {
if (list != null && list.size() > 0) {
//集合中有内容
for (int i = 0; i < list.size(); i++) {
pps.setObject(i + 1, list.get(i));//赋值,位置从1开始所以为i+1
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
- 追加、削除、変更
protected static int update(String sql, List list) {
try {
getPps(sql);//得到预状态通道
setParams(list);//绑定参数
count = pps.executeUpdate();//pps.executeUpdate()执行sql语句,返回受影响的行数
} catch (SQLException e) {
e.printStackTrace();
}
return count;//返回受影响的行数
}
- データクエリ
protected static ResultSet query(String sql, List list) {
try {
getPps(sql);//得到预状态通道
setParams(list);//绑定参数
rs = pps.executeQuery();//pps.executeUpdate()执行sql语句,返回结果集
return rs;//返回结果集
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
- リソースを閉じる
protected static void closeAll() {
try {
if (rs != null) {
rs.close();
}
if (pps != null) {
pps.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
2. カスタム例外
例外パッケージを作成し、新しいクラス OutNumberBoundException を作成します。
OutNumberBoundException
public class OutNumberBoundException extends Throwable {
public OutNumberBoundException(String s) {
super(s);
}
}
3. オブジェクト
pojo パッケージを作成し、新しいクラス AirInfo を作成します
AirInfo クラスはデータ テーブル airinfo に対応するため、クラス属性名 = テーブルフィールド名
airinfo テーブルは次のとおりです。
航空情報
- プロパティを定義し、setter と getter を使用して値を設定および取得する
private Integer number;
private String airid;
private String address;
private Date flydate;
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getAirId() {
return airid;
}
public void setAirId(String airid) {
this.airid = airid;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getFlyDate() {
return flydate;
}
public void setFlyDate(Date flydate) {
this.flydate = flydate;
}
- パラメーターなしおよびフルパラメーターのコンストラクターを定義する
public AirInfo() {
}
public AirInfo(Integer number, String airid, String address, Date flydate) {
this.number = number;
this.airid = airid;
this.address = address;
this.flydate = flydate;
}
- toString() メソッドをオーバーライドして情報を文字列に変換します。
@Override
public String toString() {
return number + " " + '\t' + airid + " " + '\t' + address + " " + '\t' + flydate;
}
4. 分析を表示する
主にデータ入出力モジュールを担当
ビュー パッケージを作成し、新しいクラス AirInfoView を作成します
AirInfoView
- システムインターフェイスのメインメニューに入る
public static int mainMenu() {
int mainNum = 0;
do {
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("5.更新航班");
System.out.println("0.退出系统");
String s = input.nextLine();
try {
mainNum = AirInfoDaoImpl.validNum(s, 0, 5);//判断输入是否有效
break;
} catch (NumberFormatException | OutNumberBoundException e) {
System.out.println(e.getMessage());
}
} while (true);
return mainNum;
}
- すべてのフライト情報を確認する
/**
* 查询所有的航班信息
*/
public static void printAllAir(List<AirInfo> airInfoList) {
System.out.println("航班信息如下:");
System.out.println("编号\t航班号 \t目的地\t\t起飞日期");
for (AirInfo airInfo : airInfoList) {
printAirInfo(airInfo);//打印单条航班信息
}
}
/**
* 打印单条航班信息
*/
public static void printAirInfo(AirInfo a) {
System.out.println(a.toString());
}
- 出発時間別にフライトを確認する
public static String findByDate() {
System.out.print("请输入起飞时间(form:year-month-day):");
String s = input.nextLine();
return s;
}
- 目的地からフライトを検索
public static String findByAddress() {
System.out.print("请输入航班的目的地:");
String s = input.nextLine();
return s;
}
- フライトの削除
/**
* (根据航班号)删除航班
*/
public static String deleteByAirId() {
System.out.print("请输入要删除航班的航班号:");
String s = input.nextLine();
return s;
}
/**
* 是否删除航班
*/
public static int isDelete() {
int num = 0;
do {
System.out.println("是否确认删除?");
System.out.println("1.确认删除");
System.out.println("0.取消操作");
String s = input.nextLine();
try {
num = AirInfoDaoImpl.validNum(s, 0, 1);
break;
} catch (NumberFormatException | OutNumberBoundException e) {
System.out.println(e.getMessage());
}
} while (true);
return num;
}
- フライトを更新する
/**
* (根据编号)更新航班
*/
public static int updateByNumber() {
System.out.print("请输入要更新航班的编号:");
String s = input.nextLine();
int num = Integer.parseInt(s);
return num;
}
/**
* 输入新的航班目的地
*/
public String updateAddress() {
System.out.print("请输入新的航班目的地:");
String s = input.nextLine();
return s;
}
/**
* 输入新的航班日期
*/
public String updateDate() {
System.out.print("请输入新的航班起飞时间:");
String s = input.nextLine();
return s;
}
- システムへの出入り
/**
* 进入系统
*/
public static void welcome() {
System.out.println("欢迎进入航班信息管理系统!");
}
/**
* 退出系统
*/
public static void bye() {
System.out.println("感谢使用航班信息管理系统!");
}
5. データアクセス
主にデータ処理を担当するモジュール
dao パッケージを作成し、新しい AirInfoDao インターフェイスを作成し、DBUtils クラスを継承する新しい AirInfoDaoImpl クラスを作成し、AirInfoDao インターフェイスを実装し、JDBC を使用して対応するデータベース操作を完了します。
AirInfoDao
すべてのフライトのクエリ、出発時刻と目的地によるフライトのクエリ、フライトの削除、フライトの更新のための抽象メソッドを定義します。
- すべてのフライト情報を確認する
List<AirInfo> getAirList();
- 出発時間別にフライトを確認する
List<AirInfo> findByDate(String date);
- 目的地からフライトを検索
List<AirInfo> findByAddress(String address);
- フライトの削除
int deleteByAirId(String airid);
- フライトを更新する
int updateAirInfo(int num, String newAddress, String newDate);
AirInfoDaoImpl
インターフェースに定義された抽象メソッドを具体的に実装する
- 入力が数値であり、有効な範囲内であるかどうかを判断します。
public static int validNum(String s, int begin, int end) throws NumberFormatException, OutNumberBoundException {
try {
int num = Integer.parseInt(s);
if (num < begin || num > end) {
throw new OutNumberBoundException("数字的范围必须在" + begin + "和" + end + "之间");
}
return num;
} catch (NumberFormatException e) {
throw new NumberFormatException("输入的必须是数字!");
}
}
- すべてのフライト情報を確認する
@Override
public List<AirInfo> getAirList() {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo ";
ResultSet resultSet = query(sql, null);
while (resultSet.next()) {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
- 出発時間別にフライトを確認する
@Override
public List<AirInfo> findByDate(String date) {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo where flydate = ?";
ArrayList param = new ArrayList();
param.add(date);
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
do {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
} while (resultSet.next());
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
- 目的地からフライトを検索
@Override
public List<AirInfo> findByAddress(String address) {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo where address like ?";
ArrayList param = new ArrayList();
param.add("%" + address + "%");
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
do {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
} while (resultSet.next());
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
- フライトの削除
/**
* (根据航班号)删除航班
*/
@Override
public int deleteByAirId(String airid) {
int count = 0;
try {
String sql = "delete from airinfo where airid = ?";
ArrayList param = new ArrayList();
param.add(airid);
count = update(sql, param);
} finally {
closeAll();
}
return count;//返回受影响的行数
}
/**
* (根据航班号)查询航班是否存在
* 可能该航班存在多个时间点,因此用list存储查找到的信息
*/
public List<AirInfo> findById(String airid) {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo where airid = ?";
ArrayList param = new ArrayList();
param.add(airid);
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
do {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
} while (resultSet.next());
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
- フライトを更新する
/**
* (根据编号)更新航班
*/
@Override
public int updateAirInfo(int num, String newAddress, String newDate) {
int count = 0;
try {
String sql = "update airinfo set address = ? ,flydate = ? where number = ?";
ArrayList param = new ArrayList();
param.add(newAddress);
param.add(newDate);
param.add(num);
count = update(sql, param);
} finally {
closeAll();
}
return count;//返回受影响的行数
}
/**
* 根据编号查找航班是否存在
*/
public AirInfo findByNumber(int number) {
AirInfo info = new AirInfo();
try {
String sql = "select* from airinfo where number = ?";
ArrayList param = new ArrayList();
param.add(number);
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return info;
}
6. メインインターフェース
テストパッケージを作成し、新しいクラスプラットフォームを作成します
プラットホーム
- システムのメインメニューを使用して、対応する機能インターフェイスに入ります
public static void main(String[] args) {
v.welcome();//进入界面
//调用主菜单进入相应的功能界面
m:
while (true) {
int mainNum = v.mainMenu();//调用主菜单
switch (mainNum) {
case 0://结束使用
break m;
case 1://查询所有的航班信息
printAllAir();
break;
case 2://按起飞时间查询
findByDate();
break;
case 3://按目的地查询
findByAddress();
break;
case 4://(根据航班号)删除航班
deleteByAirId();
break;
case 5://(根据航班号)更新航班
updateAirInfo();
break;
}
}// end while
v.bye();//退出系统
}//end main
- すべてのフライト情報を確認する
public static void printAllAir() {
v.printAllAir(dao.getAirList());
}
- 出発時間別にフライトを確認する
public static void findByDate() {
String date = v.findByDate();
List<AirInfo> infos = dao.findByDate(date);
if (infos != null) {
v.printAllAir(infos);
} else {
System.out.println("该时间暂未航班信息!");
}
}
- 目的地からフライトを検索
public static void findByAddress() {
String address = v.findByAddress();
List<AirInfo> infos = dao.findByAddress(address);
if (infos != null) {
v.printAllAir(infos);
} else {
System.out.println("暂未到达该目的地的航班信息!");
}
}
- フライトの削除 (フライト番号に基づく)
public static void deleteByAirId() {
String airId = v.deleteByAirId();
List<AirInfo> infos = dao.findById(airId);
if (infos != null) {
v.printAllAir(infos);
if (v.isDelete() == 1) {
int count = dao.deleteByAirId(airId);
System.out.println(count + "行受影响,删除成功!");
} else {
System.out.println("取消成功!");
}
} else {
System.out.println("该航班不存在!");
}
}
- フライトを更新(番号に従って)
public static void updateAirInfo() {
int num = v.updateByNumber();//输入要更新的航班的编号
AirInfo info = dao.findByNumber(num);
if (info != null) {
System.out.println("要更新的航班信息如下:");
v.printAirInfo(info);//打印所有该航班号的航班信息
String newAddress = v.updateAddress();
String newDate = v.updateDate();
dao.updateAirInfo(num, newAddress, newDate);
System.out.println("更新成功!");
} else {
System.out.println("暂未此航班号的航班信息!");
}
}
完全なコードは次のとおりです
1. ツールキット
プロパティ設定ファイル
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username=root
password=123456
DBUtils
public class DBUtils {
//1.定义需要的工具类对象(变量定义)
protected static Connection connection = null;
protected static PreparedStatement pps = null;//后续都是用预状态通道来实现
protected static ResultSet rs = null;//结果集
protected static int count = 0;//受影响的行数
//登录的用户名和密码
private static String username;
private static String password;
private static String url;
private static String driverName;
//Druid
private static DruidDataSource druidDataSource = new DruidDataSource();
//2.加载驱动
static {
//Druid
ResourceBundle bundle = ResourceBundle.getBundle("db");//参数只写属性文件名,不需要写后缀
//加载属性文件
driverName = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setUrl(url);
druidDataSource.setDriverClassName(driverName);
}
//3.获得连接
protected static Connection getConnection() {
try {
connection = druidDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//4.得到预状态通道
protected static PreparedStatement getPps(String sql) {
try {
getConnection();//insert into users values(?,?,?,?,)
pps = connection.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return pps;
}
//5.绑定参数,给占位符赋值,list中保存的是给占位符所赋的值
private static void setParams(List list) {
try {
if (list != null && list.size() > 0) {
//集合中有内容
for (int i = 0; i < list.size(); i++) {
pps.setObject(i + 1, list.get(i));//赋值,位置从1开始所以为i+1
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//6.增删改
protected static int update(String sql, List list) {
try {
getPps(sql);//得到预状态通道
setParams(list);//绑定参数
count = pps.executeUpdate();//pps.executeUpdate()执行sql语句,返回受影响的行数
} catch (SQLException e) {
e.printStackTrace();
}
return count;//返回受影响的行数
}
//7.查询
protected static ResultSet query(String sql, List list) {
try {
getPps(sql);//得到预状态通道
setParams(list);//绑定参数
rs = pps.executeQuery();//pps.executeUpdate()执行sql语句,返回结果集
return rs;//返回结果集
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//8.关闭资源
protected static void closeAll() {
try {
if (rs != null) {
rs.close();
}
if (pps != null) {
pps.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. カスタム例外
OutNumberBoundException
public class OutNumberBoundException extends Throwable {
public OutNumberBoundException(String s) {
super(s);
}
}
3. オブジェクト
航空情報
public class AirInfo {
private Integer number;
private String airid;
private String address;
private Date flydate;
public AirInfo() {
}
public AirInfo(Integer number, String airid, String address, Date flydate) {
this.number = number;
this.airid = airid;
this.address = address;
this.flydate = flydate;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getAirId() {
return airid;
}
public void setAirId(String airid) {
this.airid = airid;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getFlyDate() {
return flydate;
}
public void setFlyDate(Date flydate) {
this.flydate = flydate;
}
@Override
public String toString() {
return number + " " + '\t' + airid + " " + '\t' + address + " " + '\t' + flydate;
}
}
4. 分析を表示する
AirInfoView
public class AirInfoView {
public static Scanner input = new Scanner(System.in);
/**
* 进入系统
*/
public static void welcome() {
System.out.println("欢迎进入航班信息管理系统!");
}
/**
* 主菜单,系统界面
*/
public static int mainMenu() {
int mainNum = 0;
do {
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("5.更新航班");
System.out.println("0.退出系统");
String s = input.nextLine();
try {
mainNum = AirInfoDaoImpl.validNum(s, 0, 5);
break;
} catch (NumberFormatException | OutNumberBoundException e) {
System.out.println(e.getMessage());
}
} while (true);
return mainNum;
}
/**
* 1、查询所有的航班信息
*/
public static void printAllAir(List<AirInfo> airInfoList) {
System.out.println("航班信息如下:");
System.out.println("编号\t航班号 \t目的地\t\t起飞日期");
for (AirInfo airInfo : airInfoList) {
printAirInfo(airInfo);
}
}
/**
* 打印单条航班信息
*/
public static void printAirInfo(AirInfo a) {
System.out.println(a.toString());
}
/**
* 2、按起飞时间查询
*/
public static String findByDate() {
System.out.print("请输入起飞时间(form:year-month-day):");
String s = input.nextLine();
return s;
}
/**
* 3、按目的地查询
*/
public static String findByAddress() {
System.out.print("请输入航班的目的地:");
String s = input.nextLine();
return s;
}
/**
* 4、(根据航班号)删除航班
*/
public static String deleteByAirId() {
System.out.print("请输入要删除航班的航班号:");
String s = input.nextLine();
return s;
}
/**
* 是否删除航班
*/
public static int isDelete() {
int num = 0;
do {
System.out.println("是否确认删除?");
System.out.println("1.确认删除");
System.out.println("0.取消操作");
String s = input.nextLine();
try {
num = AirInfoDaoImpl.validNum(s, 0, 1);
break;
} catch (NumberFormatException | OutNumberBoundException e) {
System.out.println(e.getMessage());
}
} while (true);
return num;
}
/**
* 5、根据编号更新航班
*/
public static int updateByNumber() {
System.out.print("请输入要更新航班的编号:");
String s = input.nextLine();
int num = Integer.parseInt(s);
return num;
}
/**
* 输入新的航班目的地
*/
public String updateAddress() {
System.out.print("请输入新的航班目的地:");
String s = input.nextLine();
return s;
}
/**
* 输入新的航班日期
*/
public String updateDate() {
System.out.print("请输入新的航班起飞时间:");
String s = input.nextLine();
return s;
}
/**
* 退出系统
*/
public static void bye() {
System.out.println("感谢使用航班信息管理系统!");
}
}
5. データアクセス
AirInfoDao
/**
* 定义查询所有航班,按日期和目的地查询航班,删除航班,更新航班的方法
*/
public interface AirInfoDao {
/**
* 1、查询所有的航班信息
*/
List<AirInfo> getAirList();
/**
* 2、按起飞时间查询
*/
List<AirInfo> findByDate(String date);
/**
* 3、按目的地查询
*/
List<AirInfo> findByAddress(String address);
/**
* 4、(根据航班号)删除航班
*/
int deleteByAirId(String airid);
/**
* 5、更新航班
*/
int updateAirInfo(int num, String newAddress, String newDate);
}
AirInfoImpl
/**
* 使用 JDBC 完成相应数据库操作
*/
public class AirInfoDaoImpl extends DBUtils implements AirInfoDao {
/**
* 判断输入是否为数字、是否在有效范围内
*/
public static int validNum(String s, int begin, int end) throws NumberFormatException, OutNumberBoundException {
try {
int num = Integer.parseInt(s);
if (num < begin || num > end) {
throw new OutNumberBoundException("数字的范围必须在" + begin + "和" + end + "之间");
}
return num;
} catch (NumberFormatException e) {
throw new NumberFormatException("输入的必须是数字!");
}
}
/**
* 1、查询所有的航班信息
*/
@Override
public List<AirInfo> getAirList() {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo ";
ResultSet resultSet = query(sql, null);
while (resultSet.next()) {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
/**
* 2、按起飞时间查询
*/
@Override
public List<AirInfo> findByDate(String date) {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo where flydate = ?";
ArrayList param = new ArrayList();
param.add(date);
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
do {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
} while (resultSet.next());
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
/**
* 3、按目的地查询
*/
@Override
public List<AirInfo> findByAddress(String address) {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo where address like ?";
ArrayList param = new ArrayList();
param.add("%" + address + "%");
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
do {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
} while (resultSet.next());
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
/**
* 4、(根据航班号)删除航班
*/
@Override
public int deleteByAirId(String airid) {
int count = 0;
try {
String sql = "delete from airinfo where airid = ?";
ArrayList param = new ArrayList();
param.add(airid);
count = update(sql, param);
} finally {
closeAll();
}
return count;//返回受影响的行数
}
/**
* (根据航班号)查询航班是否存在
* 可能该航班存在多个时间点,因此用list存储查找到的信息
*/
public List<AirInfo> findById(String airid) {
ArrayList arrayList = new ArrayList();
try {
String sql = "select* from airinfo where airid = ?";
ArrayList param = new ArrayList();
param.add(airid);
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
do {
AirInfo info = new AirInfo();
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
arrayList.add(info);
} while (resultSet.next());
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return arrayList;
}
/**
* 5、(根据编号)更新航班
*/
@Override
public int updateAirInfo(int num, String newAddress, String newDate) {
int count = 0;
try {
String sql = "update airinfo set address = ? ,flydate = ? where number = ?";
ArrayList param = new ArrayList();
param.add(newAddress);
param.add(newDate);
param.add(num);
count = update(sql, param);
} finally {
closeAll();
}
return count;//返回受影响的行数
}
/**
* 根据编号查找航班是否存在
*/
public AirInfo findByNumber(int number) {
AirInfo info = new AirInfo();
try {
String sql = "select* from airinfo where number = ?";
ArrayList param = new ArrayList();
param.add(number);
ResultSet resultSet = query(sql, param);
if (resultSet.next() == false) {
//查询结果为空
return null;
} else {
//查询结果非空
info.setNumber(resultSet.getInt("number"));
info.setAirId(resultSet.getString("airid"));
info.setAddress(resultSet.getString("address"));
info.setFlyDate(resultSet.getDate("flydate"));
}//end if
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return info;
}
}
6. メインインターフェース
プラットホーム
public class Platform {
public static AirInfoView v = new AirInfoView();
public static AirInfoDaoImpl dao = new AirInfoDaoImpl();
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
v.welcome();
//调用主菜单进入相应的功能界面
m:
while (true) {
int mainNum = v.mainMenu();//调用主菜单
switch (mainNum) {
case 0://结束使用
break m;
case 1://查询所有的航班信息
printAllAir();
break;
case 2://按起飞时间查询
findByDate();
break;
case 3://按目的地查询
findByAddress();
break;
case 4://(根据航班号)删除航班
deleteByAirId();
break;
case 5://(根据航班号)更新航班
updateAirInfo();
break;
}
}// end while
v.bye();
}//end main
/**
* 1、查询所有航班信息
*/
public static void printAllAir() {
v.printAllAir(dao.getAirList());
}
/**
* 2、按起飞时间查询
*/
public static void findByDate() {
String date = v.findByDate();
List<AirInfo> infos = dao.findByDate(date);
if (infos != null) {
v.printAllAir(infos);
} else {
System.out.println("该时间暂未航班信息!");
}
}
/**
* 3、按目的地查询
*/
public static void findByAddress() {
String address = v.findByAddress();
List<AirInfo> infos = dao.findByAddress(address);
if (infos != null) {
v.printAllAir(infos);
} else {
System.out.println("暂未到达该目的地的航班信息!");
}
}
/**
* 4、(根据航班号)删除航班
*/
public static void deleteByAirId() {
String airId = v.deleteByAirId();
List<AirInfo> infos = dao.findById(airId);
if (infos != null) {
v.printAllAir(infos);
if (v.isDelete() == 1) {
int count = dao.deleteByAirId(airId);
System.out.println(count + "行受影响,删除成功!");
} else {
System.out.println("取消成功!");
}
} else {
System.out.println("该航班不存在!");
}
}
/**
* 5、更新航班(由于编号唯一,因此根据编号更新)
*/
public static void updateAirInfo() {
int num = v.updateByNumber();//输入要更新的航班的编号
AirInfo info = dao.findByNumber(num);
if (info != null) {
System.out.println("要更新的航班信息如下:");
v.printAirInfo(info);//打印所有该航班号的航班信息
String newAddress = v.updateAddress();
String newDate = v.updateDate();
dao.updateAirInfo(num, newAddress, newDate);
System.out.println("更新成功!");
} else {
System.out.println("暂未此航班号的航班信息!");
}
}
}//end class