多个域名绑定同一网站吗,虚拟云手机 免费,在线磁力搜索神器,关于网上商城的推广方法MP详解 一、基础使用1.引入2.Entry中的常用注解3.BaseMapper 、IService、ServiceImpl3.1BaseMapper 3.2IService、ServiceImpl 4.常用配置4.1 application.yml配置4.2 configuration 配置 5.Wrapper6.分页6.1使用分页方式一 7.自定义分页#xff1a;查询指定列7.1 先用MP的分… MP详解 一、基础使用1.引入2.Entry中的常用注解3.BaseMapper 、IService、ServiceImpl3.1BaseMapper 3.2IService、ServiceImpl 4.常用配置4.1 application.yml配置4.2 configuration 配置 5.Wrapper6.分页6.1使用分页方式一 7.自定义分页查询指定列7.1 先用MP的分页只查询出对应记录的id7.2 根据第一步查询到的id在进行定量筛查 8.多数据源8.1引入多数据源依赖8.2.applicaiton编写配置8.3使用 DS 二、代码自动生成1.引入依赖2.编写自动生成代码3.运行展示 三、Mybatis-plus的弊端1.默认分页功能不适合做大数量的分页2.默认的批量插入功能使用的是拆解为多条insert into ,而不是使用一条insert into 3.当数据库字段为空时MP可能会报空指针4.数据库日期类型当数据为空时会出现映射失败的情况5.当数据列为空时结果集会自动过滤掉为空的列返回前端时无该列6.如何写and ( a2 or b3) 这种条件7.如何使用MP进行连接查询 四、可能的异常1.异常InvalidDataAccessApiUsageException: Error attempting to get column taskPlanEndTime from result set. Cause: java.sql.SQLFeatureNotSupportedException 一、基础使用
mybatis-plus中最常用的应该就是他的基础功能了比如BaseMapper、IService、ServiceImpl使用他们三个可以快速完成大部分的增删改查需求。
1.引入
启动类支持两种声明
1.使用MapperScan注解传入Mapper接口的包名。
2.使用ComponentScan注解同时配合Repository注解这样也可以实现上面的功能。
增加依赖这里只是使用BaseMapper、IService、ServiceImpl等基础信息的依赖若是需要做自动化或者其他功能还需要增加其他依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactIdversion2.4.4/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!--引入alibaba的json处理对象--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.70/version/dependency!--引入mybatis的依赖--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.2/version/dependency!--引入连接mysql的驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.38/version/dependency!--引入数据源连接池依赖--dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.19/version/dependency!-- 引入mybatisplus依赖--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version/dependency若是使用必须在Springboot启动类上增加MapperScan这个MapperScan可以帮助我们自动寻找到Mapper接口从而生成Mapper配置文件。这里如果不加MapperScan也可以在每个Mapper接口上增加Mapper注解。其实这里还涉及到怎么寻找Mapper的问题MP默认情况下把自动生成的Mapper配置文件放在资源目录下的mapper文件夹下若是我们手动生成也放到这里的面是不用增加mapper文件的配置信息的
// 启动类代码
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;MapperScan(value com.ebbing.task.mapper)
SpringBootApplication
public class EbbingApplication {public static void main(String[] args) {SpringApplication.run(EbbingApplication.class, args);}
}2.Entry中的常用注解
上面准备好以后就可以开始编写实体类了实体类对应数据库表。若是表名和实体类名相同字段名和数据库字段名也相同数据库使用下划线实体使用驼峰是支持自动转换的也认为相同且主键id就是id则我们无需任何处理MP可以全部帮我们进行自动对其。但有任何不同我们是都需要使用注解进行声明的。
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.time.LocalDateTime;/*** p* * /p** author pcc* since 2023-08-04*/
Data
TableName(tb_task)
Accessors(chain true)
public class TbTask implements Serializable {private static final long serialVersionUID 1L;/*** 主键*/TableId(value task_id, type IdType.AUTO)private Long taskId;/*** 任务名*/private String taskName;/*** 任务描述*/private String taskDesc;/*** 任务文档链接*/private String taskLinkText;/*** 任务脑图连接*/private String taskLinkMap;/*** 任务关键程度: 1 普通,2重要,3很重要,4非常重要*/private Integer deep;/*** 创建时间*/private LocalDateTime createTime;/*** 创建人*/private String createBy;/*** 修改时间*/private LocalDateTime updateTime;/*** 修改人*/private String updateBy;/*** 状态0正常1删除*/TableLogicprivate Integer isDeleted;/*** 数据版本乐观锁*/Versionprivate Integer version;}上面是自动生成的实体类当然和我们手动写没有太大区别总结下其中的注解 注解TableName 主要用以声明实体对应的表此外还支持前缀等其他声明不过基本只使用用来和表作对应当表明和实体类名不一致时需要使用该注解需要特别注意的是实体类的驼峰和表名的下划线是无法完成映射的这点和字段与属性的对应有区别。 注解TableId value用以声明主键是哪个字段type用以声明主键的生成规则默认是无也就是不填充总共支持五种规则①IdType.AUTO: 自增注解对应数据库的auto_increment②IdType.NONE这是默认的行为应该是需要自己去操作的。③IdType.INPUT需要自己输入主键若是插入时没有会报错④IdType.ASSIGN-ID:这是雪花算法生成的id可以用来做分布式服务的主键策略他是支持的。**⑤IdType.**ASSIGN_UUID:这里使用UUID做为主键这个不是一个好的选择UUID对于数据库的BTREE索引来说不够高效范围查询效率很低。 注解TableField 这个注解使用率也是特别高的主要用来声明属性和列的对应关系若只是驼峰和下划线的区别则无需声明若是该字段无需与数据库进行映射可以将 existsfalse,来禁止数据库的映射 select false若是该字段永远不想要被select查询到可以使用select false updateStrategyFieldStrategy.DEFAULT 这是默认值当执行更新策略时忽略null的场景他和NOTNULL等效也就是说传递null不更新如果想要更新可以更改为FieldStrategy.IGNORED意思为忽略判断直接更新此时为null和为空都会更新当然还有别的选择可以根据非null更新非空更新等。 insertStrategyFieldStrategy.DEFAULT这个和上面没有区别只不过是应用插入场景。 fillFieldFill.DEFAULT 默认是不处理如果改为FieldFill.INSERT 即表示新增时必须有值不然报错相当于断言此外还有别的支持具体看源码吧 他除了value、exists、select其他支持的功能比较多不过基本用不到这里不一一列举了 注解TableLogic: 0在使用1已删除这个注解被使用与逻辑删除字段上若是遵循驼峰转下划线的规则则无需多余声明什么只需增加该注解在对应字段上即可。增加该注解有一个前提数据库有该字段且默认值为0。他有两个作用①当增加了该注解后调用BaseMapper的delete方法或者IService的remove方法他们都不会去真正删除记录而是将对应记录的逻辑删除字段更改为1.②当增加了该注解后无论是BaseMapper还是IService的查询方法默认都会增加逻辑删除字段等于0的条件。 注解Version: 这个注解是用来声明乐观锁的注解乐观锁即CAS比较然后交换。使用它有一个前提条件就是我们需要手动增加支持乐观锁的配置如下 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
Configuration
public class MPConfig {Beanpublic MybatisPlusInterceptor getInstance(){MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}增加了上面的配置后MP为自动拦截我们的sql并为我们增加乐观锁的支持了分页其实也需要这个都是一个原理。然后就是Version 有两个作用和一个注意点
* 1.增加乐观锁以后若是我们没有传递这个信息到MP那默认是不适用乐观锁的所以若是使用则必须保证前后端交互时这个字段必须传递。
* 2.只需要增加一个配置和一个注解即可使用乐观锁在更新数据库时MP为自动增加乐观锁的条件比如verison0,满足才会更新
* 3.每次更新记录乐观锁的值都会1.
* 4.需要特别注意的是乐观锁和数据版本不可混为一谈数据版本一般只有审核流程通过才会1乐观锁纯粹是为了防止数据更新时出现错误而设置的如需数据版本应从新声明。3.BaseMapper 、IService、ServiceImpl
这三个才是MP的核心啊只要掌握了他们三个大部分的CRUD就都解决了。
3.1BaseMapper
有时候我们甚至直接使用BaseMapper都是可以的因为这里已经包含了大部分我们需要的方法直接使用他可以满足大部分的功能不过有些需要业务处理的场景我们还是需要写Service的。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ebbing.task.entity.TbDict;/*** p* Mapper 接口* /p** author pcc* since 2023-08-04*/
public interface TbDictMapper extends BaseMapperTbDict {
}如上所示当我们想要写一个Mapper接口时只需要继承BaseMapper同时声明BaseMapper的泛型类这样我们大部分的CRUD的方法都不用写了MP利用这个泛型类通过反射来为我们在resource下的mapper文件夹中自动生成了Mapper的配置文件mvn install后可以看到.这里有一个需要注意的点是若是不在当前接口增加Mapper注解则需要在启动类上增加MapperScan注解同时将Mapper接口所在的文件夹进行声明后面我们就可以直接通过autowired来进行使用这个Mapper了
3.2IService、ServiceImpl
IService是Mp提供的接口里面同样包含了很多CRUD的方法但是他是一个接口所以我们不可能直接使用的所以必须配合ServiceImpl才可以使用ServiceImpl里面正常IService的实现类不过ServiceImpl里面大部分方法还是调用的是BaseMapper的实现所以ServiceImpl声明时我们还需要传入BaseMapper的实现也就是我们自己写的Mapper接口了。
import com.ebbing.task.entity.TbTask;
import com.baomidou.mybatisplus.extension.service.IService;/*** p* 服务类* /p** author pcc* since 2023-08-04*/
public interface ITbTaskService extends IServiceTbTask {
}import com.ebbing.task.entity.TbTask;
import com.ebbing.task.mapper.TbTaskMapper;
import com.ebbing.task.service.ITbTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;/*** p* 服务实现类* /p** author pcc* since 2023-08-04*/
Service
public class TbTaskServiceImpl extends ServiceImplTbTaskMapper, TbTask implements ITbTaskService {
}需要特別注意的是无论是IService还是ServiceImpl都是需要声明泛型的且ServiceImpl是类需要去继承而不是实现这样就完成了所有的接口开发了剩下我们自己写Controller就行了。
4.常用配置
4.1 application.yml配置
mybatis-plus:# 配置Mybatis的配置文件位置这个基本用不到现在都是在application中配置
# config-location: classpath:mybatis-config.xml# 下面是默认配置如果放了下面的位置则无需增加该配置mapper-locations: classpath:mapper/**/*.xml# 这个没有默认别名包扫描需要直接配即可type-aliases-package: com.ebbing.task.entityconfiguration:# 默认值是truecall-setters-on-nulls: true# 默认开启缓存这个是二级缓存cache-enabled: true# 开启控制台日志打印log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:# 这个是和注解TableLogic配合使用的设置后删除数据会将逻辑删除字段设置为1logic-delete-value: 1# 这个是和注解TableLogic配合使用的设置后新增数据会将逻辑删除字段设置为0且查询时会默认携带删除字段为0的条件logic-not-delete-value: 0db-config:# 设置表名前缀这个在实体类中使用若是所有的表都有共同前缀使用这个很方便
# table-prefix: tb_# 这个配置是设置ID自增类型的一般使用AUTO或者ASSIGN_IDid-type: auto4.2 configuration 配置
这里一般就是需要配置分页插件和乐观锁插件因为他们都需要使用拦截器对sql执行进行拦截然后更改sql
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
Configuration
public class MPConfig {Beanpublic MybatisPlusInterceptor getInstance(){MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();// 拦截sql实现分页interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 拦截sql实现乐观锁interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}5.Wrapper
Wrapper也算是MP的一个核心类因为大部分的查询条件都是使用Wrapper来进行拼接的而我们上面使用的BaseMapper、IService中很多都是传入Wrapper或者Wrapper的实现类比如
Long selectCount(Param(ew) WrapperT queryWrapper);ListT selectList(Param(ew) WrapperT queryWrapper);ListMapString, Object selectMaps(Param(ew) WrapperT queryWrapper);ListObject selectObjs(Param(ew) WrapperT queryWrapper);从上面可以看出只要是Wrapper我们都是可以传入的需要特别注意泛型别漏了。 一般使用LambdaQueryWrapper比较多一些因为书写简单注意之类使用时不能忘了泛型。
6.分页
使用MP的分页功能无需导入多余的依赖只需要配置下对Mybatis的sql进行拦截即可。这块代码上面其实也列过了
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
Configuration
public class MPConfig {Beanpublic MybatisPlusInterceptor getInstance(){MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();// 拦截sql实现分页interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 拦截sql实现乐观锁interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}6.1使用分页方式一
在查询时直接传入page和Wrapper这样我们查询的分页结果会直接封装到Page里面若是不需要对数据结构进行更改可以直接返回。 PostMapping(/getTaskItems)public IPageTbTaskItems getTaskItems(TbTaskItemsVO tbTaskItemsVO){PageTbTaskItems page new Page();page.setCurrent(tbTaskItemsVO.getPageIndex());page.setSize(tbTaskItemsVO.getPageSize());iTbTaskItemsService.page(page,null);return page;}7.自定义分页查询指定列
当数据列特别大时比如上千万的表越往后分页就会越久倘若使用mybatis-plus提供的分页很有可能数据会查不出来。完全可以分两步走
7.1 先用MP的分页只查询出对应记录的id
因为id是聚簇索引不需要回表效率会非常的高这样可以快速帮我们定位到记录。那Mybatis-plus怎么做到只查询指定列呢
这里实现方式很多最方便的就是使用Wrapper来进行直接限定查询到得列 PostMapping(/getTaskItems)public IPageTbTaskItems getTaskItems(TbTaskItemsVO tbTaskItemsVO){PageTbTaskItems page new Page();page.setCurrent(tbTaskItemsVO.getPageIndex());page.setSize(tbTaskItemsVO.getPageSize());iTbTaskItemsService.page(page,new LambdaQueryWrapperTbTaskItems().select(TbTaskItems::getTaskId,TbTaskItems::getItemReviewTime,TbTaskItems::getVersion));return page;}7.2 根据第一步查询到的id在进行定量筛查
看起来多了一步其实在数据量大时会提升非常多的性能这也是大部分大数量时分页的一种方案
8.多数据源
适合读写分离时使用使用起来也很简单
8.1引入多数据源依赖
版本和MP保持一致即可 dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion3.5.1/version/dependency8.2.applicaiton编写配置
区别就是相比于一个数据源多配置了一遍而已这里的primary是配置默认数据源的当不在使用时指定就使用该配置指定的数据源strict配置false默认也是false是否强制校验数据源强制的话数据源一旦出错就会报错而不会使用默认的数据源
spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #是否强制校验数据源datasource:master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.150.180:3306/ebbing?characterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseallowMultiQueriestrueuseJDBCCompliantTimezoneShifttrueuseLegacyDatetimeCodefalseserverTimezoneAsia/Shanghaiusername: rootpassword: superslave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.150.180:3306/ebbing2?characterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseallowMultiQueriestrueuseJDBCCompliantTimezoneShifttrueuseLegacyDatetimeCodefalseserverTimezoneAsia/Shanghaiusername: rootpassword: super8.3使用 DS
使用时也很简单直接在对应的Service的实现类或者方法上增加该注解即可该注解只有一个属性value声明为我们的master或者slave就可以正常调用对应的数据源了。
二、代码自动生成
代码生成配置很简单不过内置的是mysql5的驱动支持5.5.45, 5.6.26 and 5.7.6 若是换驱动还得其他配置。默认情况下我们只需要声明url、username、password即可。
1.引入依赖
!-- 引入mybatis-plus依赖 --
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version
/dependency!-- 引入代码自动生成依赖这个依赖必须单独引 --
dependency groupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactIdversion3.5.1/version
/dependency
!-- 官网上没说需要引入这个依赖但是我自己测试时缺少这个依赖运行不了也有可能是多级依赖下载失败了 --
dependency groupIdorg.apache.velocity/groupIdartifactIdvelocity/artifactIdversion1.7/version
/dependency当时引入velocity时下面的包一直进不来所以单独引了下面的包但是其实可以不引因为下面的包是上面包的依赖包会被加载若是加载不出来则需要我们手动去引入
dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactIdversion2.3/version
/dependency2.编写自动生成代码
下面是代码我们只声明了数据库的配置信息然后采用交互式输入作者和包名路径即可这里的包名路径记得一定得是我们项目里的实际的包名路径比如我的项目的根路径是com.example.demo5,我想要自动生成的代码新开一个包叫task那我们输入包名时就应该这么写com.example.demo5.task。后面自动生成的代码路径都是这个了
package com.example.demo5.generage;import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import java.sql.SQLException;/*** p* 快速生成* /p** author pcc* since 2023-08-04*/
public class FastAutoGeneratorTest {static final String URL jdbc:mysql://192.168.150.180:3306/ebbing;static final String USERNAME root;static final String PASSWORD super;/*** 执行 run*/public static void main(String[] args) throws SQLException {FastAutoGenerator.create(//配置数据源new DataSourceConfig.Builder(URL, USERNAME, PASSWORD))// 全局配置: 注意包名需要使用全路径.globalConfig((scanner, builder) - builder.author(scanner.apply(请输入作者名称)).fileOverride())// 包配置.packageConfig((scanner, builder) - builder.parent(scanner.apply(请输入包名)))// 策略配置:内部声明表名.strategyConfig(builder - builder.addInclude(tb_task)).execute();}
}3.运行展示
下面是运行成功的截图
已连接到目标 VM, 地址: 127.0.0.1:5332传输: 套接字
请输入作者名称
pcc
请输入包名
com.example.demo5.task
11:51:38.854 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator - 准备生成文件...
Fri Aug 04 11:51:39 CST 2023 WARN: Establishing SSL connection without servers identity verification is not recommended. According to MySQL 5.5.45, 5.6.26 and 5.7.6 requirements SSL connection must be established by default if explicit option isnt set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to false. You need either to explicitly disable SSL by setting useSSLfalse, or set useSSLtrue and provide truststore for server certificate verification.
11:51:39.529 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 执行SQL:show table status WHERE 11 AND NAME IN (tb_task)
11:51:39.545 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 返回记录数:1,耗时(ms):14
11:51:39.563 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 执行SQL:show full fields from tb_task
11:51:39.578 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 返回记录数:11,耗时(ms):14
11:51:39.603 [main] DEBUG org.apache.velocity - CommonsLogLogChute name is org.apache.velocity
11:51:39.604 [main] DEBUG org.apache.velocity - Initializing Velocity, Calling init()...
11:51:39.604 [main] DEBUG org.apache.velocity - Starting Apache Velocity v1.7 (compiled: 2010-11-19 12:14:37)
11:51:39.604 [main] DEBUG org.apache.velocity - Default Properties File: org\apache\velocity\runtime\defaults\velocity.properties这里只展示了部分的执行成功信息默认情况下代码会生成在D盘下面的我们声明的路径中。
三、Mybatis-plus的弊端
1.默认分页功能不适合做大数量的分页
在第一章第7节已说过该部分
2.默认的批量插入功能使用的是拆解为多条insert into ,而不是使用一条insert into
如果需要考虑到效率这种需要自己写批量新增的功能如果表数据量比较大最好是自己写批量新增的功能而不是使用mybatis-plus来使用他的批量新增功能
3.当数据库字段为空时MP可能会报空指针
这里原因是因为默认3.5.1情况下查询的值即使为null也会将值set到对应的实体中若是想要禁止这种情况有两种方案。
①在字段上增加注解TableField(existfalse)这样当这个配置是忽略这个字段与数据库的映射 ②全局配置增加mybatis-plus.configuration.call-setters-on-nullsfalse,这是为全局的字段增加这个配置试了不好使
4.数据库日期类型当数据为空时会出现映射失败的情况
核心问题应该还是数据源的问题也看到了这部分问题的解释。
解决的方法有以下几种
1.增加针对LocalDateTime的序列化操作试了不好使
2.更换druid数据源试了不好使
3.升级druid升级出现问题操作中断
4.数据库字段使用date代替datetime对应java里的LocalDate试了不好使
5.增加某个jar说是解决这个问题试了不好使
6.取消数据库字段datetime使用了String最后实在没办法用了下下策5.当数据列为空时结果集会自动过滤掉为空的列返回前端时无该列
这个问题解决办法
①。配置mybatis-plus的配置
mybatis-plus:configuration:# 默认值是true即即使查询的值为null也会进行set这会导致空指针所以改为falsecall-setters-on-nulls: true②或者使用mybatis的配置也是这个配置
mybatis:configuration:call-setters-on-nulls: true③若是以上都不行建议换个http客户端工具我的就是工具问题找了半天换了个工具正常了离了大浦
6.如何写and ( a2 or b3) 这种条件
如下 wrapper.and(i - i.eq(T::getA, 2).or().eq(T::getB, 3)); and()方法接收一个函数式接口作为参数,在函数里我们可以写出一个完整的条件表达式。 示例中我们写了:
i.eq(T::getA, 2) 表示 a 2i.or() 表示或条件i.eq(T::getB, 3) 表示 b 3 将这些条件通过or()组合起来,就可以表达一个and (a 2 or b 3)的条件。 and()方法会将这整个条件表达式作为一个单元进行组合。
7.如何使用MP进行连接查询
以下方法3.4.2才开始支持
wrapper.innerjoin(右表字段左表字段)
wrapper.leftjoin(右表字段左表字段)
四、可能的异常
1.异常InvalidDataAccessApiUsageException: Error attempting to get column ‘taskPlanEndTime’ from result set. Cause: java.sql.SQLFeatureNotSupportedException
异常各版本
druid:1.1.11
Mybatis-plus:3.4.1
Mysql:5.7使用了低版本的Druid数据源。这个低版本的Druid数据源不支持JDK8中的LocalDate、LocalTime、LocalDateTime等日期类型所以导致了异常的发生。
为了解决这个问题你可以下载一个高于或等于1.1.21版本的Druid依赖并将其添加到你的项目中。你可以在你的项目的pom.xml文件中添加以下依赖项
dependency
groupIdcom.alibaba/groupId
artifactIddruid-spring-boot-starter/artifactId
version1.1.21/version
/dependency这样你就可以使用支持JDK8日期类型的Druid数据源从而解决InvalidDataAccessApiUsageException异常