前言
隨著Java Web應用程序的快速發展,開發人員需要越來越多地關注如何高效地構建可靠的應用程序。Spring Boot作為一種快速開發框架,旨在簡化基于Spring的應用程序的初始搭建和開發過程。而MyBatis作為一種優秀的持久層框架,提供了對數據庫操作的便捷支持。本系列博客將帶領大家深入了解如何將這兩者結合起來,以構建強大的企業級應用程序。
在本篇博客中,我們將首先介紹Spring Boot和MyBatis的基本概念,然后重點討論它們的整合方式及實際應用場景。通過本系列博客的學習,讀者將能夠掌握Spring Boot整合MyBatis的最佳實踐,并能夠將其應用于自己的項目中。
希望本系列博客能夠幫助讀者更加深入地理解Spring Boot和MyBatis,并為實際項目開發提供有力支持。讓我們一起開始這段充滿挑戰和樂趣的學習之旅吧!
本次案例通過實現城市列表的查詢和分頁來介紹整合 Mybatis!
一、前期準備
1、新建項目,結構如下
2、導入依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mybatis 整合 springboot 的 starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!-- pagehelper 分頁插件的 starter --><!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.3.1</version><scope>test</scope></dependency>
?這段代碼是關于Spring Boot整合MyBatis所需要的依賴項。通過這些依賴項,我們可以輕松地將Spring Boot和MyBatis集成在一起,實現數據庫操作的快速開發。以下是每個依賴項的作用簡介:
spring-boot-starter-jdbc:Spring Boot提供的JDBC Starter,用于配置和管理數據庫連接。
mybatis-spring-boot-starter:MyBatis與Spring Boot整合的Starter,提供了MyBatis的核心功能和配置。
pagehelper-spring-boot-starter:PageHelper分頁插件的Starter,用于在MyBatis中實現分頁查詢。
mysql-connector-j:MySQL數據庫驅動程序。
lombok:Java庫,簡化代碼的編寫,提供各種注解和工具。
spring-boot-starter-test:Spring Boot的測試模塊,用于編寫單元測試。
mybatis-spring-boot-starter-test:MyBatis與Spring Boot整合的測試模塊,用于編寫對MyBatis功能進行測試的單元測試。
這些依賴項可以通過Maven或Gradle等構建工具進行引入,并在項目中配置相關的屬性和文件,以實現Spring Boot與MyBatis的整合。通過使用這些依賴項,我們可以簡化開發過程,提高開發效率,同時保持良好的代碼結構和可維護性
?3、建一個 city_info 表
create table city_info(city_id int primary key ,city_name varchar(100),city_code varchar(100),province varchar(50)
)
4、新建一個 City 實體類
@Data
public class City {private Integer cityId;private String cityName;private String cityCode;private String province;}
二、配置 application.yml
# 配置數據源
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/psmusername: rootpassword: 123456hikari:maximum-pool-size: 200minimum-idle: 10connection-timeout: 3000idle-timeout: 600000connection-test-query: select 1
# mybatis 配置
mybatis:# 實體的別名type-aliases-package: edu.nf.ch05.entity# mapper 映射配置文件的路徑mapper-locations: classpath:/mappers/*.xml# 輸出 sql 語句configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 分頁插件配置
pagehelper:# 設置數據庫的方言helper-dialect: mysql# 啟用注解分頁參數support-methods-arguments: true# 啟用分頁合理化reasonable: true
當配置Spring Boot中的數據源時,針對每個屬性進行詳細介紹:
spring.datasource.driver-class-name
:
- 用于指定數據庫驅動程序的類名。
- 在示例中,使用的是MySQL數據庫,因此指定了
com.mysql.cj.jdbc.Driver
。
spring.datasource.url
:
- 指定數據庫的連接地址。
- 在示例中,使用的是本地的MySQL數據庫,連接地址為
jdbc:mysql://localhost:3306/psm
,其中localhost
代表數據庫所在的主機名,3306
代表數據庫的端口號,psm
是數據庫的名稱。
spring.datasource.username
和spring.datasource.password
:
- 分別指定數據庫的用戶名和密碼。
- 在示例中,用戶名為
root
,密碼為123456
。
spring.datasource.hikari.maximum-pool-size
:
- 指定Hikari連接池的最大連接數。
- 在示例中,最大連接數被設置為200。
spring.datasource.hikari.minimum-idle
:
- 指定Hikari連接池的最小空閑連接數。
- 在示例中,最小空閑連接數被設置為10。
spring.datasource.hikari.connection-timeout
:
- 指定連接超時時間,單位為毫秒。
- 在示例中,連接超時時間被設置為3000毫秒。
spring.datasource.hikari.idle-timeout
:
- 指定連接在連接池中空閑的最長時間,單位為毫秒。
- 在示例中,空閑連接的最長時間被設置為600000毫秒(10分鐘)。
spring.datasource.hikari.connection-test-query
:
- 指定用于測試連接是否可用的查詢語句。
- 在示例中,使用了
select 1
作為測試查詢語句。
mybatis.type-aliases-package
:
- 指定實體類的別名包路徑。
- 在示例中,實體類別名被設置為
edu.nf.ch05.entity
,即該包下的實體類可以直接使用類名作為別名。
mybatis.mapper-locations
:
- 指定Mapper映射文件的位置。
- 在示例中,Mapper映射文件被設置在
classpath:/mappers/*.xml
路徑下,表示在類路徑下的mappers
目錄中尋找XML格式的Mapper文件。
mybatis.configuration.log-impl
:
- 指定MyBatis的日志輸出方式。
- 在示例中,日志輸出方式被設置為
org.apache.ibatis.logging.stdout.StdOutImpl
,即將日志輸出到控制臺。
pagehelper.helper-dialect
:
- 指定PageHelper分頁插件支持的數據庫方言。
- 在示例中,使用的是MySQL數據庫,因此數據庫方言被設置為
mysql
。
pagehelper.support-methods-arguments
:
- 啟用或禁用PageHelper分頁插件的注解分頁參數功能。
- 在示例中,該屬性被設置為
true
,表示啟用注解分頁參數。
pagehelper.reasonable
:
- 啟用或禁用PageHelper分頁插件的分頁合理化功能。
- 在示例中,該屬性被設置為
true
,表示啟用分頁合理化。以上是示例配置中各個屬性的詳細介紹。根據實際需求,可以根據數據庫類型、連接池配置以及MyBatis和PageHelper的功能需求進行相應的調整和配置。
配置完數據源和mybatis以及分頁插件后,我們就可以去完成dao的編寫以及serviced的代碼了。?
?
三、編寫 dao
public interface CityDao {List<City> listCity(@Param("pageNum") Integer pageNum,@Param("pageSize") Integer pageSize);}
編寫 Mybatis 配置類,映射sql語句:
<?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="edu.nf.ch05.dao.CityDao"><resultMap id="cityMap" type="city"><id property="cityId" column="city_id"/><result property="cityName" column="city_name"/><result property="cityCode" column="city_code"/><result property="province" column="province"/></resultMap><select id="listCity" resultMap="cityMap">select city_id, city_name, city_code, province from psm.city_info</select></mapper>
?
四、編寫 service
public interface CityService {/*** 查詢城市列表* @param pageNum* @param pageSize* @return*/PageInfo<City> listCity(Integer pageNum,Integer pageSize);}
實現類
@Service
@Transactional(rollbackFor = RuntimeException.class)
@RequiredArgsConstructor
public class CityServiceImpl implements CityService {private final CityDao dao;@Overridepublic PageInfo<City> listCity(Integer pageNum, Integer pageSize) {List<City> cities = dao.listCity(pageNum, pageSize);return new PageInfo<>(cities);}
}
讓我解釋一下其中的一些關鍵點:
@Service
注解:
- 用于將該類標識為Spring的Service組件,通常用于業務邏輯的處理。
@Transactional(rollbackFor = RuntimeException.class)
注解:
- 用于聲明事務行為,指定在發生RuntimeException時進行事務回滾。
- 這意味著當方法中拋出RuntimeException異常時,事務會回滾到方法執行前的狀態。
@RequiredArgsConstructor
注解:
- Lombok提供的注解,用于生成一個包含必需參數的構造函數。
- 在這里,它會為
CityServiceImpl
類生成一個包含final
字段dao
的構造函數。
private final CityDao dao;
:
- 使用
@RequiredArgsConstructor
注解后,Lombok會自動生成帶有CityDao
類型參數的構造函數,并且會將CityDao
對象注入到dao
字段中。- 這也意味著
CityDao
是CityServiceImpl
的一個依賴項,在構造函數中通過依賴注入的方式進行初始化。
@Override
注解:
- 用于標識該方法是對接口中的方法的重寫實現。
public PageInfo<City> listCity(Integer pageNum, Integer pageSize)
方法:
- 該方法是
CityService
接口中定義的方法的實現。- 通過調用
CityDao
的listCity
方法獲取城市列表數據,然后通過PageInfo
類對其進行封裝并返回。
?
五、在?Ch05Application 添加掃描注解
@SpringBootApplication
@MapperScan("edu.nf.ch05.dao")
public class Ch05Application {public static void main(String[] args) {SpringApplication.run(Ch05Application.class, args);}}
注意:這是重點,就算寫完了之前的所有代碼,沒有使用這個注解去掃描,前面的都是白寫,如果不使用掃描,會報錯。
@MapperScan("edu.nf.ch05.dao")
是一個注解,用于掃描指定包下的Mapper接口,并將其注冊為Spring的Bean。在整合Spring Boot和MyBatis時,我們需要告訴Spring Boot去掃描哪些包下的Mapper接口,并將其注入到容器中。在這個例子中,注解
@MapperScan("edu.nf.ch05.dao")
表示對包edu.nf.ch05.dao
進行掃描,該包下的所有Mapper接口將被注冊為Spring的Bean,以便在其他地方可以通過自動注入的方式使用它們。這是個類就相當于我們之前所寫的配置類一樣。
六、測試
@Slf4j
@SpringBootTest
class Ch05ApplicationTests {@Autowiredprivate CityService cityService;@Testvoid contextLoads() {PageInfo<City> cityPageInfo = cityService.listCity(0, 10);cityPageInfo.getList().forEach(list -> log.info(list.toString()));}}
?把 cityService 通過字段注入進來,就可以從容器中獲取我們的listCity方法。
運行結果:
?
七、總結
大家對比一下和之前使用 springMvc 整合 Mybatis 是不是有很大的區別,區別是什么,就是不用再配置類中編寫大量的配置代碼了,springboot幫我們簡化了這個配置過程,我們只需要在properties或者yml中使用簡單的配置即可以配置好Mybatis來使用。?
?