使用JDBC完成的·一个简单的学生管理系统

 首先 ,我们要有ORM编程思想,一个数据库对应一个类,一个对象对应一个表,一个成员变量对应一个列名,而具体的成员变量值就是表中每字段的具体数据。

我们先创建一个对应学生表的类:

package com.ujiuye.bean;

public class ExamStudent {
    private int FLOWID;
    private int TYPE;
    private String IDCard;
    private String ExamCard;
    private String StudentName;
    private String Location;
    private int Grade;

    public ExamStudent() {

    }

    public ExamStudent(int FLOWID,int TYPE, String IDCard, String examCard, String studentName, String Location, int grade) {
        this.FLOWID = FLOWID;
        this.TYPE = TYPE;
        this.IDCard = IDCard;
        ExamCard = examCard;
        StudentName = studentName;
        this.Location = Location;
        Grade = grade;
    }

    public int getFLOWID() {
        return FLOWID;
    }

    public void setFLOWID(int FLOWID) {
        this.FLOWID = FLOWID;
    }

    public int getTYPE() {
        return TYPE;
    }

    public void setTYPE(int TYPE) {
        this.TYPE = TYPE;
    }

    public String getIDCard() {
        return IDCard;
    }

    public void setIDCard(String IDCard) {
        this.IDCard = IDCard;
    }

    public String getExamCard() {
        return ExamCard;
    }

    public void setExamCard(String examCard) {
        ExamCard = examCard;
    }

    public String getStudentName() {
        return StudentName;
    }

    public void setStudentName(String studentName) {
        StudentName = studentName;
    }

    public String getLocation() {
        return Location;
    }

    public void setLocation(String location) {
        this.Location = Location;
    }

    public int getGrade() {
        return Grade;
    }

    public void setGrade(int grade) {
        Grade = grade;
    }

    @Override
    public String toString() {
        System.out.println("==========查询结果==========");
        return info();
    }

    private String info() {
        return "流水号:" + FLOWID +"\n四级/六级:" + TYPE + "\n身份证号:" + IDCard + "\n准考证号:" +
                ExamCard + "\n学生姓名:" + StudentName + "\n学生地址:" + Location + "\n学生成绩:" + Grade;
    }
}

 创建好了学生类之后,就是学生管理系统最核心的一个点,也就是使用JDBC连接数据库,

这里我把获取数据库连接的步骤封装成了一个工具类,如果不了解JDBC的还请见谅,代码量确实不少。我们这里操作数据库代码还运用到前面学到的可变参数来实现操作数据库SQL的灵活性,

利用反射动态的操作查询表的语言。具体的操作步骤我给放下面了,你们可以作为一个参考,但这里建议在进行分支时最好把功能封装成方法,用Switch语句进行判断,这样用户体验会更佳。

package com.ujiuye.Test;

import com.ujiuye.bean.ExamStudent;
import com.ujiuye.java.JDBCUtils;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.Scanner;

public class ExerTest2 {

