MetaObjectHandler没有对xml里面的insert语句生效
时间: 2023-08-04 13:28:45 浏览: 62
MetaObjectHandler 是 MyBatis 框架中用于处理对象映射的一个接口,它主要用于在 MyBatis 执行数据库操作时,将 Java 对象转换为数据库中的数据类型。MetaObjectHandler 通常用于自动填充实体类中的一些公共字段,例如创建时间、更新时间等。
如果您在使用 MyBatis 执行数据库插入操作时发现 MetaObjectHandler 没有对 XML 中的 insert 语句生效,可能是因为您没有正确配置 MetaObjectHandler。您需要在 MyBatis 的配置文件中,将 MetaObjectHandler 的实现类配置为全局的 MetaObjectHandler,以确保它能够被正确地加载和使用。
例如,您可以在 MyBatis 的配置文件中添加以下配置:
```
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeHandlers>
<typeHandler javaType="java.time.LocalDateTime" handler="com.example.MyMetaObjectHandler"/>
</typeHandlers>
<objectFactory type="org.apache.ibatis.session.defaults.DefaultObjectFactory"/>
<objectWrapperFactory type="org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory"/>
<reflectorFactory type="org.apache.ibatis.reflection.DefaultReflectorFactory"/>
<plugins>
<plugin interceptor="com.example.MyPlugin">
<property name="key" value="value"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/apache/ibatis/builder/AuthorMapper.xml"/>
</mappers>
<metaObjectHandler type="com.example.MyMetaObjectHandler"/>
</configuration>
```
在上面的配置中,您可以看到配置了一个名为 `MyMetaObjectHandler` 的类作为 MetaObjectHandler 的实现类。在 `<metaObjectHandler>` 标签中,将这个类的完整路径指定为 type 的值,即可配置全局的 MetaObjectHandler。
注意,这里的配置是针对全局的 MetaObjectHandler,如果您需要为特定的 Mapper 配置 MetaObjectHandler,可以在对应的 Mapper XML 文件中添加 `<insert>` 标签,并在其中指定 `metaObject` 属性,例如:
```
<insert id="insert" parameterType="com.example.User">
<selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
SELECT nextval('user_seq')
</selectKey>
INSERT INTO users (id, name, created_at, updated_at)
VALUES (#{id}, #{name}, #{createdAt}, #{updatedAt})
</insert>
```
在上面的例子中,如果您需要为 `User` 类型的对象设置 `createdAt` 和 `updatedAt` 字段,可以在 `User` 类中添加 `@TableField(fill = FieldFill.INSERT)` 注解,并在 `<insert>` 标签中指定 `metaObject` 属性,例如:
```
<insert id="insert" parameterType="com.example.User" metaObject="userMetaObject">
<selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
SELECT nextval('user_seq')
</selectKey>
INSERT INTO users (id, name, created_at, updated_at)
VALUES (#{id}, #{name}, #{created_at}, #{updated_at})
</insert>
```
在上面的例子中,`metaObject` 属性的值为 `userMetaObject`,这是一个在 Mapper XML 文件中定义的 `<meta>` 标签,它指定了一个名为 `userMetaObject` 的 MetaObjectHandler 实例。在 `User` 类中添加 `@TableField(fill = FieldFill.INSERT)` 注解后,MetaObjectHandler 将自动填充 `createdAt` 和 `updatedAt` 字段。