使用 MyBatis 将几个简单对象插入 table

Inserting several simple objects into a table using MyBatis

假设我在这样的数据库中有一个 table:

CREATE TABLE entities( 
    id INT PRIMARY KEY AUTO_INCREMENT,
    friendly_name VARCHAR(100),
    data1 BLOB NOT NULL,
    data2 BLOB NOT NULL,
    loads of other fields
)
ENGINE INNODB;

我有一个 MyBatis Mapper,我想用它来创建一个插入,它只插入 friendly_namedata1data2,但另一个插入 none字段。

我想在映射器中按照这些行创建一个方法:

public void addNewUnverifiedEntity(String friendlyName, byte[] data1, byte[] data2);

我的映射器中有以下内容 xml:

<insert id="addNewUnverifiedEntity" useGeneratedKeys="true" keyProperty="id">
  insert into entities (friendly_name,data1,data2)
  values (#{friendlyName},#{data1},#{data2})
</insert>

但是当我尝试调用映射器方法时出现以下异常:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'data1' cannot be null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
...

在日志输出一点我也看到了这个gem:

16:59:36.754 [main] DEBUG o.a.i.d.pooled.PooledDataSource - Created connection 1110623531.
16:59:36.764 [main] DEBUG java.sql.Connection - ooo Connection Opened
16:59:36.987 [main] DEBUG java.sql.PreparedStatement - ==>  Executing: insert into entities (friendly_name,verified_by,key_digest,key_data) values (?,?,?,?) 
16:59:36.987 [main] DEBUG java.sql.PreparedStatement - ==> Parameters: null, null, null, null

数据似乎并没有真正从映射器转到语句,因此 table。 (我用两个非空字节数组和一个定义的字符串调用了该方法)

我可以看到我可以创建一个 POJO 来只包含这些字段,但我更愿意在我的映射器中使用这种方法。

我该如何使 addNewUnverifiedEntity 之类的方法正常工作?

回答我自己的问题。 似乎在将多个参数发布到 mybatis 映射器时,参数是按它们的位置而不是它们的名称命名的,所以在我的例子中是#{1} #{2} #{3}。为了使映射器 xml 在我的情况下工作(具有有意义的名称),可以使用 @Param 标记对映射器方法参数进行注释。