介绍
在本项目中,你将学习如何向实体类添加自定义属性,并在 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 配置文件中注册自定义类型处理器
- 更新数据库模式和相应的映射器文件以使用自定义字段
- 使用自定义类型处理器更新数据库中的数据
向实体类添加课程属性
在本步骤中,你将学习如何向实体类 Course.java 添加一个属性来表示课程属性(布尔值 cProperties,其中 true 表示必修课,false 表示选修课)。
打开位于
org.lanqiao.pojo包中的Course.java文件。向
Course类添加一个私有布尔字段cProperties:
private Boolean cProperties;
- 为
cProperties字段生成getter和setter方法:
public Boolean getcProperties() {
return cProperties;
}
public void setcProperties(Boolean cProperties) {
this.cProperties = cProperties;
}
- 更新构造函数以包含
cProperties参数:
public Course(int cNo, String cName, String teacher, Boolean cProperties) {
this.cNo = cNo;
this.cName = cName;
this.teacher = teacher;
this.cProperties = cProperties;
}
- 更新
toString()方法以包含cProperties信息:
@Override
public String toString() {
return "课程编号:" + this.cNo + "\t课程名称:" + this.cName + "\t教师:" + this.teacher + "\t必修课程:" + (this.cProperties? "true" : "false");
}
创建一个自定义类型处理器
在本步骤中,你将学习如何创建一个自定义类型处理器,用于在布尔值和整数值之间进行转换。
在
org.lanqiao.converter包中创建一个新的 Java 类BooleanAndIntConverter。扩展
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 中注册自定义类型处理器。
打开位于项目根目录下的
mybatis-config.xml文件。添加以下配置以注册自定义类型处理器:
<typeHandlers>
<typeHandler handler="org.lanqiao.converter.BooleanAndIntConverter"/>
</typeHandlers>
此配置告诉 MyBatis 使用 BooleanAndIntConverter 类来处理布尔值和整数值之间的转换。
更新课程表和映射器
在本步骤中,你将学习如何更新课程表和 CourseMapper 以使用新的 cProperties 字段。
- 打开
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>
insertCourse 和 updateCourse 语句现在包含了 cProperties 字段。
更新课程信息
在本步骤中,你将学习如何使用自定义类型处理器来更新课程信息。
打开
MyBatisTest.java文件。在
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,表示这是一门必修课。
- 在
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,表示这是一门必修课。
- 在
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();
}
完成这些步骤后,你已成功向实体类添加了课程属性,创建了一个用于在布尔值和整数值之间进行转换的自定义类型处理器,并使用该自定义类型处理器更新了数据库中的课程信息。
- 测试应用程序。
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 中练习更多实验来提升你的技能。



