利用springboot + 数据库来获取学生集合的时候,却发生了报错:column academy not found的错误,对应的代码是这样的:
StudentMapper类:

public class StudentMapper implements RowMapper<Student> {
    @Override
    public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
            Integer id =  rs.getInt("id");
            String stu_id = rs.getString("stu_id");
            String name = rs.getString("name");
            Date birth = rs.getDate("birth");
            String gender = rs.getString("gender");
            String phone = rs.getString("phone");
            String address =rs.getString("address");
            String academy = rs.getString("academy");
            String grade = rs.getString("grade");
            String major = rs.getString("major");
            String class_name = rs.getString("class_name");
            String password = rs.getString("password");
            Student student = new Student(id,stu_id,name,gender,phone,address,academy,grade,major,class_name,password);
            student.setBirth(birth);
            return student;
    }
}

而对应的数据库中的各列的名字:
在这里插入图片描述
而利用jdbcTemplate调用query方法的对应代码如下:

@PostMapping("/user/login")
    public String login(@RequestParam()String username,
                        @RequestParam()String password,
                        @RequestParam()String identity,
                        Model model) {
        String sql = "select * from " + identity + " where name = ?";
        Student student = jdbcTemplate.queryForObject(sql,new Object[]{username},new StudentMapper());
        System.out.println(student);
        return "dashboard";
    }

但是发生了报错,提示Incorrect result size: expected 1, actual 0 ,提示本应该希望有一个结果,但是实际商只有0个结果,那么这时候我们来看一下数据库中identity这个表中是否含有多个name相同的,如果当前的name对应的值username存在多个,那么调用queryForObject()当然会发生报错,因为queryForObject()返回的是单行的数据,也就是应给Student对象,所以针对这种情况,可以调用query进行解决
但是如果当前的username在表中是唯一的,那么需要考虑是否使用的数据库是否正确,需要看一下配置文件properties或者yaml文件中的url中使用的数据库是否为自己想要使用的,通过观察发现,我需要使用的是db3这个数据库,但是这里使用的是db1这个数据库,而在db1这个数据库中同样存在着一个同名的identity的表,从而发生了报错:

url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=true

所以需要将db1修改成为db3就可以成功了:

url: jdbc:mysql://localhost:3306/db3?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=true

但是即使将上面代码修改之后,如果我们输入的是当前数据库中对应的表不存在的用户名的时候,同样会发生这样的错误:Incorrect result size: expected 1, actual 0,那么我们需要利用一个try-catch来进行判断:

String sql = "select * from " + identity + " where name = ?";
        try{
            Student student = jdbcTemplate.queryForObject(sql,new Object[]{username},new StudentMapper());
            if(!password.equals(student.getPassword())){
                model.addAttribute("msg","用户密码错误");
                return "login";
            }else{
                return "dashboard";
            }
        }catch (EmptyResultDataAccessException e){
            //学生为null,说明查无此人
            model.addAttribute("msg","查无此人,请重新输入");
            return "login";
        }

但是在运行的时候,同样发生了column xxx not found的错误,而且所写的列名和数据库中的相同,那么可能会存在一下几种情况,可以参考一下这个博客:https://yichun.blog.csdn.net/article/details/91944052?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
但是并没有解决我的问题,因为sql语句中并没有使用别名,并且实体类中含有的变量和表的变量一样,那么这时候因为解决StudentMapper这个类中rs.getString(“xxx”)中xxx not found的错误呢?
我们可以试着在rs.getString()中的参数使用column对应的下标(从1开始算的):所以修改后的StudentMapper类如下:

public class StudentMapper implements RowMapper<Student> {
    @Override
    public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
    //值得注意的是,下标是从1开始算起的,所以如果rs.getId(0)的话,就会发生报错.
            Integer id =  rs.getInt(1);
            String stu_id = rs.getString(2);
            String name = rs.getString(3);
            Date birth = rs.getDate(4);
            String gender = rs.getString(5);
            String phone = rs.getString(6);
            String address =rs.getString(7);
            String academy = rs.getString(8);
            String grade = rs.getString(9);
            String major = rs.getString(10);
            String class_name = rs.getString(11);
            String password = rs.getString(12);
            Student student = new Student(id,stu_id,name,gender,phone,address,academy,grade,major,class_name,password);
            student.setBirth(birth);
            return student;
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