使用自定义属性扩展实体

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本项目中,你将学习如何向实体类添加自定义属性,并在 MyBatis 应用程序中使用自定义类型处理器在布尔值和整数值之间进行转换。

👀 预览

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
运行 org.lanqiao.test.MyBatisTest
数据删除成功
数据添加成功
[课程编号: 1       课程名称: 数据结构    教师: Zoe 必修课程: false, 课程编号: 2      课程名称: JAVA       教师: William     必修课程: true, 课程编号: 3 课程名称: Python     教师: Olivia      必修课程: true, 课程编号: 4       课程名称: C++        教师: Brian 必修课程: false, 课程编号: 6      课程名称: C 教师: Lisa        必修课程: true, 课程编号: 8       课程名称: 人工智能       教师: Tom 必修课程: true]
数据更新成功
测试运行: 4, 失败: 0, 错误: 0, 跳过: 0, 耗时: 2.119 秒
...
课程编号 课程名称 教师 课程属性
1       软件测试        Jack    1
2       JAVA    William 1
3       Python  Olivia  1
4       C++     Brian   0
6       C       Lisa    1
8       人工智能 Tom     1

🎯 任务

在本项目中,你将学习:

  • 如何向 Course 实体类添加一个属性来表示课程属性(布尔值 cProperties,其中 true 表示必修课,false 表示选修课)
  • 如何创建一个自定义类型处理器在布尔值和整数值之间进行转换
  • 如何在 MyBatis 配置文件中注册自定义类型处理器
  • 如何更新课程表和 CourseMapper 以使用新的 cProperties 字段
  • 如何使用自定义类型处理器更新数据库中的课程信息

🏆 成果

完成本项目后,你将能够:

  • 扩展 BaseTypeHandler 类以创建自定义类型处理器
  • 在 MyBatis 配置文件中注册自定义类型处理器
  • 更新数据库模式和相应的映射器文件以使用自定义字段
  • 使用自定义类型处理器更新数据库中的数据

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("`Java`")) -.-> java/BasicSyntaxGroup(["`Basic Syntax`"]) java(("`Java`")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["`Object-Oriented and Advanced Concepts`"]) java(("`Java`")) -.-> java/SystemandDataProcessingGroup(["`System and Data Processing`"]) java/BasicSyntaxGroup -.-> java/type_casting("`Type Casting`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("`Classes/Objects`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_attributes("`Class Attributes`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/constructors("`Constructors`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/encapsulation("`Encapsulation`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/annotation("`Annotation`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/jdbc("`JDBC`") java/SystemandDataProcessingGroup -.-> java/xml_dom4j("`XML/Dom4j`") java/SystemandDataProcessingGroup -.-> java/object_methods("`Object Methods`") subgraph Lab Skills java/type_casting -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/classes_objects -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/class_attributes -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/constructors -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/encapsulation -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/annotation -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/jdbc -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/xml_dom4j -.-> lab-300358{{"`使用自定义属性扩展实体`"}} java/object_methods -.-> lab-300358{{"`使用自定义属性扩展实体`"}} end

向实体类添加课程属性

在本步骤中,你将学习如何向实体类 Course.java 添加一个属性来表示课程属性(布尔值 cProperties,其中 true 表示必修课,false 表示选修课)。

  1. 打开位于 org.lanqiao.pojo 包中的 Course.java 文件。

  2. Course 类添加一个私有布尔字段 cProperties

private Boolean cProperties;
  1. cProperties 字段生成 gettersetter 方法:
public Boolean getcProperties() {
    return cProperties;
}

public void setcProperties(Boolean cProperties) {
    this.cProperties = cProperties;
}
  1. 更新构造函数以包含 cProperties 参数:
public Course(int cNo, String cName, String teacher, Boolean cProperties) {
    this.cNo = cNo;
    this.cName = cName;
    this.teacher = teacher;
    this.cProperties = cProperties;
}
  1. 更新 toString() 方法以包含 cProperties 信息:
@Override
public String toString() {
    return "课程编号: " + this.cNo + "\t课程名称: " + this.cName + "\t教师: " + this.teacher + "\t必修课程: " + (this.cProperties? "true" : "false");
}
✨ 查看解决方案并练习

创建自定义类型处理器

在本步骤中,你将学习如何创建一个自定义类型处理器,用于在布尔值和整数值之间进行转换。

  1. org.lanqiao.converter 包中创建一个新的 Java 类 BooleanAndIntConverter

  2. 扩展 BaseTypeHandler<Boolean> 类并实现以下方法:

public class BooleanAndIntConverter extends BaseTypeHandler<Boolean> {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, aBoolean? 1 : 0);
    }

    @Override
    public Boolean getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int result = resultSet.getInt(s);
        return result == 1;
    }

    @Override
    public Boolean getNullableResult(ResultSet resultSet, int i) throws SQLException {
        int result = resultSet.getInt(i);
        return result == 1;
    }

    @Override
    public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        int result = callableStatement.getInt(i);
        return result == 1;
    }
}

