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

这次课设题目自选,我选择学生管理系统。今天主要做数据库和表的建立。首先第一步,是建立数据库用户:设置用户和密码,并且建立数据库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个表:


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

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


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

数据表创建成功后,数据库中还没有实际的数据。为了保证外部键能使用,数据需要提前输入,如院系编号,班级编号,学籍变更代码和奖惩级别等等。下面是change_code(学籍变更代码)表:
[数据库课设进行时]第一天 数据库和表的建立和基本的增删查改操作_第3张图片

reward_leves奖励级别代码表:


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

处罚级别代码表:

班级表:
[数据库课设进行时]第一天 数据库和表的建立和基本的增删查改操作_第5张图片

院系表:


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

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

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

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

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


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

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


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

数据库的:

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);

结果:

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

如果外键的表中为空,则会出现插入错误.所以一定要建立外键的表,先进行赋值.
数据库的 :

//把这个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();删除数据.并且提示删除成功!

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

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

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

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

:

//根据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 list(int start, int count) {
        // TODO Auto-generated method stub
        List 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 list = test.list(2,4);
        for(Student s:list) {
            System.out.println(s.studentID);
        }

结果如下:

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

参考资料:
How2j的java教程

后文

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


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

你可能感兴趣的:([数据库课设进行时]第一天 数据库和表的建立和基本的增删查改操作)