航班信息管理系统

项目背景:现在有一家航空公司为了提高用户体验,希望做一个航班信息系统,用户可以根据需求去对航班信息进行操作。组长把这个任务安排给了程序员赵丹,赵丹发现这里需要通过 java 代码操作数据库,并且用户是可以在控制台做对应的操作,JDBC 可以帮她解决这个问题。学习起来,试着把这个系统实现出来。

考察内容:sql语句的使用 + 使用 JDBC操作 MySQL + Dao模式

任务过程

  1. 创建数据库表 airinfo,添加测试数据不少于 4 条,要求主键自增。

  2. 创建实体类 AirInfo,根据业务提供需要的构造方法和 setter/getter方法。

  3. 创建 BaseDao 类,实现数据库连接和关闭功能。

  4. 创建 Dao 接口 AirInfoDao,定义查询所有航班,按日期和目的地查询航班,删除航班,更新航班的方法。

  5. 创建 Dao 实现类 AirInfoDaoImpl,继承BaseDao类,实现AirInfoDao接口,使用 JDBC 完成相应数据库操作。

  6. 创建 Main 类,完成在控制台显示留言信息和用户添加留言操作,启动和运行系统。

项目模块分析如图

1. db.properties文件配置

driver=com.mysql.cj.jdbc.Driver
uname=root
upass=root
url=jdbc:mysql://localhost:3306/kkb03

需要将文件放在src目录下

2. 导入jar包


这里用的是阿里出品,淘宝和支付宝专用数据库连接池——Druid(德鲁伊)连接池

数据库操作

1. 创建airinfo表

2. 插入数据

代码实现如下

1. AifInfo类

import java.util.Date;

// 航班实体类
public class AirInfo {private int id;private String number;private String destination;private Date date;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getDestination() {return destination;}public void setDestination(String destination) {this.destination = destination;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}
}

2. BaseDao工具类

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ResourceBundle;

// 工具类
public class BaseDao {// 1.定义变量private Connection connection;private PreparedStatement pps;private ResultSet resultSet;private int count;// 储存受影响的行数private static String dirverName;private static String url;private static String userName;private static String userPass;private static DruidDataSource druidDataSource = new DruidDataSource();// 阿里Druid连接池// 2.加载驱动static {/*** 阿里的数据库连接池* 性能最好的* Druid* (博主是阿里忠实粉丝)*/ResourceBundle bundle = ResourceBundle.getBundle("db");// 参数只写属性文件名即可,不需要写后缀dirverName = bundle.getString("driver");url = bundle.getString("url");userName = bundle.getString("uname");userPass = bundle.getString("upass");druidDataSource.setUsername(userName);druidDataSource.setPassword(userPass);druidDataSource.setUrl(url);druidDataSource.setDriverClassName(dirverName);druidDataSource.setTestWhileIdle(false);}// 3.获得链接protected Connection getConnection(){try {connection = druidDataSource.getConnection();} catch (SQLException throwables) {throwables.printStackTrace();}return connection;}// 4.得到预状态通道protected PreparedStatement getPps(String sql){try {pps = getConnection().prepareStatement(sql);} catch (SQLException throwables) {throwables.printStackTrace();}return pps;}// 5.绑定参数 (List保存的是给占位符所赋的值)protected void param(List list){if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {try {pps.setObject(i + 1, list.get(i));// 列的行数为i+1} catch (SQLException throwables) {throwables.printStackTrace();}}}}// 6.执行操作(增删改 + 查)public int update(String sql, List list){getPps(sql);param(list);try {count = pps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();}return count;}// 7.查询protected ResultSet query(String sql, List list){getPps(sql);param(list);try {resultSet = pps.executeQuery();} catch (SQLException throwables) {throwables.printStackTrace();}return resultSet;}// 8.关闭资源protected void closeAll(){try {if (resultSet != null) {resultSet.close();}if (pps != null) {pps.close();}if (connection != null) {connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}
}

3. AirInfoDao接口

// 将同一包下的子包中的类导入进来,这行代码需自行导包,不能直接复制

import mission.demo03.bean.AirInfo;

import java.util.List;

