下面我来详细讲解“解决mybatis-plus使用jdk8的LocalDateTime查询时报错的方法”的完整攻略。
问题描述
在使用mybatis-plus时,如果使用了jdk8的LocalDateTime
类型进行查询操作,可能会出现以下的错误:
There is no TypeHandler found for property xxxx
这是由于mybatis-plus没有自带LocalDateTime
类型的类型处理器,而导致无法解析该属性的错误。下面,我会提供两种解决方法来解决这个问题。
解决方法一:添加自定义类型处理器
第一种解决方法是添加自定义类型处理器来解决该问题。在mybatis-plus中,我们可以自定义一些类型处理器来解析自己需要的类型。具体操作步骤如下:
- 自定义类型处理器类
我们可以编写一个自定义的LocalDateTimeHandler
类来处理LocalDateTime
类型。
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.parsers.JsqlParserCountOptimize;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;
import org.apache.ibatis.session.Configuration;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.time.LocalDateTime;
public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
ps.setObject(i, parameter.toString());
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return StringUtils.isBlank(value) ? null : LocalDateTime.parse(value);
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return StringUtils.isBlank(value) ? null : LocalDateTime.parse(value);
}
@Override
public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return StringUtils.isBlank(value) ? null : LocalDateTime.parse(value);
}
}
- 注册自定义类型处理器
接下来,我们需要在mybatis的配置文件中注册该类型处理器。可以在mybatis-config.xml
文件中添加以下的配置:
<configuration>
<typeHandlers>
<typeHandler javaType="java.time.LocalDateTime" handler="com.example.LocalDateTimeHandler"/>
</typeHandlers>
</configuration>
其中,javaType
指定要处理的类型,handler
指定处理该类型的自定义处理器类。
- 配置
SqlSessionFactory
最后,在配置SqlSessionFactory
时,需要在其构造函数中指定mybatis的配置文件,这样便可以生效了。
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("com.example.dto");
// 添加Mybatis插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 设置Mybatis配置文件
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setConfigLocation(resolver.getResource("classpath:mybatis-config.xml"));
sessionFactory.setPlugins(new Interceptor[]{interceptor});
return sessionFactory.getObject();
}
这样,我们就成功添加了自定义类型处理器,可以解决该问题。
解决方法二:使用Java8DateTypeHandler
第二种解决方法是使用mybatis-plus提供的Java8DateTypeHandler
类进行解决。需要添加以下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.2</version>
</dependency>
添加完成后,只需要在mybatis的配置文件中添加以下的配置:
<configuration>
<typeHandlers>
<typeHandler handler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<typeHandler handler="com.baomidou.mybatisplus.extension.handlers.MybatisDefaultParameterHandler"/>
<!-- 对应jdk8+ 的时间类 -->
<typeHandler handler="com.baomidou.mybatisplus.extension.handlers.Java8DateTypeHandler"/>
</typeHandlers>
</configuration>
在配置SqlSessionFactory
时,同样需要指定mybatis的配置文件。这个方法比方法一简单,但需要添加额外的依赖。
总结
以上就是解决mybatis-plus使用jdk8的LocalDateTime查询时报错的方法的完整攻略,包括了自定义类型处理器和使用Java8DateTypeHandler
两种方法,并提供了相应的示例代码。通过以上方法,我们可以有效解决上述的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决mybatis-plus使用jdk8的LocalDateTime 查询时报错的方法 - Python技术站