美文网首页计算机杂谈我爱编程
[数据库课设进行时]第一天 数据库和表的建立和基本的增删查改操作

[数据库课设进行时]第一天 数据库和表的建立和基本的增删查改操作

作者: 此生望尽天涯路 | 来源:发表于2018-06-11 20:31 被阅读26次

    这次课设题目自选,我选择学生管理系统。今天主要做数据库和表的建立。首先第一步,是建立数据库用户:设置用户和密码,并且建立数据库studentmanager,在工程中导入驱动:mysql-connector-java-版本号-bin.jar(导入驱动jar包的方式是:工程属性->java build path->libraries->add external jar)
    JDBC(Java DataBase Connectivity,java数据库连接)是执行sql语句的java API。我们可以通过加载驱动和连接数据库,执行sql语句对表进行增、删、查、改。首先驱动的加载是通过:

    Class.forName("com.mysql.jdbc.Driver");
    

    数据库的连接:

    Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/studentmanager?characterEncoding=UTF-8","root","admin");            
    

    参考博客:
    疯狂JavaJDBC:加载数据库驱动、连接数据库

    创建studentmanager数据库,建立9个表:



    为了方便以后插入中文字符,将字符集修改为UTF-8的格式:



    数据表创建成功后,数据库中还没有实际的数据。为了保证外部键能使用,数据需要提前输入,如院系编号,班级编号,学籍变更代码和奖惩级别等等。下面是change_code(学籍变更代码)表:

    reward_leves奖励级别代码表:



    处罚级别代码表:

    班级表:

    院系表:


    在已有的表中添加外键时出现下面问题:


    解决办法:
    出现错误的原因是,两个表的字段之间的属性不一致.
    参考资料:
    使用mysql-front添加外键 失败

    环境弄好了,下面来实现一些基本的数据库操作,包括增删差改.先新建一个student类,包含很多属性:学号(即ID号),姓名,生日,籍贯,院系代码,班级编号.



    整个student表有关操作,通过TestDAO类实现:


    数据库的:

    public void add(Student h) {
                    String sql = "insert into hero Values(?,?,?,?,?,?,?)";
                    try (Connection c = getConnection();
                        PreparedStatement s = c.prepareStatement(sql);
                        ){
                        String ID = h.studentID;
                        String name = h.name;
                        String sex = h.sex;
                        String birthday = h.birthday;
                        String department = h.department;
                        String native_place = h.native_place;
                        String Class = h.Class;
                        //设置参数
                        s.setString(2, name);
                        s.setString(1, ID);
                        s.setString(3, sex);
                        s.setString(4, Class);
                        s.setString(5, department);
                        s.setString(6, birthday);
                        s.setString(7, native_place);
                        //执行语句
                        s.execute();
                        System.out.println("数据插入成功!");
                        
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                }
            
    
    • 其中,preparedstatement是预编译语句,我们可以用他来执行sql语句.例如上面的insert into hero Values(?,?,?,?,?,?,?),然后我们依次将各字段的值通过preparedstatement指定插入的位置.例如ID插入一个位置,name插入第二个位置......这样就把要增加的学生(student)对象插入到了student表中.这里顺便说下preparedstatement比statement的优点在于,可以在以后很方便的根据位置进行插入数据.
    • 使用try-with-catch的形式,try (Connection c = getConnection(); PreparedStatement s = c.prepareStatement(sql); )可以实现自动关闭连接,就不用手动的关闭,非常方便.

    插入代码:

    TestDAO test = new TestDAO();
            Student stu = new Student();
            stu.birthday="19970409";
            stu.studentID = "1605050217";
            stu.department="1";
            stu.native_place="衡阳";
            stu.sex="男";
            stu.Class = "2";
            stu.name = "蒋政涛";
            test.add(stu);
    

    结果:


    如果外键的表中为空,则会出现插入错误.所以一定要建立外键的表,先进行赋值.
    数据库的:
    //把这个student 对象对应的数据删除掉
            public  void delete(String id) {
    
                
                String sql = "delete from hero where id = ?";
                try(Connection c = getConnection();
                    PreparedStatement s = c.prepareStatement(sql);
                    ) {
                    //设置参数
                    s.setString(1,id);
                    //System.out.println(h.id);
                    ResultSet rs = s.executeQuery("select id from student where id = "+id);
                    if(!rs.next()) {
                        System.out.println("数据库中并没有这个数据!");
                        return;
                    }
                    //执行
                    s.execute();
                    System.out.println("数据删除成功!");
                    
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
    

    这里在删之前会进行检查,ResultSet rs = s.executeQuery("select id from student where id = "+id);根据id查找后如果发现rs为空则说明表中没有这个id,则提示:"数据库中并没有这个数据!",如果有则s.execute();删除数据.并且提示删除成功!


    然后通过next()方法遍历这个set集合.

    根据studentID删除学生记录:test.delete("1605050217");
    结果:


    :
    //根据id返回一个student对象
            
            public Student get(String id) {
                
                Student h = null;
                try(Connection c = getConnection();
                    Statement s = c.createStatement();) {
                    ResultSet rs = s.executeQuery("select * from student where studentID = "+id);
                    if(rs.next()) {
                        h = new Student();
                        h.studentID = id;
                        h.name = rs.getString(2);
                        h.birthday = rs.getString(6);
                        h.Class = rs.getString(4);
                        h.department = rs.getString(5);
                        h.native_place = rs.getString(7);
                        h.sex = rs.getString(3);
                    }
                    else {
                        System.out.println("数据库中没有这个学生!");
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                return h;
            }
    

    通过查找id号,返回student对象,如果没有则提示"数据库中没有这个学生" ,并且返回的是一个null空值.
    :为了适应不同字段的更改,update方法的参数干脆就是一个student对象,通过学生的studentID找到记录,然后通过update的sql语句对整条记录进行更新.

    public void update(Student h) {
        
                String sql = "update student set name = ?,sex = ?,class=? ,department=?,birthday = ?,native_place=? where studentID = ? ";
                try(Connection c = getConnection();
                        PreparedStatement s = c.prepareStatement(sql);
                        ) {
                    String id = h.studentID;
                    String name =  h.name;
                    String sex = h.sex;
                    String birthday = h.birthday;
                    String department = h.department;
                    String Class = h.Class;
                    String native_place = h.native_place;
                    s.setString(7, id);
                    s.setString(1, name);
                    s.setString(2, sex);
                    s.setString(3, Class);
                    s.setString(4, department);
                    s.setString(5, birthday);
                    s.setString(6, native_place);
                    
                    //执行语句
                    s.execute();
                    System.out.println("数据更新成功!");
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    

    例如,

    TestDAO test = new TestDAO();
    Student stu = new Student();
            stu.birthday="19980x0x";
            stu.studentID = "1605050217";
            stu.department="1";
            stu.native_place="长沙";
            stu.sex="男";
            stu.Class = "2";
            stu.name = "xxy";
    test.update(stu);
    

    结果如下


    再查
    public List<Student> list(int start, int count) {
            // TODO Auto-generated method stub
            List<Student> students = new ArrayList<>();
            String sql = "select * from student order by studentID asc limit ?,? ";
            try(Connection c = getConnection();
                PreparedStatement ps = c.prepareStatement(sql);
                    ) {
                ps.setInt(1, start);
                ps.setInt(2, count);
                ResultSet rs = ps.executeQuery();
                while(rs.next()) {
                    Student h = new Student();
                    h.studentID = rs.getString(1);
                    h.name = rs.getString(2);
                    h.sex = rs.getString(3);
                    h.Class = rs.getString(4);
                    h.department = rs.getString(5);
                    h.birthday = rs.getString(6);
                    h.native_place = rs.getString(7);
                    students.add(h);
                }
                
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return students;
        }
    

    以升序asc,从start个元组开始,一共count个元组.并返回列表.这里要注意的是,元组下标计数是从0开始的.看下面的例子,从第二个元组开始数,一共4个元组:

    TestDAO test = new TestDAO();
    List<Student> list = test.list(2,4);
            for(Student s:list) {
                System.out.println(s.studentID);
            }
    

    结果如下:

    参考资料:
    How2j的java教程

    后文

    JDBC这部分,开学那段时间撸了一下,时隔这么久了,有点忘记了. 鉴于学校机房各种卡,下午直接拿自己的电脑在机房撸,我的位置风水很好,老师的水瓶啥东西都往我这放,时不时关心我的网速,(我的内心是奔溃的..半天网页也打不开).我这部分估计几天就可以撸完了,到时测试的时候,老师你别鸡蛋里挑骨头啊...
    END


    相关文章

      网友评论

        本文标题:[数据库课设进行时]第一天 数据库和表的建立和基本的增删查改操作

        本文链接:https://www.haomeiwen.com/subject/hrjceftx.html