// Dao接口
public interface AirInfoDao {/*** 1.列出所有航班* @return*/public List<AirInfo> getAll();/*** 2.按起飞时间查询* @param date* @return*/public List<AirInfo> getByDate(String date);/*** 3.按目的地查询* @param destination* @return*/public List<AirInfo> getByDestination(String destination);/*** 4.删除航班* @param id* @return*/public Boolean delete(int id);/*** 5.更新航班* @param id* @return*/public Boolean update(int id, String newNumber, String newDestination, String newDate);/*** 6.离开系统*/public void bye();/*** 根据编号查找航班* @param id* @return*/public AirInfo getById(int id);
}

4. AirInfoDaoImpl实现类

// 将同一包下的子包中的类导入进来,这三行代码需自行导包,不能直接复制

import mission.demo03.bean.AirInfo;
import mission.demo03.dao.AirInfoDao;
import mission.demo03.util.BaseDao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

// Dao实现类
public class AirInfoDaoImpl extends BaseDao implements AirInfoDao {/*** 1.列出所有航班* @return*/@Overridepublic List<AirInfo> getAll() {List<AirInfo> airInfoList = new ArrayList<>();try {String sql = "select * from airinfo";List list = new ArrayList();ResultSet rs = query(sql, list);while (rs.next()) {AirInfo airInfo = new AirInfo();airInfo.setId(rs.getInt("id"));airInfo.setNumber(rs.getString("number"));airInfo.setDestination(rs.getString("destination"));airInfo.setDate(rs.getDate("date"));airInfoList.add(airInfo);}return airInfoList;} catch (SQLException throwables) {throwables.printStackTrace();}finally {closeAll();}return null;}/*** 2.按起飞时间查询* @param date* @return*/@Overridepublic List<AirInfo> getByDate(String date) {try {String sql = "select * from airinfo where date = ?";List list = new ArrayList();list.add(date);List<AirInfo> airInfoList = new ArrayList<>();ResultSet rs = query(sql, list);while (rs.next()){AirInfo airInfo = new AirInfo();airInfo.setId(rs.getInt("id"));airInfo.setNumber(rs.getString("number"));airInfo.setDestination(rs.getString("destination"));airInfo.setDate(rs.getDate("date"));airInfoList.add(airInfo);}return airInfoList;} catch (SQLException throwables) {throwables.printStackTrace();} finally {closeAll();}return null;}/*** 3.按目的地查询* @param destination* @return*/@Overridepublic List<AirInfo> getByDestination(String destination) {try {String sql = "select * from airinfo where destination = ?";List list = new ArrayList();list.add(destination);List<AirInfo> airInfoList = new ArrayList<>();ResultSet rs = query(sql, list);while (rs.next()){AirInfo airInfo = new AirInfo();airInfo.setId(rs.getInt("id"));airInfo.setNumber(rs.getString("number"));airInfo.setDestination(rs.getString("destination"));airInfo.setDate(rs.getDate("date"));airInfoList.add(airInfo);}return airInfoList;} catch (SQLException throwables) {throwables.printStackTrace();} finally {closeAll();}return null;}/*** 4.删除航班* @param id* @return*/@Overridepublic Boolean delete(int id) {String sql = "delete from airinfo where id = ?";List list = new ArrayList();list.add(id);int result = update(sql,list);if (result != 0){return true;}elsereturn false;}/*** 5.更新航班* @param id* @param newNumber* @param newDestination* @param newDate* @return*/@Overridepublic Boolean update(int id, String newNumber, String newDestination, String newDate) {String sql = "update airinfo set number = ?, destination = ?, date = ? where id = ?";List list = new ArrayList();list.add(newNumber);list.add(newDestination);list.add(newDate);list.add(id);int result = update(sql,list);if (result == 1){return true;}elsereturn false;}/*** 6.离开系统*/@Overridepublic void bye() {System.out.println("--------感谢您的使用 再见!--------");System.exit(0);}/*** 根据编号查找航班* @param id* @return*/@Overridepublic AirInfo getById(int id) {AirInfo airInfo = new AirInfo();try {String sql = "select * from airinfo where id = ?";List list = new ArrayList();list.add(id);ResultSet rs = query(sql,list);while (rs.next()){airInfo.setId(rs.getInt("id"));airInfo.setNumber(rs.getString("number"));airInfo.setDestination(rs.getString("destination"));airInfo.setDate(rs.getDate("date"));}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return airInfo;}
}

5. AirView类

// 将同一包下的子包中的类导入进来,这三行代码需自行导包,不能直接复制

import mission.demo03.bean.AirInfo;
import mission.demo03.dao.impl.AirInfoDaoImpl;
import mission.demo03.exception.OutNumberBoundException;

import java.util.List;
import java.util.Scanner;

//视图展示的view
public class AirView {private Scanner sc = new Scanner(System.in);private AirInfoDaoImpl airInfoDao = new AirInfoDaoImpl();private AirInfo airInfo = new AirInfo();public int menu(){welcome();int num = 0;system:while (true) {System.out.println("请选择操作(1.列出所有航班,2.按起飞时间查询,3.按目的地查询,4.删除航班,5.更新航班,6.离开系统):");String input = sc.next();try {num = validNum(input, 1, 6);switch (num) {case 1:doGetAll();break;case 2:doGetByDate();break;case 3:doGetByDestination();break;case 4:doDelete();break;case 5:doUpdate();break;case 6:doBye();break system;}} catch (NumberFormatException | OutNumberBoundException e) {System.out.println(e.getMessage());}}return num;}/*** 欢迎界面*/private void welcome(){System.out.println("--------欢迎使用航班信息管理系统--------");}/*** 判断输入的数字是否正确* @param s* @param begin* @param end* @return* @throws NumberFormatException* @throws OutNumberBoundException*/private 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("输入的必须是数字!");}}/*** 根据编号查找航班* @param id* @return*/private int doGetById(int id){AirInfo airInfo = airInfoDao.getById(id);int num = airInfo.getId();return num;}/*** 打印信息* @param airInfoList*/private void printAll(List<AirInfo> airInfoList){if (airInfoList != null && airInfoList.size() != 0) {System.out.println("编号\t\t航班号\t\t目的地\t\t起飞日期");for (AirInfo airInfo : airInfoList) {System.out.println(airInfo.getId() + "\t\t" + airInfo.getNumber()+ "\t\t\t" + airInfo.getDestination() + "\t\t\t" + airInfo.getDate());}}else {System.out.println("暂无相关航班信息!");}}/*** 列出所有航班*/private void doGetAll() {List<AirInfo> airInfoList = airInfoDao.getAll();printAll(airInfoList);}/*** 按起飞时间查询*/private void doGetByDate() {System.out.print("请输入日期:");String input = sc.next();List<AirInfo> airInfoList = airInfoDao.getByDate(input);printAll(airInfoList);}/*** 按目的地查询*/private void doGetByDestination() {System.out.print("请输入目的地:");String input = sc.next();List<AirInfo> airInfos = airInfoDao.getByDestination(input);printAll(airInfos);}/*** 删除航班*/private void doDelete() {System.out.print("请输入需要删除的航班编号:");int input = sc.nextInt();boolean flag = airInfoDao.delete(input);if (flag == true){System.out.println("删除成功!");} else {System.out.println("该航班信息不存在!");}}/*** 更新航班*/private void doUpdate() {while (true) {System.out.print("请输入需要更新的航班编号:");int input = sc.nextInt();if (doGetById(input) == 0){System.out.println("不存在该航班信息!");break;}System.out.print("请输入新的航班号:");String newNumber = sc.next();System.out.print("请输入新的目的地:");String newDes = sc.next();System.out.print("请输入新的起飞日期:");String newDate = sc.next();boolean flag = airInfoDao.update(input, newNumber, newDes, newDate);if (flag == true){System.out.println("更新成功!");break;} else {System.out.println("操作失败!请检查您的输入");}break;}}/*** 离开系统*/private void doBye() {airInfoDao.bye();}
}

