我刚开始学习 MyBatis,我想知道,当我创建插入或更新查询时,有没有一种方法可以使属性名称对重构更友好?我将更详细地解释:
我的所有域类中都有可用于引用属性名称的常量。在我看来,它减少了拼写错误并使重构更容易一些。
public static final String FIRST_NAME = "firstName";
private String firstName = "";
当我使用注解创建 MyBatis 选择语句时,我可以这样做:
@Select("SELECT ID, FIRST_NAME, LAST_NAME FROM CUSTOMERS WHERE ID = #{id}")
@Results({
@Result(property = CustomerDetail.ID, column = "ID"),
@Result(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
@Result(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
CustomerDetail selectById(final int id);
如果我重构我的域对象 (CustomerDetail) 并更改属性名称,它最终会变得相当简单。
但是,当我使用注释创建 MyBatis 插入语句时,我必须执行以下操作:
@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})")
void insertCustomerDetail(final CustomerDetail customerDetail);
在这种情况下,如果我重构我的域对象 (CustomerDetail) 并更改属性名称,则更容易出错。有没有一种方法可以使用我的常量而无需求助于一堆字符串连接?这是我什至应该关心的事情吗?
作为一个新手,我期待@Insert 和@Update 注释模仿@Select 注释的结构。例如(请注意,以下不是有效的 MyBatis 注释):
@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME)")
@Params({
@Param(property = CustomerDetail.ID, column = "ID"),
@Param(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
@Param(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
void insertCustomerDetail(final CustomerDetail customerDetail);
我是否错过了与上述示例具有相同效果的任何选项?或者,我是否可以对 MyBatis 映射进行单元测试,以确保没有人使用我的域对象中不存在的属性名称?测试可能是更好的解决方案,因为它也适用于基于 XML 的映射。想法?