SpringBoot + MybatisPlus 整合记录
- 1. 硬件软件基本信息
- 2. 相关链接
- 3. 通过idea快速生成一个Springboot项目
- 4. 启动报错问题解决
- 问题一:Springboot启动的时候报错提示 “没有符合条件的Bean关于Mapper类型”
- 问题二:启动的时候提示需要一个Bean,但是发现了两个Bean
- 问题三:没有找到对应的statement
1. 硬件软件基本信息
2. 相关链接
JDK1.8.0_361下载地址
Maven-3.9.6 下载地址
Mybatis-Plus 官方文档
3. 通过idea快速生成一个Springboot项目
大致快速生成springBoot项目的有两种方法
方式一:使用maven生成
方式二:使用springBoot生成
我这里直接选用第二种,第一种可以 点击链接 学习学习
注意事项:
如果想生成 JDK8 的项目但是下拉没有这个版本:
那是因为 Spring2.X 版本在2023年11月24日停止维护了,因此创建 Spring 项目时不再有 2.X 版本的选项,只能从 3.1.X 版本开始选择,而 Spring3.X 版本不支持 JDK8,JDK11,最低支持JDK17,因此 JDK11 也无法选择了。
所以需要替换服务地址为阿里云的就可以了
初始地址Server URL:http://start.springboot.io/
替换地址Server URL:https://start.aliyun.com/
点击下一步然后选择需要初始化的依赖了,一般就spring web,lombok等等,其他的就基本上需要啥就自己添加上,一般还有mysql,mybatis,不过我们有mybatis-plus,就不需要mybatis的依赖了
最后点击create就可以完成一个Springboot项目的创建了
目录结构
这里我简单的创建了Controller,Service,Mapper等目录,结构如下
Controller 代码如下
package com.fan.sd.demos.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fan.sd.demos.VO.TestInfo;
import com.fan.sd.demos.service.ITestInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/testInfo")
public class TestInfoController {
@Autowired
public ITestInfoService iTestInfoService;
@PostMapping("getTestInfo")
public TestInfo getTestInfo() {
// 使用Wrapper进行快速查询
// LambdaQueryWrapper<TestInfo> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.eq(TestInfo::getId,"1");
// return iTestInfoService.getOne(queryWrapper);
return iTestInfoService.selectById1("1");
}
}
接口类信息如下
接口类要继承 IService 类
package com.fan.sd.demos.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fan.sd.demos.VO.TestInfo;
public interface ITestInfoService extends IService<TestInfo> {
/**
* 查询测试信息
*/
TestInfo selectById1(String id);
/**
* 插入测试信息
*/
void insertTestInfo(TestInfo testInfo);
/**
* 删除测试信息
*/
void deleteTestInfo(Long id);
/**
* 修改测试信息
*/
void updateTestInfo(TestInfo testInfo);
}
实现类信息如下
这里实现类要实现接口类,然后继承Mybatis-Plus的 ServiceImpl 类
package com.fan.sd.demos.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fan.sd.demos.VO.TestInfo;
import com.fan.sd.demos.mapper.TestInfoMapper;
import com.fan.sd.demos.service.ITestInfoService;
import org.springframework.stereotype.Service;
@Service
public class TestInfoServiceImp extends ServiceImpl<TestInfoMapper, TestInfo> implements ITestInfoService {
@Override
public TestInfo selectById1(String id) {
return baseMapper.selectById1(id);
}
@Override
public void insertTestInfo(TestInfo testInfo) {
baseMapper.insert(testInfo);
}
@Override
public void deleteTestInfo(Long id) {
baseMapper.deleteById(id);
}
@Override
public void updateTestInfo(TestInfo testInfo) {
baseMapper.updateById(testInfo);
}
}
mapper类信息如下
继承mybatisPlus的 BaseMapper 类就可以了
package com.fan.sd.demos.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fan.sd.demos.VO.TestInfo;
public interface TestInfoMapper extends BaseMapper<TestInfo> {
TestInfo selectById1(String id);
}
mapper.xml代码如下
注意一下 namespace 和 Id 就可以了,不过现在有MybatisCodeHelpPro插件,基本上没有对应不上的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.sd.demos.mapper.TestInfoMapper">
<select id="selectById1" resultType="com.fan.sd.demos.VO.TestInfo">
select * from test_info_table where id = #{id}
</select>
</mapper>
4. 启动报错问题解决
问题一:Springboot启动的时候报错提示 “没有符合条件的Bean关于Mapper类型”
这是因为启动的时候没有扫描对应的 Mapper 文件,所以没有生成对应的 bean 在 spring 容器中管理
我们只需要在启动类上加上注解 @MaaperSacn(“路径”)
问题二:启动的时候提示需要一个Bean,但是发现了两个Bean
我们进入Controller看看,鼠标移上去,很有意思的提示,@autowired找到两个Bean,但是在整个项目中ITestInfoService是接口类,而TestInfoServiceImpl是其实现类,
这是由于MapperScan的路径设置不当(属于强行承上启下了),将 MapperScan 的搜索范围扩大了,导致项目下所有包的接口都创建了一个实现类,因此在使用 @Autowired 后,对Service层的依赖注入就会找到两个Bean(一个Service接口本身,一个Service接口实现类)。
所以我们把Mapper扫描的配置路径写的颗粒度更细一点,就可以解决了
问题三:没有找到对应的statement
刚刚通过配置 MapperScan 扫描,解决了 mapper 没有生成bean在 Spring 容器中管理,现在成功启动,但是调用 mapper 里面的方法的时候又报这个错,网上检查什么 namespace 啊,检查 id 什么之类的,现在都是有插件帮我们检查好了,什么不对应的一红就知道了,所以这些也没必要检查。
这里主要的原因有两个
第一个原因:
我放的xml的目录位置问题,正常来说存放在 Resources/mapper/ *.xml 路径下,但是我们的项目基本上都是多模块项目,为了方便管理对应的 mapper 文件,我都是喜欢放在 mapper/xml/ *.xml 路径下面。所以这里需要有个对应的配置,具体配置如下
# 服务端口
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root123456
url: jdbc:mysql://localhost:3306/SD_DB?useSSL=false&serverTimezone=Asia/Shanghai
mybatis-plus:
# 指定 MyBatis Mapper 对应的 XML 文件位置
mapper-locations: classpath*:com/fan/sd/demos/**/xml/*.xml
configuration:
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 返回类型为Map,显示null对应的字段
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
第二个原因:
可以查看一下生成的 target 文件目录,然后会发现根本都没有xml目录以及对应的mapper.xml文件,那肯定会报这个问题的。
主要原因是我们启动项目或者打包项目的时候,默认只会编译src/main/java下面的class文件,对应的一些xml等静态文件是不会打包编译的,所以我们这里就需要在pom文件里面设置一下
具体配置信息如下,最后Maven刷新一下,就可以正常编译了
<?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.fan</groupId>
<artifactId>SD</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SD</name>
<description>SD</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
<djl.version>0.20.0</djl.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 在 <dependencies> 区域内添加 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.6</version> <!-- 替换为最新版本 -->
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.fan.sd.SdApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!-- 项目打包时会将java目录中的*.xml文件也进行打包 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>