6. Exception自定义异常类

// 自定义异常类
public class OutNumberBoundException extends RuntimeException{public OutNumberBoundException(String s) {super(s);}
}

7. Main类

// 将同一包下的子包中的类导入进来,这行代码需自行导包,不能直接复制

import mission.demo03.view.AirView;

public class Main {public static void main(String[] args) {AirView airView = new AirView();airView.menu();}
}

潜在问题

在执行程序后第一次使用Druid连接池连接数据库的时候会看到这个异常,但并不影响程序的执行,就是一个数据源的初始化。

航班管理系统(MySQL+JDBC)相关推荐

  1. mysql员工管理系统_简单的员工管理系统(Mysql+jdbc+Servlet+JSP)

    java java8 java开发 简单的员工管理系统(Mysql+jdbc+Servlet+JSP) 员工管理系统 因为学业要求,需要完成一个过关检测,但是因为检测之前没有做好准备,且想到之前用my ...

  2. Java实训之航空航班管理系统(连接MySQL数据库)

    Plane对象: 在Plane对象里定义了飞机的编号id.航班号.目的地.起飞日期.生成了构造方法和toString()方法:以及getting()和setting()方法,但在程序里没用到. pac ...

  3. jsp员工管理系统mysql_简单的员工管理系统(Mysql+jdbc+Servlet+JSP)

    员工管理系统 因为学业要求,需要完成一个过关检测,但是因为检测之前没有做好准备,且想到之前用mysql+jdbc+Struts2+bootstrap做成了一个ATM系统(主要有对数据的增删改查操作), ...

  4. 「会员卡管理系统」 · Java Swing + MySQL JDBC开发

    目录 目录 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 >>>实现代码: 数据库 com.ynavc.Bean com.yn ...

  5. MYSQL JDBC图书管理系统

    两万字,博主辛辛苦苦给大家写的,在这里求个三连~~. JDBC编程 一.JDBC简介 二.准备工作 三.JDBC五毒神掌 3.1导入驱动包,创建DataBase实例 四.加入SQL版的数据库 4.1系 ...

  6. 员工管理系统之mysql_简单的员工管理系统(Mysql+jdbc+Servlet+JSP)

    员工管理系统 由于学业要求,须要完成一个过关检测,可是由于检测以前没有作好准备,且想到以前用mysql+jdbc+Struts2+bootstrap作成了一个ATM系统(主要有对数据的增删改查操做), ...

  7. 「物流跟踪管理系统」 · Java Swing + MySQL JDBC开发,美和易思结业考试机试试题

    目录 文档说明: 一.语言和环境 二.技术要求 三.功能要求 四.数据库设计 五.具体要求及推荐实现步骤 六.注意事项 实现代码: 一.数据库 二.Java Swing com.ynavc.Bean ...

  8. java银行管理系统(MySql+JDBC+数据库(Druid数据库连接池)+GUI)重要代码有解析注释

    java银行管理系统 小白又来水博客了 文章目录 java银行管理系统 一.项目需求与分析: 二.知识及有关技术的概述: 三.银行管理系统需求的具体实现: 四.部分功能预览: 五.Last: 一.项目 ...

  9. 「超市管理系统——商品管理」 · Java Swing + MySQL JDBC开发

    项目下载:超市管理系统JavaSwing+MySQLJDBC开发_javamysql超市管理系统-互联网文档类资源-CSDN下载 1.9元付费赞助下载:超市管理系统JavaSwing+MySQLJDB ...

