思维导图:
实例测试
通过对上述三层架构的学习,下面大家在上面这个案例的基础之上完成 学生的注册功能,分析:
-
注册相当于往数据库表中添加一条数据。
-
注意用代码判断输入的信息是否有误。
过程:
一、根据实体类属性创建学生表student并添加数据
注意:因为是从jdbc库下创建的表,所以配置文件的url要改,password不同也要改
更改后:
可以看到展示层UI缺少对应的方法,添加注册方法
业务逻辑层BLL也没有对应方法
数据访问层添加注册方法:
在数据访问层中将对数据库表进行操作的方法写在接口 StudentDao 中,然后通过实现类 StudentImpl 写具体操作数据库表的逻辑代码。
先将需要用到的方法都封装好,不写方法的实现,用到某一个方法,写这个方法的具体实现。这里我们要做的是学生注册,所以我们封装了注册方法 register ,接下来我们分析:注册肯定需要学生先输入id、name、sex、age、password,有了这些信息后之后去数据库表中添加对应的数据。经过分析我们知道方法的参数就是 以上信息 ,返回值就是这个学生 Student。
方法的具体实现,就是通过sql语句对数据库表进行操作,都是固定的模板,通过 JDBCTemplate模板 调用实现的方法即可。
修改前:
修改后:
终于成啦!
因为涉及了两个sql语句,还要考虑事务,不光是预防事务的并发问题,还要保证事务的一致性,要么同时发生,要么同时失败
再次测试:
DAO层:
@Override
public Student updateMsg(Student student) throws SQLException {
Connection conn = JDBCUtils.getConnection(); //创建连接对象,获取数据库连接
//定义sql
try {
conn.setAutoCommit(false); //开启事务
String sql = "UPDATE student SET `name` = ? ,sex = ? , age = ? , `password` = ? WHERE `id` = ? ";
template.update(sql, student.getName(), student.getSex(), student.getAge(), student.getPassword(), student.getId());
String sql2 = "select * from student where `id`= ?";
Student stu2 = template.queryForObject(sql2, new BeanPropertyRowMapper<Student>(Student.class), student.getId());
//若没有异常,则提交事务
conn.commit();
return stu2;
} catch (Exception e) {
e.printStackTrace();
//若有异常,则回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}return null;
}
View层
//修改测试2
@Test
public void update() throws SQLException {
System.out.println("***修改界面***");
System.out.println("请输入要修改的学生id:");
int id = TSUtils.ageStock();
System.out.println("请输入修改后的学生姓名name:");
String name = TSUtils.readKeyBoard(15, false);
System.out.println("请输入修改后的学生性别sex:");
String sex = TSUtils.readKeySex(1);
System.out.println("请输入修改后的学生年龄age:");
int age = TSUtils.ageStock();
System.out.println("请输入修改后的学生密码password:");
String password = TSUtils.readKeyBoard(6, false);
//2.调用方法
studentService.updateMsgStu(id,name,sex,age,password);
//成功
System.out.println("修改成功!");
System.out.println("退出");
System.out.print("确认是否退出(Y/N):");
if (TSUtils.readConfirmSelection() == 'Y' || TSUtils.readConfirmSelection() == 'y') {
System.out.println("您已成功退出,谢谢使用!");
System.exit(0); //JVM退出
}
}