運航情報管理システム(JDBC)


ミッション概要

ユーザーエクスペリエンスを向上させるために、航空会社はフライト情報システムを構築したいと考えており、ユーザーはニーズに応じてフライト情報を操作できます。

  1. フライト情報システムのメインメニューを表示する
  2. すべてのフライト情報を確認する
  3. 出発時刻から探す
  4. 目的地から探す
  5. フライトの削除
  6. フライトを更新する
  7. 出口システム

特定の要件

Java コードを通じてデータベースを操作することで、ユーザーはコンソール上で対応する操作を実行できます。


ナレッジポイントの関与

1. SQL言語と基本操作

2. JDBC (Java データベース接続)

3. カスタム ツール クラスとプロパティ構成ファイルの使用

4. JDBC接続プール


タスクプロセス

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

おすすめ

転載: blog.csdn.net/m0_50609545/article/details/119846855