SpringBoot整合Mybatis LocalDateTime 映射失效

本文介绍了在SpringBoot集成Mybatis时遇到的LocalDateTime映射失效问题,详细分析了具体原因——Mybatis 3.5.3默认不支持Java8的日期时间类型。并提供了两种解决办法,包括引入类型转换依赖和配置Mybatis的配置文件。通过解决问题,作者强调了提升自身能力的重要性。

SpringBoot整合Mybatis LocalDateTime 映射失效

一、概述

最近在开发一个项目,在使用SpringBoot继承Mybatis时,做单元测试时,由于需要根据参数(类型LocaDateTime)去更新数据,发现更新记录为0。刚开始以为是没有提交事务(Mybatis默认没有开启自动提交),后来句时,是能成功的。所以排除没有提交事务。

二、具体原因

在实体PO类里面,可以使用Java.sql.Date,Java.sql.Timestamp,java.util.Date来映射到数据库date,timestamp,datetime。但是这些类许多方法都已经过时。
Java8的API的LocalDate,LocalDateTime,LocalTime,现在比较常用。但是,
我mybatis的版本(3.5.3)是不支持Java8的日期、时间。(默认情况下,Mybatis是不支持Java8的时间和日期)

三、解决办法

1.引入类型转换的依赖

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-typehandlers-jsr310</artifactId>
            <version>1.0.1</version>
        </dependency>

2.在Mybatis.config.xml文件配置

<typeHandlers>
	<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
	<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
	<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
	<typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
	<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
	<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
	<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
</typeHandlers>
四、总结

发现问题,并解决问题,也一种能力的提升。以上如果有错,还望多多指正。

