2

我刚开始学习 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 的映射。想法?

4

1 回答 1

1

这是我什至应该关心的事情吗?

我不这么认为。我理解您的担忧,并且我看到这样的功能对您有什么好处,尤其是在 POJO 经常变化的开发早期。

我认为您的对象字段不会被重构到足以证明提供此功能所需的投资是合理的。

我建议您阅读 mybatis用户指南中的 @Param 标签。这不是您在这里寻找的东西,但它是一种将对象字段名称与 mybatis sql map 变量解耦的方法。在我看来,我会采用您的方法,而不是使用@Param 传递单个字段。

关于对您的 sql 映射进行单元测试,我相当肯定,如果您使用的 ognl 表达式在对象中没有相应的 get 方法,您将获得异常。即,如果您使用#{someField},并且您传入的对象没有getSomeField() 方法,那么您会得到异常。

于 2011-03-23T06:32:11.160 回答