老师帮我看一下代码,为什么获取不到classno

老师帮我看一下代码,为什么获取不到classno

classes实体类

package com.imooc.mybatistest.entity;

import java.util.List;

public class Classes {
    private Integer id;
    private String classno;
    private String name;
    private String major;
    List<Student> students;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getClassno() {
        return classno;
    }

    public void setClassno(String classno) {
        this.classno = classno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }
}

student实体类

package com.imooc.mybatistest.entity;

public class Student {
    private Integer id;
    private Integer regNo;
    private String name;
    private String sex;
    private Integer age;
    private String grade;
    private String major;
    private String classno;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getRegNo() {
        return regNo;
    }

    public void setRegNo(Integer regNo) {
        this.regNo = regNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getClassno() {
        return classno;
    }

    public void setClassno(String classno) {
        this.classno = classno;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", regNo=" + regNo +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", grade='" + grade + '\'' +
                ", major='" + major + '\'' +
                ", classno='" + classno + '\'' +
                '}';
    }
}

classes.mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="classes">

    <resultMap id="rmClasses" type="com.imooc.mybatistest.entity.Classes">
        <id property="id" column="id"></id>
        <collection property="students" select="student.selectById" column="classno"></collection>
    </resultMap>
    <select id="selectOneToMany" resultMap="rmClasses">
        select * from classes
    </select>

</mapper>

student.mapper

<select id="selectById" parameterType="String" resultType="com.imooc.mybatistest.entity.Student">
    select  * from student where  classno =#{value}
</select>

测试代码

@Test
public void testSelectOneToMany(){
    SqlSession sqlSession = null;
    try {
        sqlSession = MybatisUtils.openSession();
    List<Classes> classes=    sqlSession.selectList("classes.selectOneToMany");
    for(Classes classes1:classes){
        System.out.println(classes1.getClassno()+":"+classes1.getStudents().toString());
    }
    }catch (Exception e){
        throw  e;
    }finally {
        sqlSession.close();
    }
}

运行结果

https://img1.sycdn.imooc.com//climg/64db7a4709d3e88b17850350.jpg

https://img1.sycdn.imooc.com//climg/64db7b0a09c9876613130596.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,通常这个错误是因为数据库中字段名与实体类中属性名不一致导致的(无法使用驼峰转换),建议同学检查一下字段命名。如果没有检查出问题,建议同学提供一下数据库表的建表语句。

祝学习愉快~


  • _大臣呀 提问者 #1

    不是字段的问题

    class表建表语句

    /*
     Navicat Premium Data Transfer
    
     Source Server         : imooc
     Source Server Type    : MySQL
     Source Server Version : 80032 (8.0.32)
     Source Host           : localhost:3306
     Source Schema         : imooc
    
     Target Server Type    : MySQL
     Target Server Version : 80032 (8.0.32)
     File Encoding         : 65001
    
     Date: 16/08/2023 11:10:15
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for classes
    -- ----------------------------
    DROP TABLE IF EXISTS `classes`;
    CREATE TABLE `classes`  (
      `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
      `classno` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
      `major` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of classes
    -- ----------------------------
    INSERT INTO `classes` VALUES (1, 'Class001', '一班', '计算机');
    INSERT INTO `classes` VALUES (2, 'Class002', '二班', '计算机');
    INSERT INTO `classes` VALUES (3, 'Class003', '三班', '会计');
    INSERT INTO `classes` VALUES (4, 'Class004', '四班', '会计');
    
    SET FOREIGN_KEY_CHECKS = 1;

    学生表建表语句

    /*
     Navicat Premium Data Transfer
    
     Source Server         : imooc
     Source Server Type    : MySQL
     Source Server Version : 80032 (8.0.32)
     Source Host           : localhost:3306
     Source Schema         : imooc
    
     Target Server Type    : MySQL
     Target Server Version : 80032 (8.0.32)
     File Encoding         : 65001
    
     Date: 16/08/2023 11:10:25
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for student
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`  (
      `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学生id',
      `reg_no` int NOT NULL COMMENT '学号',
      `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓名',
      `sex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓别',
      `age` int UNSIGNED NOT NULL COMMENT '年龄',
      `grade` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '年级',
      `major` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '专业',
      `classno` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of student
    -- ----------------------------
    INSERT INTO `student` VALUES (1, 20171201, '梅长苏', '男', 31, '2008', '哲学系', 'Class001');
    INSERT INTO `student` VALUES (2, 20171202, '萧景琰', '男', 30, '2008', '政治系', 'Class001');
    INSERT INTO `student` VALUES (3, 20171203, '飞流', '男', 18, '2016', '人体系', 'Class001');
    INSERT INTO `student` VALUES (4, 20171204, '萧景桓', '男', 35, '2006', '政治系', 'Class002');
    INSERT INTO `student` VALUES (5, 20171205, '宫羽', '女', 25, '2013', '声乐系', 'Class002');
    INSERT INTO `student` VALUES (6, 20171206, '霓凰', '女', 31, '2008', '国际关系专业', 'Class003');
    INSERT INTO `student` VALUES (7, 20171207, '秦般弱', '女', 30, '2016', '通信专业', 'Class003');
    INSERT INTO `student` VALUES (8, 20171208, '言豫津', '男', 26, '2013', '哲学系', 'Class004');
    INSERT INTO `student` VALUES (10, 20171208, '张帆', '男', 26, '2013', '哲学系', 'Class004');
    
    SET FOREIGN_KEY_CHECKS = 1;


    2023-08-16 11:12:37
  • 好帮手慕小蓝 回复 提问者 _大臣呀 #2

    同学你好,在id为rmClasses的resultMap中,没有对classno进行映射,那么就有可能无法自动获取字段值来进行赋值,这是很正常的。在MyBatis中,如果使用了ResultMap,那么就应当为所有需要赋值的字段进行映射,如果没有映射,就不能保证一定会赋值。

    这里就是这样的情况,由于不保证赋值,name和major被赋值了,但是classno没有。为了避免这样的问题,在开发的时候一定要谨记,为每个需要赋值的字段进行映射。

    祝学习愉快~

    2023-08-16 11:42:00
  • _大臣呀 提问者 回复 好帮手慕小蓝 #3
    <resultMap id="rmClasses" type="com.imooc.mybatistest.entity.Classes">
        <id property="id" column="id"></id>
        <result property="classno" column="classno"></result>
        <collection property="students" select="student.selectById" column="classno"></collection>
    </resultMap>
    <select id="selectOneToMany" resultMap="rmClasses">
        select * from classes
    </select>

    代码修改后问题已得到解决,映射一个classno是不是就可以了呀,老师


    2023-08-16 12:19:44
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师