前提說明:
項目的springboot版本為:3.3.2
需要整合的mybatis-plus版本:3.5.7
廢話不多說,開始造吧
1.準備好數據庫和表
2.配置全局文件application.properties或者是application.yml(配置mapper的映射文件路徑)
我這里是application.properties,配置如下:
#配置服務器端口號
server.port=9090
#連接數據庫
spring.application.name=dormitory_backend
spring.datasource.url=jdbc:mysql://localhost:3306/dormitory?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#mybatis-plus配置mapper文件路徑
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
#打印sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.dormitory.dormitory_backend.mapper=DEBUG
3.啟動類配置包掃描注解和路徑信息
配置之前先看下我這邊的包結構
啟動類,造吧?找到有@SpringBootApplication注解的類就是了,在其位置加上包掃描注解@MapperScan(“com.dormitory.dormitory_backend.mapper”)
注意括號里面的內容需要根據自己的包結構來配置,com.dormitory.dormitory_backend是我的包結構,主要看java,實在不懂,那就任意打開一個XXXmapper.java文件,看其包結構,框起來的一整個復制粘貼上去就可以了
4.導入依賴:
無效依賴—我嘗試過導入網上的各種mybatis-plus的依賴:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>3.5.1</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>3.5.1</version>
</dependency>
至于為什么說是無效依賴,導入以上的依賴無法使用mybatis-plus自帶的方法
發送請求時,后臺產生以下報錯:
Invalid bound statement (not found): com.dormitory.dormitory_backend.mapper.AttendanceMapper.deleteById
AttendanceMapper的deleteById方法是無效的綁定語句,也就是,無法識別到mybatis-plus自帶的刪除方法,但是可以識別自定義的mapper語句,能正常進行增刪改查,也就是原mybatis的寫法唄,但是,我想快速實現CRUD啊!于是,網上找了一個解決的方法,配置一個類,請看下文:
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.StringUtils;import javax.sql.DataSource;@Configuration
public class MybatisPlusConfig {@Autowiredprivate DataSource dataSource;@Autowiredprivate MybatisProperties properties;@Autowiredprivate ResourceLoader resourceLoader = new DefaultResourceLoader();@Autowired(required = false)private Interceptor[] interceptors;@Autowired(required = false)private DatabaseIdProvider databaseIdProvider;/*** mybatis-plus分頁插件*/@Beanpublic PaginationInnerInterceptor paginationInnerInterceptor(){PaginationInnerInterceptor page= new PaginationInnerInterceptor();return page;}/*** 這里全部使用mybatis-autoconfigure 已經自動加載的資源。不手動指定 <p> 配置文件和mybatis-boot的配置文件同步 @return*/@Beanpublic MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() {MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();mybatisPlus.setDataSource(dataSource);mybatisPlus.setVfs(SpringBootVFS.class);if (StringUtils.hasText(this.properties.getConfigLocation()))mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));if (!ObjectUtils.isEmpty(this.interceptors)) mybatisPlus.setPlugins(this.interceptors);MybatisConfiguration mc = new MybatisConfiguration();mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);// 數據庫字段設計為駝峰命名,默認開啟的駝峰轉下劃線會報錯字段找不到mc.setMapUnderscoreToCamelCase(true);mybatisPlus.setConfiguration(mc);if (this.databaseIdProvider != null) mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider);if (StringUtils.hasLength(this.properties.getTypeAliasesPackage()))mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());if (StringUtils.hasLength(this.properties.getTypeHandlersPackage()))mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations()))mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations());return mybatisPlus;}
}
配置了這個類,確實是可以使用mybatis-plus自帶的方法,但是自己寫的方法卻無法實現了
實現配置類后,請求自定義的新增方法:
實現配置類后,請求mybatis-plus自帶的刪除方法:
幾經輾轉,發現導入以下這個依賴可以實現同時使用自定義方法和mybatis-plus自帶方法,注意:需要刪除MybatisPlusConfig類,以及將原先導入的三個依賴替換成新的依賴就可以了
有效依賴—導入mybatis-plus的依賴:
---------------原依賴-----------------
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>3.5.1</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>3.5.1</version>
</dependency>--------------新依賴------------------
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version>
</dependency>
5.實現表對應的實體類
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_attendance")
public class Attendance {@ApiModelProperty("自增id")@TableId(value = "id",type = IdType.AUTO)private Integer id;@ApiModelProperty("賬號(學號)")@TableField("user_account")private String userAccount;@ApiModelProperty("缺勤原因")@TableField("reason")private String reason;
}
6.mapper和xml
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dormitory.dormitory_backend.entity.Attendance;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface AttendanceMapper extends BaseMapper<Attendance> {int insertAttendance(Attendance attendance);int deleteAttendance(Integer id);
}<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dormitory.dormitory_backend.mapper.AttendanceMapper"><insert id="insertAttendance" parameterType="com.dormitory.dormitory_backend.entity.Attendance">insert into t_attendance(user_account,reason) values(#{userAccount},#{reason})</insert><delete id="deleteAttendance">delete from t_attendance where id = #{id}</delete></mapper>
7.service和impl
public interface AttendanceService {int addAttendance(Attendance attendance);int deleteAttendance(Integer id);
}import com.dormitory.dormitory_backend.entity.Attendance;
import com.dormitory.dormitory_backend.mapper.AttendanceMapper;
import com.dormitory.dormitory_backend.service.AttendanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class AttendanceServiceImpl implements AttendanceService {@Autowiredprivate AttendanceMapper attendanceMapper;/*** 自定義的新增方法* @param attendance* @return*/@Overridepublic int addAttendance(Attendance attendance) {int insert = attendanceMapper.insertAttendance(attendance);return insert;}/*** plus自帶的刪除方法* @param id* @return*/@Overridepublic int deleteAttendance(Integer id) {return attendanceMapper.deleteById(id);}
}
8.controller
import com.dormitory.dormitory_backend.entity.Attendance;
import com.dormitory.dormitory_backend.service.AttendanceService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/attendance")
@Api(tags = {"考勤管理"})
public class AttendanceController {@Autowiredprivate AttendanceService attendanceService;@PostMapping("/addAttendance")public int addAttendance(@RequestBody Attendance attendance){int addAttendance = attendanceService.addAttendance(attendance);return addAttendance;}@DeleteMapping("/deleteAttendance")public int deleteAttendance(Integer id){int addAttendance = attendanceService.deleteAttendance(id);return addAttendance;}
}
9.實現
嘮一嘮:出現Invalid bound statement (not found)問題的原因可能有哪些
1.全局配置文件沒配好?
檢查全局配置文件application.properties或application.yml是否配置掃描mapper包的文件路徑
#mybatis配置mapper文件路徑
#mybatis.mapper-locations=classpath:/mapper/*.xml
#mybatis-plus配置mapper文件路徑
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
2.啟動類沒加包掃描注解 ?
檢查啟動類上是否添加包掃描注解
@SpringBootApplication
@MapperScan("項目路徑.mapper")
public class DormitoryBackendApplication {public static void main(String[] args) {SpringApplication.run(DormitoryBackendApplication.class, args);
}
3.沒使用@Mapper注解?
XXXmapper.java類是否使用@Mapper注解
@Mapper
public interface AttendanceMapper extends BaseMapper<Attendance> {}
4.命名空間不正確?
檢查XXXmapper.xml的命名空間是否正確,是否能跳轉到對應的XXXmapper.java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dormitory.dormitory_backend.mapper.AttendanceMapper"></mapper>
正常能跳轉會有箭頭圖標,點擊能跳轉(下載一個插件)