假设我在这样的数据库中有一个表:
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_name
,data1
和data2
但不会插入其他字段的插入内容。
我想在mapper中沿着这些行创建一个方法:
public void addNewUnverifiedEntity(String friendlyName, byte[] data1, byte[] data2);
我在mapper xml中有以下内容:
<insert id="addNewUnverifiedEntity" useGeneratedKeys="true" keyProperty="id">
insert into entities (friendly_name,data1,data2)
values (#{friendlyName},#{data1},#{data2})
</insert>
但是当我尝试调用mapper方法时,我得到以下异常:
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)
...
在日志输出中我也看到了这个宝石:
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
数据似乎实际上并不是从mapper到语句,因此也就是表。 (我用两个非空字节数组和一个定义的字符串调用该方法)
我可以看到我可以创建一个仅包含这些字段的POJO,但我更愿意在我的映射器中使用该方法。
我究竟如何制作像addNewUnverifiedEntity这样的方法?
答案 0 :(得分:1)
回答我自己的问题。 似乎在将几个参数发布到mybatis映射器时,参数是按其位置而不是其名称命名的,因此在我的情况下#{1}#{2}#{3}。为了使mapper xml在我的情况下工作(使用有意义的名称),可以使用@Param标记注释mapper方法参数。