Advertisement

航班信息系统

阅读量:

只要坚持下去,你就发现中奖一定会发生在别人身上。-------QAQ

构建一个航班信息系统

第一步:JavaBean 该系统实现了获取和设置功能的方法,并未对JavaBean中的出行日期进行String类型的转换以满足实验需求

复制代码
    package bean;
    
    import java.util.Date;
    
    public class AirInfo {
    private int id;
    private String airNo;
    private String destination;
    private Date departDate;
    
    public void setId(int id) {
        this.id = id;
    }
    
    public int getId() {
        return id;
    }
    
    public void setAirNo(String airNo) {
        this.airNo = airNo;
    }
    
    public String getAirNo() {
        return airNo;
    }
    
    public void setDestination(String destination) {
        this.destination = destination;
    }
    
    public String getDestination() {
        return destination;
    }
    
    public void setDepartDate(Date departDate) {
        this.departDate = departDate;
    }
    
    public Date getDepartDate() {
        return departDate;
    }
    
    @Override
    public String toString() {
        return "AirInfo{" +
                "id=" + id +
                ", airNo='" + airNo + '\'' +
                ", destination='" + destination + '\'' +
                ", departDate=" + departDate +
                '}';
    }
    }

第二步:View
共提供了三个方法,展示在控制台的相关界面功能

复制代码
    package view;
    
    import java.util.Scanner;
    
    public class View {
    private Scanner input = new Scanner(System.in);
    
    public void welcome(){
        System.out.println("*****************欢迎使用航班信息管理系统*********************");
    }
    
    public void exit(){
        input.close();
        System.out.println("***********您已退出航班信息管理系统,期待您的下次使用*************");
    }
    
    public int menu(){
        System.out.println("请选择操作:1. 列出所有航班;2. 按起飞时间查询;3. 按目的地查询;4. 删除航班;5. 更新航班;6. 离开系统" );
        try {
            String functionSelect = input.nextLine();
            int selectNum = Integer.parseInt(functionSelect);
            if(selectNum>6||selectNum<=0){
                System.out.println("功能序号输入有误,请重新输入");
                System.out.println();
                return menu();
            }
            return selectNum;
        }catch (NumberFormatException e){
            System.out.println("输入的功能序号格式有误,请重新输入!");
            System.out.println();
            return menu();
        }
    }
    }

第三步:BaseDao

  1. 相关的配置信息存储于.xml文件中,并利用InputStream进行了读取操作;之后无需再更改原始代码结构,在.php脚本中直接编辑.xml文件即可完成更新或修复操作。
  2. 本系统采用静态代码块的方式进行了德鲁伊数据库连接池的初始化配置。
  3. 为了防止遭受恶意SQL注入攻击的影响,在所有的增删操作中使用预编译语句集(PreparedStatement)来代替非安全的动态SQL语句;而数据查询操作则同样应用该技术以确保数据安全。
  4. 系统提供了一个名为insertParam()的方法来实现参数注入功能。
