一、前言
这是本学期我的课程设计最早编写出的版本,主要是通过Java语言实现对MySQL数据库的调用,完成对数据库中数据的增、删、改、查。在这里难点是连接数据库和数据库操作,需要有一定的Java语言基础和SQL语言基础。
二、数据结构描述
2.1 数据结构和存储结构
1.ArrayList
ArrayList是一个数组队列,相当于动态数组。相比于Java中的数组,它的容量能动态增长。ArrayList继承了AbstractList,实现了List。提供了相关的添加、删除、修改、遍历等功能。在ArrayList中,可以通过元素的序号快速获取元素对象;动态数组底层是基于数组来实现容量大小变化的线性数据结构,数组是用于储存多个相同类型数据的集合。数组的顺序存储结构,在逻辑上相邻的两个元素,他们的物理位置也是相邻的,即线性关系利用物理上的相邻关系来体现,并且不需要为数组中元素之间的逻辑关系而增加额外的存储空间。在加入数据是不需要考虑数组的长度大学,但是在输出时采用循环输出的方式,具有更高的效率。
2.2 主要算法
1.Sort排序
是改进的快速排序算法。用于对list中的元素进行排序,并返回一个list,默认的排序方法是根据字符串Unicode码。在本系统中用sort排序根据球员的年龄或者表现评级从大到小的排序。
2.顺序查找
顺序查找算法是按照序列原有顺序对数组进行遍历比较查询的基本算法。
注:由于这个版本涉及到数据库的连接与使用,所以在数据结构和算法上有所减少。更多的操作是用SQL语言实现。
三、重要的代码部分
1.数据库连接
private static final String DROVER_NAME="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost/PLAYER";
private static final String USER="root";
private static final String PASS="root";
public static Connection getCon() throws ClassNotFoundException,
SQLException{
Connection con=null;
Class.forName(DROVER_NAME);
con= DriverManager.getConnection(URL,USER,PASS);
return con;
}
public static void close(Connection con, Statement stmt, ResultSet rs){
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
在连接数据库之前需要在lib包下加入mysql-connector-java-5.1.38.jar文件。
在这里建议将DROVER_NAME、URL、USER、PASS单独定义,这样可以减少getCon()中的代码复杂程度,并且可以便于问题的修改。URL的形式是jdbc:mysql://localhost/数据库名称
这里定义一个close()用于关闭数据库的连接,在这里建立之后可以减少后续代码编写中要关闭数据库连接的代码长度。
2.数据库的操作
这里使用添加球员为例
public boolean add(Player player){
String sql="insert into player(P_ID,P_NAME,P_SEX,P_AGE,P_CLASS,P_PHONE,P_PERFORMANCE,P_GRADE) values(?,?,?,?,?,?,?,?)";
try{
con = DBUtil.getCon();
pstmt=con.prepareStatement(sql);
pstmt.setString(1, player.getID());
pstmt.setString(2, player.getNAME());
pstmt.setString(3, player.getSEX());
pstmt.setInt(4, player.getAGE());
pstmt.setString(5, player.getCLASS());
pstmt.setString(6, player.getPHONE());
pstmt.setString(7, player.getPERFORMANCE());
pstmt.setString(8, player.getGRADE());
pstmt.executeUpdate();
}catch (ClassNotFoundException e){
e.printStackTrace();
return false;
}catch (SQLException e){
e.printStackTrace();
return false;
}finally {
DBUtil.close(con,pstmt,rs);
}
return true;
}
首先是定义sql语句 intsert into 表名(属性) values(属性值),属性有几个属性值处就有几个问号,之后就是连接数据库和执行sql语句。注意:数据库的连接和操作都要在try-catch-finally下执行,可以方便找出错误。第一行 con=DBUtil.getCon()是连接数据,第二句 pstmt=con.prepareStatement(sql)是执行的sql语句,之后的就是获取球员信息使用setString和setInt获得球员相应的属性值,最后就用executeUpdate()更新数据库信息。
四、完整的代码
1.球员类 Player.java
package Player;/*
@Author :张鹏翔
@Date :Creater in 18:36 2021/10/23
实体类,封装球员信息
*/
public class Player {
private String ID; //球员编号
private String NAME; //球员姓名
private String SEX; //球员性别
private Integer AGE; //球员的年龄
private String CLASS; //球员班级
private String PHONE; //球员手机号
private String PERFORMANCE; //球员表现
private String GRADE; //球员评级
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getNAME() {
return NAME;
}
public void setNAME(String NAME) {
this.NAME = NAME;
}
public String getSEX() {
return SEX;
}
public void setSEX(String SEX) {
this.SEX = SEX;
}
public int getAGE() {
return AGE;
}
public void setAGE(Integer AGE) {
this.AGE = AGE;
}
public String getCLASS() {
return CLASS;
}
public void setCLASS(String CLASS) {
this.CLASS = CLASS;
}
public String getPHONE() {
return PHONE;
}
public void setPHONE(String PHONE) {
this.PHONE = PHONE;
}
public String getPERFORMANCE() {
return PERFORMANCE;
}
public void setPERFORMANCE(String PERFORMANCE) {
this.PERFORMANCE = PERFORMANCE;
}
public String getGRADE() {
return GRADE;
}
public void setGRADE(String GRADE) {
this.GRADE = GRADE;
}
//无参构造函数
public Player(){
super();
}
//有参构造函数
public Player(String ID,String NAME,String SEX,Integer AGE,String CLASS,String PHONE,String PERFORMANCE,String GRADE){
super();
this.ID=ID;
this.NAME=NAME;
this.SEX=SEX;
this.AGE=AGE;
this.CLASS=CLASS;
this.PHONE=PHONE;
this.PERFORMANCE=PERFORMANCE;
this.GRADE=GRADE;
}
}
定义球员的属性,生成相应的set()和get()方法,最后要有两个构造函数。
2.数据库的连接 DBUtil.java
package Player;/*
@Author :张鹏翔
@Date :Creater in 19:01 2021/10/23
*/
import java.sql.*;
public class DBUtil {
private static final String DROVER_NAME="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost/PLAYER";
private static final String USER="root";
private static final String PASS="root";
public static Connection getCon() throws ClassNotFoundException,
SQLException{
Connection con=null;
Class.forName(DROVER_NAME);
con= DriverManager.getConnection(URL,USER,PASS);
return con;
}
public static void close(Connection con, Statement stmt, ResultSet rs){
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.对球员相应功能的封装 PlayerDaoImpl.java
package Player;
import java.util.List;
public interface PlayerDaoImpl {
public boolean add(Player player);
public List<Player> list();
public Player findSomeone(String ID);
public boolean update(Player player);
public boolean del(String ID);
}
这里将这些功能封装可以更好的编写各个功能的具体内容,可以让编程人员更好的了解系统的功能,以及能够在修改和维护时得到便利。
4.具体的操作功能 PlayerDao.java
package Player;/*
@Author :张鹏翔
@Date :Creater in 19:35 2021/10/23
*/
//球员管理数据访问对象PlayerDao
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class PlayerDao implements PlayerDaoImpl {
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
//添加球员信息
public boolean add(Player player){
String sql="insert into player(P_ID,P_NAME,P_SEX,P_AGE,P_CLASS,P_PHONE,P_PERFORMANCE,P_GRADE) values(?,?,?,?,?,?,?,?)";
try{
con = DBUtil.getCon();
pstmt=con.prepareStatement(sql);
pstmt.setString(1, player.getID());
pstmt.setString(2, player.getNAME());
pstmt.setString(3, player.getSEX());
pstmt.setInt(4, player.getAGE());
pstmt.setString(5, player.getCLASS());
pstmt.setString(6, player.getPHONE());
pstmt.setString(7, player.getPERFORMANCE());
pstmt.setString(8, player.getGRADE());
pstmt.executeUpdate();
}catch (ClassNotFoundException e){
e.printStackTrace();
return false;
}catch (SQLException e){
e.printStackTrace();
return false;
}finally {
DBUtil.close(con,pstmt,rs);
}
return true;
}
//查看球员列表(1所有)
public List<Player> list(){
List<Player> list =new ArrayList<Player>();//是线性列表,ArrayList
String sql="select * from PLAYER";
try{
con=DBUtil.getCon();
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();//用于查询
while(rs.next()){
Player player=new Player();
player.setID(rs.getString("P_ID"));
player.setNAME(rs.getString("P_NAME"));
player.setSEX(rs.getString("P_SEX"));
player.setAGE(rs.getInt("P_AGE"));
player.setCLASS(rs.getString("P_CLASS"));
player.setPHONE(rs.getString("P_PHONE"));
player.setPERFORMANCE(rs.getString("P_PERFORMANCE"));
player.setGRADE(rs.getString("P_GRADE"));
list.add(player);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
DBUtil.close(con,pstmt,rs);
}
return list;
}
//查看球员列表(2根据球员编号显示信息)
public Player findSomeone(String ID){
Player player=null;
String sql="select * from PLAYER where P_ID=?";
try{
con=DBUtil.getCon();
pstmt=con.prepareStatement(sql);
pstmt.setString(1,ID);
rs=pstmt.executeQuery(); //用于查询
while (rs.next()){
player=new Player();
player.setID(rs.getString("P_ID"));
player.setNAME(rs.getString("P_NAME"));
player.setSEX(rs.getString("P_SEX"));
player.setAGE(rs.getInt("P_AGE"));
player.setCLASS(rs.getString("P_CLASS"));
player.setPHONE(rs.getString("P_PHONE"));
player.setPERFORMANCE(rs.getString("P_PERFORMANCE"));
player.setGRADE(rs.getString("P_GRADE"));
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
DBUtil.close(con,pstmt,rs);
}
return player;
}
//修改球员信息
public boolean update(Player player){
String sql="update player set P_NAME=?,P_SEX=?,P_AGE=?,P_CLASS=?,P_PHONE=?,P_PERFORMANCE=?,P_GRADE=? where P_ID=?";
try{
con=DBUtil.getCon();
pstmt=con.prepareStatement(sql);
pstmt.setString(8,player.getID());
pstmt.setString(1,player.getNAME());
pstmt.setString(2, player.getSEX());
pstmt.setInt(3,player.getAGE());
pstmt.setString(4, player.getCLASS());
pstmt.setString(5, player.getPHONE());
pstmt.setString(6, player.getPERFORMANCE());
pstmt.setString(7, player.getGRADE());
pstmt.executeUpdate();
}catch (ClassNotFoundException e){
return false;
}catch (SQLException e){
e.printStackTrace();
return false;
}finally {
DBUtil.close(con,pstmt,rs);
}
return true;
}
//删除球员信息
public boolean del(String ID){
String sql="delete from player where P_ID=?";
try{
con=DBUtil.getCon();
pstmt= con.prepareCall(sql);
pstmt.setString(1,ID);
pstmt.executeUpdate();
}catch (ClassNotFoundException e){
e.printStackTrace();
return false;
}catch (SQLException e){
e.printStackTrace();
return false;
}finally {
DBUtil.close(con,pstmt,rs);
}
return true;
}
}
功能的具体编写和添加球员的功能类似,可以类比这去编写。
4.操作界面 PlayerManage.java
package Player;/*
@Author :张鹏翔
@Date :Creater in 20:52 2021/10/23
*/
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class PlayerManage {
public void menu(){
//1.打印菜单
//2.输入菜单
//3.switch菜单选择
int choose;
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("6.退出系统");
System.out.println("请选择 1--6");
Scanner sc=new Scanner(System.in);
choose=sc.nextInt();
System.out.println("******************************");
switch (choose){
case 1:
myAdd();
break;
case 2:
myUpdate();
break;
case 3:
myDel();
break;
case 4:
myList();
break;
case 5:
mySort();
break;
case 6:
System.out.println("你选择了退出系统,确定要退出吗?(y/n)");
Scanner scanner= new Scanner(System.in);
String scanExit=scanner.next();
if(scanExit.equals("y")){
System.exit(-1);
System.out.println("您已经成功退出系统,欢迎您下次再次使用");
}
break;
default:
break;
}
}while(choose !=6);
}
//新增球员
public void myAdd(){
String continute;
do{
Scanner s=new Scanner(System.in);
String ID,NAME,SEX,CLASS,PHONE,PERFORMANCE,GRADE;
Integer AGE;
System.out.println("===新增球员===");
System.out.println("ID编号: ");
ID=s.next();
System.out.println("姓名:");
NAME=s.next();
System.out.println("性别: ");
SEX=s.next();
System.out.println("年龄: ");
AGE=s.nextInt();
System.out.println("班级: ");
CLASS=s.next();
System.out.println("电话: ");
PHONE=s.next();
System.out.println("对战表现: ");
PERFORMANCE=s.next();
System.out.println("评价: ");
GRADE=s.next();
Player player=new Player(ID,NAME,SEX,AGE,CLASS,PHONE,PERFORMANCE,GRADE);
PlayerDao dao=new PlayerDao();
boolean ok=dao.add(player);
if (ok){
System.out.println("保存成功!");
}else{
System.out.println("保存失败!");
}
System.out.println("是否继续添加(y/n): ");
Scanner scanner2=new Scanner(System.in);
continute=scanner2.next();
}while (continute.equals("y"));
}
//删除球员信息
public void myDel(){
Scanner s=new Scanner(System.in);
String ID;
System.out.println("===删除球员===");
System.out.println("请输入要删除的球员编号: ");
ID=s.next();
System.out.println("该球员的信息如下: ");
PlayerDao playerDao=new PlayerDao();
System.out.println("球员编号"+playerDao.findSomeone(ID).getID());
System.out.println("球员姓名"+playerDao.findSomeone(ID).getNAME());
System.out.println("球员性别"+playerDao.findSomeone(ID).getSEX());
System.out.println("球员年龄"+playerDao.findSomeone(ID).getAGE());
System.out.println("球员班级"+playerDao.findSomeone(ID).getID());
System.out.println("球员电话"+playerDao.findSomeone(ID).getPHONE());
System.out.println("球员表现"+playerDao.findSomeone(ID).getPERFORMANCE());
System.out.println("球员评级"+playerDao.findSomeone(ID).getGRADE());
System.out.println("是否确定删除(y/n):");
Scanner scanner3=new Scanner(System.in);
String x=scanner3.next();
if (x.equals("y")){
Player player=new Player(ID,null,null,null,null,null,null,null);
PlayerDao dao=new PlayerDao();
boolean ok = dao.del(ID);
if (ok){
System.out.println("删除成功!");
}else{
System.out.println("删除失败! ");
}
}
}
//修改球员信息
public void myUpdate(){
Scanner s=new Scanner(System.in);
String ID;
System.out.println("===修改球员===");
System.out.println("请输入要修改的球员编号: ");
ID=s.next();
System.out.println("该球员信息如下: ");
PlayerDao playerDao=new PlayerDao();
System.out.println("球员编号"+playerDao.findSomeone(ID).getID());
System.out.println("球员姓名"+playerDao.findSomeone(ID).getNAME());
System.out.println("球员性别"+playerDao.findSomeone(ID).getSEX());
System.out.println("球员年龄"+playerDao.findSomeone(ID).getAGE());
System.out.println("球员班级"+playerDao.findSomeone(ID).getCLASS());
System.out.println("球员电话"+playerDao.findSomeone(ID).getPHONE());
System.out.println("球员表现"+playerDao.findSomeone(ID).getPERFORMANCE());
System.out.println("球员评级"+playerDao.findSomeone(ID).getGRADE());
System.out.println("请输入新的球员信息:");
Scanner scUp=new Scanner(System.in);
String NAME,SEX,CLASS,PHONE,PERFORMANCE,GRADE;
Integer AGE;
System.out.println("球员姓名: ");
NAME=scUp.next();
System.out.println("球员性别: ");
SEX=scUp.next();
System.out.println("球员年龄: ");
AGE=scUp.nextInt();
System.out.println("球员班级: ");
CLASS=scUp.next();
System.out.println("球员手机号: ");
PHONE=scUp.next();
System.out.println("球员表现: ");
PERFORMANCE=scUp.next();
System.out.println("球员评级: ");
GRADE= scUp.next();
Player player=new Player(ID,NAME,SEX,AGE,CLASS,PHONE,PERFORMANCE,GRADE);
PlayerDao dao=new PlayerDao();
boolean ok =dao.update(player);
if (ok) {
System.out.println("保存成功!");
}else {
System.out.println("保存失败!");
}
}
//查询球员信息
public void myList(){
System.out.println("*********************");
System.out.println("===查询球员的方式===");
System.out.println("1.显示全部 2.按照编号查找");
int choice=0;
Scanner scL=new Scanner(System.in);
choice = scL.nextInt();
PlayerDao dao=new PlayerDao();
switch (choice){
case 1:
System.out.println("该球员的信息如下:");
System.out.println("ID \t姓名 \t性别 \t年龄 \t班级 \t手机号 \t赛场表现 \t评价 \t");
List<Player> list=dao.list();
for (Player playerlist:list){
//循环打印查询结果
System.out.println(playerlist.getID()+" \t"+playerlist.getNAME()+" \t"+playerlist.getSEX()+" \t"+
playerlist.getAGE()+" \t"+playerlist.getCLASS()+" \t"+playerlist.getPHONE()+" \t"
+playerlist.getPERFORMANCE()+ " \t"+playerlist.getGRADE());
}
System.out.println("***********************");
break;
case 2:
System.out.println("请输入球员的ID");
String ID=scL.next();
System.out.println("该球员的信息如下:");
System.out.println("ID \t姓名 \t性别 \t年龄 \t班级 \t手机号 \t赛场表现 \t评价 \t");
System.out.println(dao.findSomeone(ID).getID()+" \t"+dao.findSomeone(ID).getNAME()+" \t"+dao.findSomeone(ID).getSEX()+" \t"+
dao.findSomeone(ID).getAGE()+" \t"+dao.findSomeone(ID).getCLASS()+" \t"+dao.findSomeone(ID).getPHONE()
+" \t"+dao.findSomeone(ID).getPERFORMANCE()+ " \t"+dao.findSomeone(ID).getGRADE());
System.out.println("***********************");
break;
}
}
public void mySort(){
System.out.println("请输入排序的方式:1.按照年龄排序 2.按照评级排序");
Scanner sc=new Scanner(System.in);
int choice =sc.nextInt();
PlayerDao dao=new PlayerDao();
List<Player> list=dao.list();
list.sort(Comparator.comparing(Player::getAGE));
switch (choice){
case 1:
list.sort(Comparator.comparing(Player::getAGE));
break;
case 2:
list.sort(Comparator.comparing(Player::getGRADE));
break;
default:
break;
}
System.out.println("该球员的信息如下:");
System.out.println("ID \t姓名 \t性别 \t年龄 \t班级 \t手机号 \t赛场表现 \t评价 \t");
for (Player playerlist:list){
//循环打印查询结果
System.out.println(playerlist.getID()+" \t"+playerlist.getNAME()+" \t"+playerlist.getSEX()+" \t"+
playerlist.getAGE()+" \t"+playerlist.getCLASS()+" \t"+playerlist.getPHONE()+" \t"
+playerlist.getPERFORMANCE()+ " \t"+playerlist.getGRADE());
}
System.out.println("***********************");
}
}
在这里需要将数据库的操作和用户操作连接起来,这时需要将球员类Player和球员操作PlayerDao两个类进行实例化,将球员这个对象作为操作对象的属性,以实现playerdao中各个功能的实现。
5.主程序 Main.java
这里就是实例化PlayerMange,即new一个对象,在执行menu()功能。
package Player;/*
@Author :张鹏翔
@Date :Creater in 20:34 2021/10/24
*/
public class Main {
public static void main(String[] args) {
PlayerManage p=new PlayerManage();
p.menu();
}
}
五、总结心得
通过这次的课程设计,学习到了用Java语言调用数据库的新知识,同时也更好的使用Idea开发Java项目,在这次课程设计中也解决了一些困惑,虽然还是不能够全面的理解,但是已经有了进步。在课程设计中遇到不少困难,通过查阅资料、与同学讨论,在应用课本的前提下。拓展课外知识,基本完成了本次课程设计,虽然其中还有许多不足之处,但是从中我学到了许多东西,懂得了不能课本以外的知识内容,并且能对其灵活运用。