    //测试增删改查学生信息的功能
    @Test
    public void testManager() {
        Scanner scanner = new Scanner(System.in);
        String selection = null;
        while (true) {
            System.out.println("==========欢迎来到学生信息管理系统==========");
            System.out.println("\t\t\t\t1.添加学生信息");
            System.out.println("\t\t\t\t2.修改学生信息");
            System.out.println("\t\t\t\t3.查询学生信息");
            System.out.println("\t\t\t\t4.删除学生信息");
            System.out.println("\t\t\t\t5.退出");
            System.out.print("请进行学生信息的操作:_____");
            selection = scanner.nextLine();

            //添加学生信息
            if ("1".equals(selection)) {
                //添加学生的信息
                System.out.println("请进行信息的添加:");
                System.out.println("四级/六级");
                int type = scanner.nextInt();
                System.out.println("身份证号");
                String IDCard = scanner.next();
                System.out.println("准考证号");
                String ExamCard = scanner.next();
                System.out.println("学生姓名");
                String StudentName = scanner.next();
                System.out.println("学生地址");
                String location = scanner.next();
                System.out.println("学生成绩");
                int Grade = scanner.nextInt();
                //定义添加的sql语句
                String sql = "insert into examstudent(TYPE,IDCard,ExamCard,StudentName,location,Grade) values(?,?,?,?,?,?)";
                //调用实现连库并保存的方法
                update(sql, type, IDCard, ExamCard, StudentName, location, Grade);

            }

            //修改学生信息
            if ("2".equals(selection)) {
                System.out.println("请输入修改学生的身份证号");
                String IDCard = scanner.next();
                String sql = "update examstudent set Grade = ? where IDCard=?";
                //System.out.println("请输入要修改的信息");
                //String x = scanner.next();
                System.out.println("请输入修改后的信息");
                String y = scanner.next();
                update(sql, y, IDCard);

            }

            //查询学生信息
            if ("3".equals(selection)) {
                //录入学生的准考证号或身份证号
                System.out.println("请进行学生信息的查询");
                System.out.println("a.准考证号");
                System.out.println("b.身份证号");
                String selection2 = scanner.next();

                //录入学生的准考证号
                if ("a".equalsIgnoreCase(selection2)) {

                    System.out.println("请输入学生的准考证号");
                    String ExamCard = scanner.next();
                    //定义查询的SQL语句
                    String sql = "select * from examstudent where ExamCard=?";
                    //调用实现查询功能的方法,返回值为学生信息对象
                    ExamStudent es = getInstance(ExamStudent.class, sql, ExamCard);
                    System.out.println(es);

                    //录入学生的身份证号
                } else if ("b".equalsIgnoreCase(selection2)) {
                    System.out.println("请输入学生的身份证号");
                    String IDCard = scanner.next();
                    //定义查询的SQL语句
                    String sql = "select * from examstudent where IDCard=?";
                    //调用查询功能的方法,返回值为学生信息的对象
                    ExamStudent es = getInstance(ExamStudent.class, sql, IDCard);
                    System.out.println(es);

                } else {
                    System.out.println("您输入的信息有误,请重新输入");
                }
            }

            //删除学生信息
            if ("4".equals(selection)) {
                System.out.println("请输入要删除学生的身份证号");
                String IDCard = scanner.next();
                String sql = "delete from examstudent where IDCard=?";
                update(sql, IDCard);

            }

            //退出功能的实现
            if ("5".equals(selection)) {
                System.out.println("欢迎下次使用!");
                System.exit(0);
            }
        }
    }

    //实现增删改学生信息的功能
    public void update(String sql, Object ...args){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            //调用工具类实现获取数据库的基本连接
            conn = JDBCUtils.getConnection();
            //获取命令发送器
            ps = conn.prepareStatement(sql);
            //添加占位符
            for (int i = 0; i < args.length; i++){
                ps.setObject(i + 1,args[i]);
            }
            //执行SQL语句,返回值为int类型
             int count = ps.executeUpdate();

            if (count > 0){
                System.out.println("SQL命令执行成功!");
            }else{
                System.out.println("SQL命令执行失败,信息有误");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //释放资源
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //实现查询学生信息的功能
    public <T> T getInstance(Class<T> clazz, String sql, Object ...args){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取数据库连接
            conn = JDBCUtils.getConnection();
            //创建命令发送器
            ps = conn.prepareStatement(sql);
            //填充占位符
            for (int i = 0; i < args.length; i++){

                ps.setObject(i + 1,args[i]);
            }
            //执行sql语句
            rs = ps.executeQuery();
            //获取结果集的元数据:ResultSetMetaData
            ResultSetMetaData rsmd = rs.getMetaData();
            //通过ResultSetMetaData获取结果集列数
            int columnCount = rsmd.getColumnCount();
            //通过结果集的遍历操作判断列数
            if (rs.next()){
                //反射机制,动态的创建T泛型的对象,T值在运行时定义
                T t = clazz.newInstance();
                //通过循环来获取每列的列名和列值
                for (int i = 0; i < columnCount; i++){
                    //通过rs来获取数据的列值
                    Object columnValue = rs.getObject(i + 1);
                    //通过rsmd来获取数据列名
                    String columnLabel = rsmd.getColumnLabel(i + 1);

                    //通过获取t对象的字节码文件来获取到我们的列名
                    Field field = t.getClass().getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    //将列值赋值给t对象
                    field.set(t,columnValue);
                }
                return t;
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps,rs);
        }
        return null;
    }
}

 这里是运行后的查询效果,制作不易,谢谢大家啦!

 


版权声明:本文为weixin_56575384原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。