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