插入&时,MyBatis将属性映射到数据库列更新(使用注释)

时间:2011-03-20 16:47:15

标签: annotations ibatis mybatis

我刚刚开始学习MyBatis,我想知道,当我创建插入或更新查询时,是否有一种方法可以使属性名称对重构更友好?我会更详细地解释一下:

我的所有域类中都有常量,可用于引用属性名称。在我看来,它减少了拼写错误并使重构更容易。

public static final String FIRST_NAME = "firstName";
private String firstName = "";

当我使用注释创建MyBatis select语句时,我可以这样做:

@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的映射。想法?

1 个答案:

答案 0 :(得分:1)

  

这是我应该关注的事情吗?   我自己用?

我不这么认为。我理解你的担忧,我看到这样一个功能对你有什么好处,特别是在POJO经常发生变化的早期开发过程中。

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

我建议您阅读mybatis user guide中的@Param标记。这不是你在这里寻找的,但它是一种将对象字段名称解耦为mybatis sql map变量的方法。在我看来,我会采用你的方法来通过@Param来传递个别的场地。

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