参考:
<think>我们正在讨论在Spring Boot 3项目中集成MyBatis-Plus。根据引用[1][3][4],MyBatis-Plus是一个强大的MyBatis扩展工具,提供了许多便捷功能。下面将分步骤详细说明如何集成和使用。 ### 1. 添加MyBatis-Plus依赖 在`pom.xml`中添加MyBatis-Plus的Spring Boot Starter依赖。注意:**Spring Boot 3需要对应的MyBatis-Plus Starter版本(至少3.5.4以上)**。同时,避免同时引入`mybatis-spring-boot-starter`(普通MyBatis Starter)和`mybatis-plus-boot-starter`,以免冲突[^2][^5]。 ```xml <dependencies> <!-- MyBatis-Plus for Spring Boot 3 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.6</version> <!-- 请检查最新版本 --> </dependency> <!-- 数据库驱动(以MySQL为例) --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> </dependencies> ``` ### 2. 配置数据源和MyBatis-Plus 在`application.properties`(或`application.yml`)中配置数据源和MyBatis-Plus相关属性[^4]: ```properties # 服务器端口 server.port=8080 # 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # MyBatis-Plus配置 # 指定Mapper XML文件位置(如果有) mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml # 开启SQL日志打印 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 配置实体扫描包(用于别名设置) mybatis-plus.type-aliases-package=com.example.entity ``` ### 3. 创建实体类和Mapper接口 - **实体类**:使用`@TableName`注解指定表名(若表名与类名不一致)[^1][^3]。 ```java import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.IdType; @TableName("user") // 如果表名是"user",可省略 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; // 省略getter/setter } ``` - **Mapper接口**:继承`BaseMapper`并添加`@Mapper`注解(或在启动类使用`@MapperScan`)[^1][^3]。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper // 单个Mapper添加注解 public interface UserMapper extends BaseMapper<User> { // 无需编写基础CRUD方法,BaseMapper已提供 } ``` 或者,在启动类统一扫描: ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.mapper") // 替换为你的Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 4. 使用MyBatis-Plus的高级特性 MyBatis-Plus提供多种增强功能,按需启用: - **自动填充**:实现`MetaObjectHandler`接口处理创建时间、更新时间等字段[^1]。 ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); } } ``` - **逻辑删除**:在实体类字段添加`@TableLogic`,配置全局逻辑删除值[^1]。 ```java public class User { @TableLogic private Integer deleted; // 0表示未删除,1表示删除 } ``` 配置(可选,默认值已为0/1): ```properties mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 ``` - **分页插件**:添加分页拦截器[^1][^3]。 ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` ### 5. 在Service中调用Mapper 通过继承`ServiceImpl`快速实现Service层: ```java public interface UserService extends IService<User> { // 自定义方法 } @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { // 直接使用baseMapper进行CRUD操作 } ``` 在Controller中注入: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping public List<User> list() { return userService.list(); // 调用BaseMapper的list方法 } } ``` ### 6. 验证与调试 - 启动应用,检查是否成功加载MyBatis-Plus。 - 访问API测试CRUD功能。 - 查看控制台输出的SQL日志(配置了`log-impl=StdOutImpl`)[^4]。 ### 注意事项 1. **依赖冲突**:确保未同时引入`mybatis-spring-boot-starter`和`mybatis-plus-boot-starter`[^2][^5]。 2. **版本匹配**:Spring Boot 3需使用`mybatis-plus-spring-boot3-starter`(版本≥3.5.4)[^3]。 3. **XML配置**:若有自定义SQL,将XML文件放入`src/main/resources/mapper/`目录(与配置的`mapper-locations`一致)[^4]。 通过以上步骤,即可在Spring Boot 3项目中成功集成MyBatis-Plus,并利用其增强功能提升开发效率[^1][^3][^4]。 §§相关问题§§ 1. MyBatis-Plus的自动填充功能如何实现自定义填充策略? 2. 如何配置MyBatis-Plus的多数据源支持? 3. MyBatis-Plus的分页插件在复杂查询中如何正确使用? 4. Spring Boot 3中MyBatis-Plus与普通MyBatis的主要区别是什么? [^1]: MyBatis-Plus 官方文档 [^2]: mybatis-plus-boot-starter与mybatis-spring-boot-starter的冲突说明 [^3]: 【Spring Boot】整合MybatisMybatis-plus [^4]: Spring Boot3.3.X整合Mybatis-Plus的配置示例 [^5]: mybatis-spring-boot-starter和mybatis-plus-spring-boot3-starter冲突的解决</think>### 在 Spring Boot 3 中集成 MyBatis-Plus 的完整指南 #### 1. **添加依赖**(关键步骤) 在 `pom.xml` 中添加 **MyBatis-Plus Spring Boot 3 专用 Starter**: ```xml <dependency> <groupId>com.baomidou</groupId> <!-- 注意:Spring Boot 3 需要使用专用 starter --> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.6</version> <!-- 检查官网获取最新版本 --> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> ``` ⚠️ **重要提示**: - 不要同时引入 `mybatis-spring-boot-starter` 和 `mybatis-plus-spring-boot3-starter`,否则会导致冲突[^2][^5] - 如果从旧版本升级,需先移除旧版依赖: ```xml <!-- 删除旧版依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>xxx</version> <!-- 移除此行 --> </dependency> ``` #### 2. **配置数据源** 在 `application.properties` 中配置数据库连接: ```properties # 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # MyBatis-Plus 配置 mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml # XML映射文件位置 mybatis-plus.type-aliases-package=com.example.entity # 实体类包路径 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 ``` #### 3. **创建实体类和Mapper** ```java // 实体类 (User.java) import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.IdType; @TableName("user") // 对应数据库表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; // getter/setter省略 } ``` ```java // Mapper接口 (UserMapper.java) import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper // 必须添加此注解 public interface UserMapper extends BaseMapper<User> { // 无需编写基础CRUD方法 } ``` #### 4. **配置Mapper扫描**(二选一) **方式1**:在启动类添加注解 ```java @SpringBootApplication @MapperScan("com.example.mapper") // 指定Mapper接口包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` **方式2**:在配置类中配置 ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` #### 5. **使用MyBatis-Plus特性** ```java // Service层示例 @Service public class UserService { @Autowired private UserMapper userMapper; // 查询所有用户 public List<User> findAll() { return userMapper.selectList(null); // 使用内置方法 } // 分页查询 public Page<User> findPage(int current, int size) { Page<User> page = new Page<>(current, size); return userMapper.selectPage(page, null); } } ``` #### 6. **启用高级功能** 在配置类中添加插件: ```java @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 乐观锁插件(需在实体类字段添加@Version) interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 动态表名插件 // interceptor.addInnerInterceptor(new DynamicTableNameInnerInterceptor(...)); return interceptor; } ``` #### 7. **验证集成** 创建测试类验证: ```java @SpringBootTest class UserMapperTest { @Autowired private UserMapper userMapper; @Test void testSelect() { List<User> users = userMapper.selectList(null); Assertions.assertTrue(users.size() > 0); users.forEach(System.out::println); } } ``` #### ⚠️ **常见问题解决** 1. **启动报错 `BeanDefinitionStoreException`**: - 检查是否同时存在 `mybatis-spring-boot-starter` 和 `mybatis-plus-spring-boot3-starter`[^5] - 确认使用 `@Mapper` 或 `@MapperScan` 扫描接口 2. **SQL不生效**: ```properties # 增加日志级别 logging.level.com.baomidou.mybatisplus=DEBUG logging.level.org.springframework.jdbc=TRACE ``` 3. **分页失效**: - 确认已配置 `PaginationInnerInterceptor` - 检查Page对象参数是否正确传递 4. **Spring Boot 3兼容问题**: - 必须使用 `mybatis-plus-spring-boot3-starter`(非旧版starter) - JDK要求 ≥ 17 #### 最佳实践建议 1. **使用代码生成器**:通过 [MyBatis-Plus Generator](https://baomidou.com/pages/779a6e/) 快速生成实体/Mapper/Service代码 2. **启用性能分析插件**(开发环境): ```java @Bean @Profile({"dev", "test"}) // 只在开发测试环境启用 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor interceptor = new PerformanceInterceptor(); interceptor.setMaxTime(1000); // SQL执行最大时间(ms) interceptor.setFormat(true); // 格式化SQL return interceptor; } ``` 3. **逻辑删除配置**: ```properties # 全局配置 mybatis-plus.global-config.db-config.logic-delete-field=deleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 ``` 通过以上步骤,您可以在Spring Boot 3中成功集成MyBatis-Plus,并使用其强大的CRUD操作、分页、乐观锁等功能提升开发效率[^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值