最新文章

  1. 科学家王海峰:从百度十篇论文入选ACL 2019说起
  2. linux以16进制查看文件
  3. 配置apache虚拟主机
  4. 【转】蓝牙物理链路类型:SCO和ACL链路
  5. hdu 1028 Ignatius and the Princess III 母函数入门
  6. 打开储存在服务器的文件,云服务器储存文件
  7. 华为机试HJ30:字符串合并处理
  8. Guava学习笔记之Maps(1):Maps.uniqueIndex(Iterable, Function)
  9. 舞蹈工作室舞蹈课程预约小程序开发制作
  10. 入坑张银奎老师研发的GDK7
  11. Deep Light Enhancement without Paired Supervision (非配对数据监督学习用于低曝光图像增强)
  12. 通达信插件获取并存储通达信商品指数的实时数据
  13. L1、L2正则VS L1、L2 loss
  14. NeatUpload 网络上传大文件的web.config配置问题
  15. Layer 父窗口如何获得子窗口的标签元素值
  16. 三菱Qplc.QD75Mh4触摸屏及plc程序,光纤伺服通讯
  17. 创业元老崔姗姗回归背后,百度变革进入深水区
  18. v-chart大小无法控制
  19. matlab 在线帮助,matlab中文帮助文档【荐】.pdf
  20. 如何把caj文档免费转换成Word格式

热门文章

  1. 将i am biter 逆置为:biter am i 函数原型:
  2. 两位数乘法的速算方法(三)
  3. 使用模块框分角色权限
  4. Laya Socket
  5. 台达PLC modbus通讯地址
  6. arcsde for mysql_手工创建ArcSDE for sqlserver库
  7. 订单30分钟未支付自动取消怎么实现
  8. 小故事.....有道理、、、
  9. docker中的Volume
  10. CY7C68013A 使用keil 5 c51 开发