与之前的航班管理系统相似,但是更方面都做了优化更新,同时连接数据库操作。主要完成航班信息的增删改查,应用技术大概有,单例模式、懒汉模式、dom4j解析、IO流操作、数据库封装操作等等。
手敲视频链接如下:因为也是第一次,所以时间有点长。
https://pan.baidu.com/s/1xHXm0Wd8otUqyIsLwnfhzw
提取码:nggj
源码如下:
项目结构如图:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="flightDao" class="com.biubiubiu.FlightsManagement.dao.impl.FlightDaoImpl"></bean>
<bean id="flightService" class="com.biubiubiu.FlightsManagement.service.impl.FlightServiceImpl">
<property name="flightDao" ref="flightDao"></property>
</bean>
<bean id="flightAction" class="com.biubiubiu.FlightsManagement.action.FlightAction">
<property name="flightService" ref="flightService"></property>
</bean>
</beans>
DataBase.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/flight
username=root
password=root
flights.txt
空
flights.xml
<?xml version="1.0" encoding="utf-8"?>
<flights>
<flight flightNo="A1234">
<departureCity>北京</departureCity>
<arrivalCity>南京</arrivalCity>
<departureTime>2019-06-06 20:30:00</departureTime>
<arrivalTime>2019-06-06 22:30:00</arrivalTime>
</flight>
<flight flightNo="CA1357">
<departureCity>苏州</departureCity>
<arrivalCity>长春</arrivalCity>
<departureTime>2019-06-06 20:30:00</departureTime>
<arrivalTime>2019-06-06 21:00:00</arrivalTime>
</flight>
<flight flightNo="CA2468">
<departureCity>长春</departureCity>
<arrivalCity>北京</arrivalCity>
<departureTime>2019-06-06 21:30:00</departureTime>
<arrivalTime>2019-06-06 22:30:00</arrivalTime>
</flight>
<flight flightNo="CA2469">
<departureCity>北京</departureCity>
<arrivalCity>长春</arrivalCity>
<departureTime>2019-06-06 21:30:00</departureTime>
<arrivalTime>2019-06-06 22:30:00</arrivalTime>
</flight>
<flight flightNo="CA1234">
<departureCity>苏州</departureCity>
<arrivalCity>辽源</arrivalCity>
<departureTime>2019-09-08 09:55:00</departureTime>
<arrivalTime>2019-09-08 14:55:00</arrivalTime>
</flight>
<flight flightNo="CA5775">
<departureCity>上海</departureCity>
<arrivalCity>长春</arrivalCity>
<departureTime>2019-09-08 11:55:00</departureTime>
<arrivalTime>2019-09-08 13:35:00</arrivalTime>
</flight>
<flight flightNo="CA6789">
<departureCity>北京</departureCity>
<arrivalCity>三亚</arrivalCity>
<departureTime>2019-09-26 14:00:00</departureTime>
<arrivalTime>2019-09-26 18:00:00</arrivalTime>
</flight>
<flight flightNo="CA5676">
<departureCity>北京</departureCity>
<arrivalCity>上海</arrivalCity>
<departureTime>2019-09-30 12:55:00</departureTime>
<arrivalTime>2019-09-30 14:55:00</arrivalTime>
</flight>
<flight flightNo="CA5677">
<departureCity>北京</departureCity>
<arrivalCity>上海</arrivalCity>
<departureTime>2019-10-01 11:55:00</departureTime>
<arrivalTime>2019-10-01 13:55:00</arrivalTime>
</flight>
<flight flightNo="CA5678">
<departureCity>北京</departureCity>
<arrivalCity>上海</arrivalCity>
<departureTime>2019-10-01 13:55:00</departureTime>
<arrivalTime>2019-10-01 15:55:00</arrivalTime>
</flight>
</flights>
Flight.java
package com.biubiubiu.FlightsManagement.entity;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Flight {
private String flightNo;
private String departureCity;
private Date departureTime;
private String arrivalCity;
private Date arrivalTime;
}
BaseDao.java
package com.biubiubiu.FlightsManagement.dao;
/**
* 数据库数据的操作
* @author 11142
*
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.biubiubiu.FlightsManagement.Util.ConfigManager;
public class BaseDao {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
/**
* 获取数据库连接
* @return
*/
public boolean getConnection() {
try {
Class.forName(ConfigManager.getInstance().getString("driver"));
String url = ConfigManager.getInstance().getString("url");
String username = ConfigManager.getInstance().getString("username");
String password = ConfigManager.getInstance().getString("password");
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 实现数据库的增删改
* @param sql 需要传入sql语句
* @param params 需要传入Object数组
* @return 返回的是修改的行数
*/
public int executeUpdate(String sql, Object[] params) {
int updateRows = 0;
if(getConnection()) {
try {
pstmt = conn.prepareStatement(sql);
for(int i=0; i<params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
updateRows = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
return updateRows;
}
/**
* 数据库的查询操作
* @param sql
* @param params
* @return
*/
public ResultSet executeQuery(String sql, Object[] params) {
if(getConnection()) {
try {
pstmt = conn.prepareStatement(sql);
for(int i=0; i<params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
rs = pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
}
return rs;
}
/**
* 操作完需要释放资源
* @return
*/
public boolean closeRes() {
try {
if (rs != null) {
rs.close();
}
if(pstmt != null) {
pstmt.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
}
FlightDao.java
package com.biubiubiu.FlightsManagement.dao;
import java.util.List;
import com.biubiubiu.FlightsManagement.entity.Flight;
public interface FlightDao {
/**
* 获取数据库连接
* @return
*/
boolean getConnection();
/**
* 显示所有航班信息(起飞时间升序显示)
* @return
*/
List<Flight> showAllFlight();
/**
* 添加航班信息
* @param flight
* @return
*/
boolean addFlight(Flight flight);
/**
* 删除航班信息
* @param flight
* @return
*/
boolean deleteFlight(Flight flight);
/**
* 保存到XML文件
*/
void saveXML();
/**
* 保存查询结果到TXT文件
* @param info
*/
void saveTXT(String info);
}
FlightDaoImpl.java
package com.biubiubiu.FlightsManagement.dao.impl;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import com.biubiubiu.FlightsManagement.Util.Utils;
import com.biubiubiu.FlightsManagement.dao.BaseDao;
import com.biubiubiu.FlightsManagement.dao.FlightDao;
import com.biubiubiu.FlightsManagement.entity.Flight;
/**
* 数据操作
*
* @author 11142
*
*/
public class FlightDaoImpl extends BaseDao implements FlightDao {
@Override
public List<Flight> showAllFlight() {
List<Flight> flightList = new ArrayList<Flight>();
try {
String sql = "SELECT flightno, departureCity, arrivalCity, departureTime, arrivalTime FROM flight ORDER BY departureTime";
Object[] params = {};
ResultSet rs = executeQuery(sql, params);
while (rs.next()) {
String flightNo = rs.getString("flightNo");
String departureCity = rs.getString("departureCity");
Timestamp departureTime = rs.getTimestamp("departureTime");
String arrivalCity = rs.getString("arrivalCity");
Timestamp arrivalTime = rs.getTimestamp("arrivalTime");
Flight flight = new Flight(flightNo, departureCity, departureTime, arrivalCity, arrivalTime);
flightList.add(flight);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeRes();// 释放资源
}
return flightList;
}
@Override
public boolean addFlight(Flight flight) {
boolean result = false;
try {
String sql = "INSERT INTO flight(flightno, departureCity, arrivalCity, departureTime, arrivalTime) VALUES(?,?,?,?,?)";
Object[] params = { flight.getFlightNo(), flight.getDepartureCity(), flight.getArrivalCity(),
flight.getDepartureTime(), flight.getArrivalTime() };
int rows = executeUpdate(sql, params);
if (rows > 0) {
result = true;
}
} finally {
closeRes();
}
return result;
}
@Override
public boolean deleteFlight(Flight flight) {
boolean result = false;
try {
String sql = "DELETE FROM flight WHERE flightno=?";
Object[] params = { flight.getFlightNo() };
int rows = executeUpdate(sql, params);
if (rows > 0) {
result = true;
}
} finally {
closeRes();
}
return result;
}
@Override
public void saveXML() {
try {
InputStream is = FlightDaoImpl.class.getClassLoader().getResourceAsStream("flights.xml");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(is);
Element root = document.getRootElement();
List<Element> elements = root.elements();
for (Element element : elements) {
element.getParent().remove(element);
}
List<Flight> list = showAllFlight();
for (Flight flight : list) {
Element element = root.addElement("flight");
element.addAttribute("flightNo", flight.getFlightNo());
element.addElement("departureCity").setText(flight.getDepartureCity());
element.addElement("arrivalCity").setText(flight.getArrivalCity());
element.addElement("departureTime").setText(Utils.dateToStr(flight.getDepartureTime()));
element.addElement("arrivalTime").setText(Utils.dateToStr(flight.getArrivalTime()));
}
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
String path = "E:\\JAVA\\JAVA_WorkSpace\\KGC_Senior\\Senior1110\\src\\main\\resources\\flights.xml";
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path)),format);
writer.write(document);
writer.close();
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void saveTXT(String info) {
File file = new File("E:\\JAVA\\JAVA_WorkSpace\\KGC_Senior\\Senior1110\\src\\main\\resources\\flights.txt");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file, true);
String str = info + "\n";
byte[] bytes = str.getBytes();
fos.write(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FlightService.java
package com.biubiubiu.FlightsManagement.service;
import java.util.List;
import com.biubiubiu.FlightsManagement.entity.Flight;
/**
* 业务管理
* @author 11142
*
*/
public interface FlightService {
/**
* 显示所有航班信息(起飞时间升序显示)
* @return
*/
List<Flight> showAllFlight();
/**
* 添加航班信息
* @param flight
* @return
*/
String addFlight(Flight flight);
/**
* 删除航班信息
* @param flight
* @return
*/
String deleteFlight(Flight flight);
/**
* 保存到XML文件
*/
void saveXML();
/**
* 保存查询结果到TXT文件
* @param info
*/
void saveTXT(String info);
}
FlightServiceImpl.java
package com.biubiubiu.FlightsManagement.service.impl;
import java.util.List;
import com.biubiubiu.FlightsManagement.dao.FlightDao;
import com.biubiubiu.FlightsManagement.entity.Flight;
import com.biubiubiu.FlightsManagement.service.FlightService;
public class FlightServiceImpl implements FlightService{
private FlightDao flightDao;
@Override
public List<Flight> showAllFlight() {
List<Flight> flightList = flightDao.showAllFlight();
return flightList;
}
@Override
public String addFlight(Flight flight) {
flightDao.addFlight(flight);
return "添加成功~";
}
@Override
public String deleteFlight(Flight flight) {
flightDao.deleteFlight(flight);
return "删除成功~";
}
@Override
public void saveXML() {
flightDao.saveXML();
}
@Override
public void saveTXT(String info) {
flightDao.saveTXT(info);
}
}
FlightAction.java
package com.biubiubiu.FlightsManagement.action;
/**
* 界面处理
* @author 11142
*
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.biubiubiu.FlightsManagement.Util.Utils;
import com.biubiubiu.FlightsManagement.entity.Flight;
import com.biubiubiu.FlightsManagement.service.FlightService;
public class FlightAction {
private FlightService flightService;
public void menu() {
Scanner sc = new Scanner(System.in);
System.out.println("1.显示所有航班信息(起飞时间升序显示)");
System.out.println("2.查询航班(起飞时间升序显示)");
System.out.println("3.添加航班");
System.out.println("4.删除航班");
System.out.println("0.退出");
System.out.print("请输入>>>");
try {
int n = sc.nextInt();
switch (n) {
case 1:
// 1.显示所有航班信息(起飞时间升序显示)
showAllFlight();
break;
case 2:
// 2.查询航班(起飞时间升序显示)
queryFlight();
break;
case 3:
// 3.添加航班
addFlight();
break;
case 4:
// 4.删除航班
deleteFlight();
break;
case 0:
// 0.退出
if (exit()) {
return;
}
break;
default:
System.out.println("您的输入有误~");
}
} catch (Exception e) {
System.out.println("您的操作有误~");
}
menu();
}
/**
* 1.显示所有航班信息(起飞时间升序显示)
*/
public void showAllFlight() {
List<Flight> flightList = flightService.showAllFlight();
if (flightList.isEmpty()) {
System.out.println("暂时没有航班信息~");
} else {
for (Flight flight : flightList) {
System.out.println("航班编号:" + flight.getFlightNo() + " " + flight.getDepartureCity() + " - "
+ flight.getArrivalCity() + " " + flight.getDepartureTime() + " - " + flight.getArrivalTime());
}
}
System.out.println();
}
/**
* 2.查询航班(起飞时间升序显示)
*/
public void queryFlight() {
boolean flag = false;
Scanner sc = new Scanner(System.in);
System.out.print("请输入起飞城市:");
String departureCity = sc.nextLine();
System.out.print("请输入到达城市:");
String arrivalCity = sc.nextLine();
List<Flight> flightList = flightService.showAllFlight();
List<String> list = new ArrayList<String>();
String info = "";
for(int i=0; i<flightList.size(); i++) {
if(flightList.get(i).getDepartureCity().equals(departureCity) && flightList.get(i).getArrivalCity().equals(arrivalCity)) {
flag = true;
System.out.println("查询结果如下:");
info = "航班编号:" + flightList.get(i).getFlightNo() + " " + flightList.get(i).getDepartureCity() + " - "
+ flightList.get(i).getArrivalCity() + " " + flightList.get(i).getDepartureTime() + " - " + flightList.get(i).getArrivalTime();
System.out.println(info);
list.add(info);
}
}
if(!flag) {
System.out.println("没有找到符合条件的航班~");
}else {
System.out.print("按任意键继续...");
String goOn = sc.next();
System.out.print("请问是否要将查询结果导出到txt文件(y-保存/任意键-不保存):");
String s = sc.next();
if(s.equalsIgnoreCase("y")) {
for (String string : list) {
flightService.saveTXT(string);
}
System.out.println("导出成功,文件在src\\main\\resources\\flights.txt");
}
}
System.out.println();
}
/**
* 3.添加航班
*/
public void addFlight() {
boolean flag = false;
Scanner sc = new Scanner(System.in);
System.out.print("请输入航班编号:");
String flightNo = sc.nextLine();
System.out.print("起飞城市:");
String departureCity = sc.nextLine();
System.out.print("起飞时间(格式:2019-11-10 00:00:00):");
String departureTime = sc.nextLine();
System.out.print("到达城市:");
String arrivalCity = sc.nextLine();
System.out.print("到达时间(格式:2019-11-10 00:00:00):");
String arrivalTime = sc.nextLine();
List<Flight> list = flightService.showAllFlight();
for(int i=0; i<list.size(); i++) {
if(list.get(i).getFlightNo().equals(flightNo)) {
flag = true;
System.out.println("添加失败,航班编号重复~");
break;
}
}
if(!flag) {
Flight flight = new Flight(flightNo, departureCity, Utils.strToDate(departureTime), arrivalCity, Utils.strToDate(arrivalTime));
System.out.println(flightService.addFlight(flight));
}
System.out.println();
}
/**
* 4.删除航班
*/
public void deleteFlight() {
boolean flag = false;
Scanner sc = new Scanner(System.in);
System.out.print("请输入需要删除的航班编号:");
String flightNo = sc.nextLine();
List<Flight> list = flightService.showAllFlight();
for(int i=0; i<list.size(); i++) {
if(list.get(i).getFlightNo().equals(flightNo)) {
flag = true;
System.out.println(flightService.deleteFlight(list.get(i)));
break;
}
}
if(!flag) {
System.out.println("删除失败,航班编号不存在~");
}
System.out.println();
}
/**
* 退出
*
* @return
*/
public boolean exit() {
System.out.println("确认要退出吗?(y/任意键返回)");
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
if (s1.equalsIgnoreCase("y")) {
System.out.print("是否保存更新XML文件?(y-保存/任意键-不保存):");
String s2 = sc.nextLine();
if(s2.equalsIgnoreCase("y")) {
flightService.saveXML();
System.out.println("已成功保存XML文件~");
}
System.out.println("程序退出成功~");
return true;
} else {
System.out.println("取消退出,程序继续运行~");
return false;
}
}
}
Test.java
package com.biubiubiu.FlightsManagement.test;
import com.biubiubiu.FlightsManagement.Util.BeanUtil;
import com.biubiubiu.FlightsManagement.action.FlightAction;
/**
* 测试程序运行
* @author 11142
*
*/
public class Test {
public static void main(String[] args) {
FlightAction flightAction = BeanUtil.getInstance("flightAction");
flightAction.menu();
}
}
工具类
Bean.java
package com.biubiubiu.FlightsManagement.Util;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Bean {
private String id;
private String classname;
private Map<String, String> propertyList = new HashMap<String, String>();
}
BeanUtil.java
package com.biubiubiu.FlightsManagement.Util;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class BeanUtil {
static Map<String, Bean> map = new HashMap<String, Bean>();
static Map<String, Object> objMap = new HashMap<String, Object>();
static {
try {
InputStream is = BeanUtil.class.getClassLoader().getResourceAsStream("applicationContext.xml");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(is);
Element root = document.getRootElement();
List<Element> elements = root.elements();
for (Element element : elements) {
String id = element.attributeValue("id");
String classname = element.attributeValue("class");
List<Element> propertiesList = element.elements();
Map<String, String> properties = new HashMap<String, String>();
for (Element element2 : propertiesList) {
String attname = element2.attributeValue("name");
String value = element2.attributeValue("ref");
properties.put(attname, value);
}
Bean bean = new Bean(id, classname, properties);
map.put(id, bean);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static <E> E getInstance(String key) {
E obj = null;
try {
if (objMap.containsKey(key)) {
obj = (E) objMap.get(key);
} else {
Bean bean = map.get(key);
Class clazz = Class.forName(bean.getClassname());
obj = (E) clazz.newInstance();
Map<String, String> properties = bean.getPropertyList();
if(!properties.isEmpty()) {
for(String attribute : properties.keySet()) {
Field field = clazz.getDeclaredField(attribute);
field.setAccessible(true);
field.set(obj, getInstance(properties.get(attribute)));
}
}
objMap.put(key, obj);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return obj;
}
}
ConfigManager.java
package com.biubiubiu.FlightsManagement.Util;
/**
* 读取数据库属性文件,获取数据库连接的信息
* @author 11142
*
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
private static ConfigManager configManager;//用懒汉模式
private Properties properties;
/**
* 构造函数中读取配置文件
*/
public ConfigManager() {
String configFile = "DataBase.properties";
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 用synchronized是为了防止线程不安全
* @return
*/
public static synchronized ConfigManager getInstance() {
if(configManager == null) {
configManager = new ConfigManager();
}
return configManager;
}
public String getString(String key) {
return properties.getProperty(key);
}
}
Utils.java
package com.biubiubiu.FlightsManagement.Util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Utils {
/**
* 字符串转日期
* @param str
* @return
*/
public static Date strToDate(String str) {
Date date = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date = format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static String dateToStr(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = format.format(date);
return str;
}
}