自定义 TypeHandler 中的 Mybatis 空配置对象
Mybatis null configuration object inside custom TypeHandler
我正在编写自定义 JsonTypeHandler
,代码工作正常,但我想访问扩展 BaseTypeHandler
的配置字段,它似乎总是空的。
为什么它是空的?我在这里遗漏了什么吗?
自定义 JsonTypeHandler:您可以忽略下面代码中的方法。
@MappedTypes({ JsonObject.class })
@MappedJdbcTypes({JdbcType.NVARCHAR})
public class JsonTypeHandler extends BaseTypeHandler<JsonObject> {
private String sqlDialect;
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JsonObject parameter, JdbcType jdbcType)
throws SQLException {
String parameterAsString = new Gson().toJson(parameter, JsonObject.class);
ps.setString(i, parameterAsString);
}
@Override
public JsonObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if (null != sqlJson) {
return new Gson().fromJson(sqlJson, JsonObject.class);
}
return null;
}
@Override
public JsonObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if (null != sqlJson) {
return new Gson().fromJson(sqlJson, JsonObject.class);
}
return null;
}
@Override
public JsonObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if (null != sqlJson) {
return new Gson().fromJson(sqlJson, JsonObject.class);
}
return null;
}
}
mybatis-config.xml
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeHandlers>
<typeHandler handler="com.dummy.JsonTypeHandler" javaType="com.google.gson.JsonObject"/>
</typeHandlers>
<databaseIdProvider type="DB_VENDOR">
<property name="PostgreSql" value="postgres"></property>
</databaseIdProvider>
<mappers>
<!--mappers-->
</mappers>
</configuration>
spring-context.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation"
value="classpath:com/dummy/mybatis/mybatis-config.xml"/>
<property name="dataSource" ref="postgresDataSource"/>
</bean>
版本:
dependency 'org.mybatis:mybatis:3.4.1'
mavenBom 'org.springframework:spring-framework-bom:5.2.6.RELEASE'
我的目的是从 BaseTypeHandler
中的配置对象中获取 databaseId
。希望片段是可重现的。
如本 issue 中所述,字段 BaseTypeHandler.configuration
是错误添加的,计划删除。
您可以在设置必要的属性后注册类型处理程序的实例,而不是注册 Class
。
它看起来像这样:
JsonTypeHandler handler = new JsonTypeHandler(configuration);
configuration.getTypeHandlerRegistry().register(..., handler, ...);
我正在编写自定义 JsonTypeHandler
,代码工作正常,但我想访问扩展 BaseTypeHandler
的配置字段,它似乎总是空的。
为什么它是空的?我在这里遗漏了什么吗?
自定义 JsonTypeHandler:您可以忽略下面代码中的方法。
@MappedTypes({ JsonObject.class })
@MappedJdbcTypes({JdbcType.NVARCHAR})
public class JsonTypeHandler extends BaseTypeHandler<JsonObject> {
private String sqlDialect;
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JsonObject parameter, JdbcType jdbcType)
throws SQLException {
String parameterAsString = new Gson().toJson(parameter, JsonObject.class);
ps.setString(i, parameterAsString);
}
@Override
public JsonObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if (null != sqlJson) {
return new Gson().fromJson(sqlJson, JsonObject.class);
}
return null;
}
@Override
public JsonObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if (null != sqlJson) {
return new Gson().fromJson(sqlJson, JsonObject.class);
}
return null;
}
@Override
public JsonObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if (null != sqlJson) {
return new Gson().fromJson(sqlJson, JsonObject.class);
}
return null;
}
}
mybatis-config.xml
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeHandlers>
<typeHandler handler="com.dummy.JsonTypeHandler" javaType="com.google.gson.JsonObject"/>
</typeHandlers>
<databaseIdProvider type="DB_VENDOR">
<property name="PostgreSql" value="postgres"></property>
</databaseIdProvider>
<mappers>
<!--mappers-->
</mappers>
</configuration>
spring-context.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation"
value="classpath:com/dummy/mybatis/mybatis-config.xml"/>
<property name="dataSource" ref="postgresDataSource"/>
</bean>
版本:
dependency 'org.mybatis:mybatis:3.4.1'
mavenBom 'org.springframework:spring-framework-bom:5.2.6.RELEASE'
我的目的是从 BaseTypeHandler
中的配置对象中获取 databaseId
。希望片段是可重现的。
如本 issue 中所述,字段 BaseTypeHandler.configuration
是错误添加的,计划删除。
您可以在设置必要的属性后注册类型处理程序的实例,而不是注册 Class
。
它看起来像这样:
JsonTypeHandler handler = new JsonTypeHandler(configuration);
configuration.getTypeHandlerRegistry().register(..., handler, ...);