复制代码
    package dao;
    
    import com.alibaba.druid.pool.DruidDataSource;
    
    import java.io.*;
    import java.sql.*;
    import java.util.List;
    import java.util.Properties;
    
    public class BaseDao{
    private static Connection connection;
    private PreparedStatement statement;
    private ResultSet resultSet;
    private int count;
    private static String userName;
    private static String passWord;
    private static String url;
    private static String driverName;
    private static final String ConfigFilePath = "./dbconfig.xml";
    private static Properties map = new Properties();
    private static InputStream is;
    private static DruidDataSource dataSource = new DruidDataSource();
    
    // 配置文件初始化
    static {
        try {
            is = new FileInputStream(ConfigFilePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            map.loadFromXML(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        userName = (String) map.get("username");
        passWord = (String) map.get("password");
        url = (String) map.get("dburl");
        driverName = (String) map.get("driver");
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    // 数据库连接池(德鲁伊)初始化
    static {
        dataSource.setUsername(userName);
        dataSource.setPassword(passWord);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverName);
        try {
            connection = dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    
    // 生成预状态通道
    private PreparedStatement getStatement(String sql){
        try {
            statement = connection.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return statement;
    }
    
    // 参数注入
    private void insertParam(List paramList){
        if(paramList!=null || paramList.size()>0){
            for(int i=0;i<paramList.size();i++){
                try {
                    statement.setObject(i+1,paramList.get(i));
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
    
    //执行增删改
    public int executeUpdate(String sql,List list){
        statement = getStatement(sql);
        insertParam(list);
        try {
            count = statement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return count;
    }
    
    //执行查询
    public ResultSet executeQuery(String sql,List paramList){
        statement = getStatement(sql);
        insertParam(paramList);
        try {
            resultSet = statement.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return resultSet;
    }
    
    // 退出连接
    public void exitConnection(){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    }

第四步:AirInfoDao 该类负责管理与Domain Access Object相关的业务功能接口,并在Service层进行功能模块设计与实现。

复制代码
    package dao;
    
    import bean.AirInfo;
    
    import java.util.List;
    
    public interface AirInfoDao {
    List<AirInfo> findAll() throws Exception;
    List<AirInfo> getByDestination(String destination) throws Exception;
    List<AirInfo> getByDepartDate(String departDate) throws Exception;
    int update(int id,String airNo,String destination,String departDate);
    int deleteById(int id);
    }

第五步:AirInfoImpl

基于继承自BaseDao的原因,在编写数据库操作时只需准备好参数对象(如SQL语句和参数集),从而能够方便地执行数据库连接及CRUD(Create, Read, Update, Delete)操作。
处理日期对象有两种方法:一种是针对类似getByDepartDate()的情况,在SQL语句中设置为对应类型;另一种是采用java.sql.Date.valueOf(String departDate)的方法用于增删改操作。
在增删改操作后获取结果时(返回int),以及查询时(返回resultSet),都可以将结果存储到列表中以便后续数据传输。

复制代码
    package service;
    
    import bean.AirInfo;
    import dao.AirInfoDao;
    import dao.BaseDao;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class AirInfoImpl extends BaseDao implements AirInfoDao {
    
    @Override
    public List<AirInfo> findAll() throws SQLException {
        String sql = "select * from airinfo";
        List paramList = new ArrayList();
        ResultSet resultSet = executeQuery(sql, paramList);
        List<AirInfo> listAir = new ArrayList<>();
        System.out.println("查询结果如下:");
    
        while(resultSet.next()){
            AirInfo air = new AirInfo();
            air.setId(resultSet.getInt(1));
            air.setAirNo(resultSet.getString(2));
            air.setDestination(resultSet.getString(3));
            air.setDepartDate(resultSet.getDate(4));
            System.out.println("航班id:"+air.getId()+"\t航班号:"+air.getAirNo()+"\t航班目的地:"+air.getDestination()+"\t航班起飞时间:"+air.getDepartDate());
            listAir.add(air);
        }
        System.out.println();
        return listAir;
    }
    
    @Override
    public List<AirInfo> getByDestination(String destination) throws SQLException {
        String sql = "select * from airinfo where destination=?";
        List<String> paramList = new ArrayList();
        paramList.add(destination);
        ResultSet resultSet = executeQuery(sql, paramList);
        List<AirInfo> listAir = new ArrayList<>();
        System.out.println("查询结果如下:");
    
        while (resultSet.next()){
            AirInfo air = new AirInfo();
            air.setId(resultSet.getInt(1));
            air.setAirNo(resultSet.getString(2));
            air.setDestination(resultSet.getString(3));
            air.setDepartDate(resultSet.getDate(4));
            System.out.println("航班id:"+air.getId()+"\t航班号:"+air.getAirNo()+"\t航班目的地:"+air.getDestination()+"\t航班起飞时间:"+air.getDepartDate());
            listAir.add(air);
        }
        if(listAir.size()==0||listAir==null){
            System.out.println("查询不到任何航班信息");
        }
        System.out.println();
        return listAir;
    }
    
    @Override
    public List<AirInfo> getByDepartDate(String departDate) throws SQLException {
        String sql = "select * from airinfo where date_format(departdate,'%Y-%m-%d')=?";
        List<String> paramList = new ArrayList();
        paramList.add(departDate);
        ResultSet resultSet = executeQuery(sql, paramList);
        List<AirInfo> listAir = new ArrayList<>();
        System.out.println("查询结果如下:");
    
        while(resultSet.next()){
            AirInfo air = new AirInfo();
            air.setId(resultSet.getInt(1));
            air.setAirNo(resultSet.getString(2));
            air.setDestination(resultSet.getString(3));
            air.setDepartDate(resultSet.getDate(4));
            System.out.println("航班id:"+air.getId()+"\t航班号:"+air.getAirNo()+"\t航班目的地:"+air.getDestination()+"\t航班起飞时间:"+air.getDepartDate());
            listAir.add(air);
        }
        if(listAir.size()==0||listAir==null){
            System.out.println("当日无航班起飞");
        }
        System.out.println();
        return listAir;
    }
    
    @Override
    public int update(int id,String airNo,String destination,String departDate) {
        String sql = "update airinfo set airno=?,destination=?,departdate=? where id=?";
        List paramList = new ArrayList();
        paramList.add(airNo);
        paramList.add(destination);
        paramList.add(java.sql.Date.valueOf(departDate));
        paramList.add(id);
    
        int count = executeUpdate(sql, paramList);
        if(count>0){
            System.out.println("航班更新成功");
        }else{
            System.out.println("找不到对应的航班编号,请重新进行更新");
        }
        System.out.println();
        return count;
    }
    
    @Override
    public int deleteById(int id) {
        String sql = "delete from airinfo where id=?";
        List<Integer> paramList = new ArrayList();
        paramList.add(id);
        int count = executeUpdate(sql, paramList);
        if(count==0){
            System.out.println("删除航班失败,请输入正确的编号");
        }else{
            System.out.println("删除成功");
        }
        System.out.println();
        return count;
    }
    }

在Controller层面上,负责处理了View层和Service层的请求,并编写了主要的业务逻辑代码。特别注意,在系统发生断电时,请确保关闭Scanner实例以及数据库连接池。

复制代码
    package startup;
    
    import service.AirInfoImpl;
    import view.View;
    
    import java.util.Scanner;
    
    public class Main {
    public static void main(String[] args) throws Exception{
        View view = new View();
        AirInfoImpl service = new AirInfoImpl();
        Scanner input = new Scanner(System.in);
    
        view.welcome();
        p:while(true){
            int functionSelect = view.menu();
            switch (functionSelect){
                case 1:
                    service.findAll();
                    break;
    
                case 2:
                    System.out.println("请输入起飞日期,格式为:2000-01-01");
                    String flightDate = input.nextLine();
                    service.getByDepartDate(flightDate);
                    break;
    
                case 3:
                    System.out.println("请输入航班目的地,格式为:shanghai");
                    String des = input.nextLine();
                    service.getByDestination(des);
                    break;
    
                case 4:
                    System.out.println("请输入要删除航班的编号");
                    String idInput = input.nextLine();
                    int id = Integer.parseInt(idInput);
                    service.deleteById(id);
                    break;
    
                case 5:
                    System.out.println("请输入要更新航班的编号");
                    String updateIdString = input.nextLine();
                    int updateId = Integer.parseInt(updateIdString);
    
                    System.out.println("请输入新的航班号");
                    String updateNoString = input.nextLine();
    
                    System.out.println("请输入新的目的地,格式为:shanghai");
                    String updateDesString = input.nextLine();
    
                    System.out.println("请输入新的起飞日期,格式为:2000-01-01");
                    String updateFlightDateString = input.nextLine();
    
                    service.update(updateId,updateNoString,updateDesString,updateFlightDateString);
                    break;
                    
                case 6:
                    break p;
            }
        }
        input.close();
        view.exit();
        service.exitConnection();
    }
    }

在第七步中配置了配置文件dbconfig.xml。
特别需要注意的是,在dburl参数中添加了&serverTimezone=Asia/Shanghai这一项设置。
这一设置至关重要,从而确定了正确的时区范围。
如果不进行这一步操作,则会在更新数据库中的数据时间时导致错误

复制代码
    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>dbconfiginformation</comment>
    <entry key="password">123456</entry>
    <entry key="dburl">jdbc:mysql://localhost:3306/airline?&serverTimezone=Asia/Shanghai</entry>
    <entry key="username">root</entry>
    <entry key="driver">com.mysql.cj.jdbc.Driver</entry>
    </properties>

全部评论 (0)

还没有任何评论哟~