一、简介
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
测试问题现象:测试mabatis的crud方法
增加 批量删除都没有问题 单单就是这个根据ID删除有问题
解决方案:真的就是pom文件的问题
自己的版本是IntelliJ IDEA 2022.3.3 (Ultimate Edition)
创建springboot使用的是阿里云的镜像源 http://start.aliyun.com
JDK1.8
问题就是在项目初始化的时候 这个pom文件会加载很多目前不是很明白的一些依赖,虽然pom文件没有报错 但是会影响后面mybatis默认的crud的测试方法。索性全部删除自己一点一点加依赖文件,参考文章
Mybatis-Plus学习总结(超详细整理) - 知乎
快速开始官网地址:
快速开始 | MyBatis-Plus
二、搭建过程
pom
这里感觉最重要的两个依赖就是mysql和mabatis-plus的依赖,这块不是很熟悉,还要学习下。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wang</groupId><artifactId>DemoMybatis</artifactId><version>0.0.1-SNAPSHOT</version><name>DemoMybatis</name><description>DemoMybatis</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!--mybatis-plus 是自己开发的,非官方的!--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1.tmp</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--fastjson 是阿里巴巴开源的JSON解析器,性能优于 Gson、Jackson 等--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><!--digest 是一个密码加密工具,可以生成MD5、SHA1、SHA256、SHA512等加密--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>q
启动类
启动类这里必须加的一个mapperscan注解是为了让springboot扫描到mapper文件,非常重要,必须加!
package com.wang;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @MapperScan(basePackages = "com.wang.mapper") @SpringBootApplication public class DemoMybatisApplication {public static void main(String[] args) {SpringApplication.run(DemoMybatisApplication.class, args);}}
yml文件
yml文件这里的细节处理就是
map-underscore-to-camel-case: false
#默认情况下mabatis-plus会对字段名进行驼峰命名法和下划线之间的转换。如果你的数据库字段名是驼峰命名法而不是下划线命名法 这里设置false,如果不明白可以根据日志打印,这里调试true,false测试一下就明白了。需要注意的是 #map-underscore-to-camel-case 配置放在 mybatis-plus.configuration 下,而不是在 mybatis-plus 的根级别。
server:port: 8090 spring:datasource:url: jdbc:mysql://localhost:3307/JWT?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver # type: com.alibaba.druid.pool.DruidDataSourcemybatis-plus:global-config:db-config:logic-delete-field: deletedlogic-delete-value: 1logic-not-delete-value: 0configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false#默认情况下会对字段名进行驼峰命名法和下划线之间的转换。如果你的数据库字段名是驼峰命名法而不是下划线命名法#map-underscore-to-camel-case 配置放在 mybatis-plus.configuration 下,而不是在 mybatis-plus 的根级别。mapper-locations: classpath:/mapper/*.xmltype-aliases-package: com.wang.demo_mybatis.entity
实体类
package com.wang.entity;import com.baomidou.mybatisplus.annotation.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;/*** @Author wang* @Date 2024/5/29 16:25* @PackageName:com.wang.demo2_token.entity* @ClassName: ProductDetails* @Description: TODO 商品明细 这里测试的是mybatis-plus的注解,和mybatis的xml配置方式 默认的CRUD操作* @Version 1.0*/ @Data @NoArgsConstructor @AllArgsConstructor @TableName("productdetails") public class ProductDetails implements Serializable {/*** ProductID INT AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID,主键,自增', -- 商品ID,主键,自增* ProductName VARCHAR(255) NOT NULL COMMENT '商品名称', -- 商品名称* Description TEXT COMMENT '商品描述', -- 商品描述* Price DECIMAL(10, 2) NOT NULL COMMENT '商品价格', -- 商品价格,十进制数,精度为10,标度为2* StockQuantity INT NOT NULL COMMENT '库存数量', -- 库存数量* CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 创建时间,默认值为当前时间戳* UpdatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -- 更新时间,默认值为当前时间戳,在记录更新时自动更新* IsDeleted int DEFAULT 0 COMMENT '逻辑删除字段'*/@TableId(type = IdType.AUTO)private Long ProductID;private String productName;private String description;private double price;private int stockQuantity;//创建时间,插入数据时操作@TableField(fill = FieldFill.INSERT)private String createdAt;//更新时间,插入和更新是操作@TableField(fill = FieldFill.INSERT_UPDATE)private String updatedAt;@TableLogicprivate int isDeleted;}
mapper
extends BaseMapper<泛型>
@Mapper public interface ProductDetailsMapper extends BaseMapper<ProductDetails> {
mapper.xml
快捷键创建
测试类
快捷键创建测试类
@Slf4j @SpringBootTest class ProductDetailsMapperTest { @Autowired private ProductDetailsMapper productDetailsMapper;//测试删除商品详情@Testpublic void testDelete() {productDetailsMapper.deleteById(9); // productDetailsMapper.delete(null);System.out.println("删除成功");}
三、总结
遇到问题,一开始可以根据分析控制台日志,观察输出信息,甚至是观察数据,一点一点攻克。
如果事与愿违,重新new一个项目,忘掉所有的知识,经验,习惯,像刚接触这个知识一样,一步一步搭建一步一步测试,这样就能印象深刻这个问题为什么会发生了。