setNonNullParameter() 方法将布尔值转换为整数值(true 为 1,false 为 0),而 getNullableResult() 方法将整数值转换为布尔值(1 为 true,0 为 false)。

✨ 查看解决方案并练习

注册自定义类型处理器

在本步骤中,你将学习如何在 MyBatis 配置文件 mybatis-config.xml 中注册自定义类型处理器。

  1. 打开位于项目根目录下的 mybatis-config.xml 文件。

  2. 添加以下配置以注册自定义类型处理器:

<typeHandlers>
    <typeHandler handler="org.lanqiao.converter.BooleanAndIntConverter"/>
</typeHandlers>

此配置告诉 MyBatis 使用 BooleanAndIntConverter 类来处理布尔值和整数值之间的转换。

✨ 查看解决方案并练习

更新课程表和映射器

在本步骤中,你将学习如何更新课程表和 CourseMapper 以使用新的 cProperties 字段。

  1. 打开 CourseMapper.xml 文件,并更新 SQL 语句以使用 cProperties 字段:
<insert id="insertCourse" parameterType="org.lanqiao.pojo.Course">
    insert into course(cNo,cName,teacher,cProperties)
    values(#{cNo},#{cName},#{teacher},#{cProperties})
</insert>

<update id="updateCourse" parameterType="org.lanqiao.pojo.Course">
    update course set cName=#{cName},teacher=#{teacher},cProperties=#{cProperties}
    where cNo=#{cNo}
</update>

insertCourseupdateCourse 语句现在包含了 cProperties 字段。

✨ 查看解决方案并练习

更新课程信息

在本步骤中,你将学习如何使用自定义类型处理器来更新课程信息。

  1. 打开 MyBatisTest.java 文件。

  2. testUpd() 方法中,更新课程编号为 1 的课程信息:

@Test
public void testUpd() throws IOException {
    CourseMapper cMapper = session.getMapper(CourseMapper.class);

    Course course = new Course(1, "软件测试", "杰克", true);

    int i = cMapper.updateCourse(course);

    session.commit();

    System.out.println((i!= 0? "数据更新成功" : "数据更新失败"));

    session.close();
}

cProperties 字段被设置为 true,表示这是一门必修课。

  1. testIns() 方法中,插入一门课程编号为 8 的新课程:
@Test
public void testIns() throws IOException {
    CourseMapper cMapper = session.getMapper(CourseMapper.class);

    Course course = new Course(8, "人工智能", "汤姆", true);

    int i = cMapper.insertCourse(course);

    session.commit();

    System.out.println((i!= 0? "数据添加成功" : "数据添加失败"));

    session.close();
}

cProperties 字段被设置为 true,表示这是一门必修课。

  1. testDEl() 方法中,删除课程编号为 7 的课程:
@Test
public void testDEl() throws IOException {
    CourseMapper cMapper = session.getMapper(CourseMapper.class);

    int i = cMapper.deleteCourse(7);

    session.commit();

    System.out.println((i!= 0? "数据删除成功" : "数据删除失败"));

    session.close();
}

完成这些步骤后,你已成功向实体类添加了课程属性,创建了一个用于在布尔值和整数值之间进行转换的自定义类型处理器,并使用该自定义类型处理器更新了数据库中的课程信息。

  1. 测试应用程序。
cd ~/project/MyBatisCourseDemo02/
mvn test
echo "USE MyBatisDemo; SELECT * FROM course;" | mysql -u root > course_data.txt
cat course_data.txt

输出应如下所示:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.lanqiao.test.MyBatisTest
数据删除成功
数据添加成功
[课程编号: 1       课程名称: 数据结构    教师: 佐伊 必修课程: false, 课程编号: 2      课程名称: JAVA       教师: 威廉     必修课程: true, 课程编号: 3 课程名称:  Python     教师: 奥利维亚      必修课程: true, 课程编号: 4       课程名称: C++        教师: 布莱恩 必修课程: false, 课程编号: 6      课程名称: C 教师: 丽莎        必修课程: true, 课程编号: 8       课程名称: 人工智能       教师: 汤姆 必修课程: true]
数据更新成功
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.119 sec
...
cNo     cName   teacher cProperties
1       软件测试        杰克    1
2       JAVA    威廉 1
3       Python  奥利维亚  1
4       C++     布莱恩   0
6       C       丽莎    1
8       人工智能       汤姆     1
✨ 查看解决方案并练习

总结

恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。

您可能感兴趣的其他 Java 教程