SpringBoot整合MyBatis/Plus 1.SpringBoot整合MyBatis 1.1整合案例 需求:整合SpringBoot和Mybatis,向資料庫中查詢數據。 項目結構: 1.1.1創建資料庫和表 -- 創建資料庫 DROP DATABASE IF EXISTS springbo ...
SpringBoot整合MyBatis/Plus
1.SpringBoot整合MyBatis
1.1整合案例
需求:整合SpringBoot和Mybatis,向資料庫中查詢數據。
項目結構:
1.1.1創建資料庫和表
-- 創建資料庫
DROP DATABASE IF EXISTS springboot_mybatis;
CREATE DATABASE springboot_mybatis;
USE springboot_mybatis;
-- 創建表
CREATE TABLE monster(
`id` INT NOT NULL AUTO_INCREMENT,
`age` INT NOT NULL,
`birthday` DATE DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
`gender` CHAR(1) DEFAULT NULL,
`name` VARCHAR(255) DEFAULT NULL,
`salary` DOUBLE NOT NULL,
PRIMARY KEY(`id`)
)CHARSET=utf8;
插入測試數據:
1.1.2引入依賴
在pom.xml中引入mybatis及相關的依賴
<!--導入SpringBoot父工程-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.3</version>
</parent>
<dependencies>
<!--web starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--mysql驅動,使用版本仲裁-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--配置處理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--springboot test starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--druid 數據源,也可以使用預設的數據源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
</dependencies>
1.1.3配置數據源
在resource/application.yml中配置數據源,並完成SpringBoot項目啟動測試
spring:
datasource: #配置數據源
url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 9090
創建配置類,設置Druid數據源:
這裡如果引入的依賴是druid-starter,可以直接在yml文件中配置
package com.li.springboot.mybatis.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @author 李
* @version 1.0
*/
@Configuration
public class DruidDataSourceConfig {
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
}
1.1.4指定mapper.xml路徑
在application.yml文件中配置mybatis,指定要掃描的mapper.xml文件的路徑
在ssm整合中,這一步也是在applicationContext.xml容器文件中指定
mybatis:
mapper-locations: classpath:mapper/*.xml #指定要掃描的mapper.xml路徑
1.1.5代碼實現
(1)創建JavaBean--Monster.java,用於表映射
package com.li.springboot.mybatis.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author 李
* @version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Monster {
private Integer id;
private Integer age;
private Date birthday;
private String email;
private String name;
private String gender;
private Double salary;
}
(2)創建mapper介面,用於聲明方法
package com.li.springboot.mybatis.mapper;
import com.li.springboot.mybatis.bean.Monster;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 李
* @version 1.0
* 使用註解@mapper,就可以將mapper介面對象註入容器
*/
@Mapper//除了使用註解,也可以直接指定要掃描的包
public interface MonsterMapper {
//根據id查詢數據記錄
public Monster getMonsterById(Integer id);
}
(3)在resource/mapper目錄下創建介面對應的mapper.xml文件,實現聲明的方法
<?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.li.springboot.mybatis.mapper.MonsterMapper">
<!--配置getMonsterById方法-->
<select id="getMonsterById" resultType="com.li.springboot.mybatis.bean.Monster">
SELECT *
FROM `monster`
WHERE `id` = #{id}
</select>
</mapper>
(4)進行測試:
如果要寫測試類,一定要寫主程式
package com.li.springboot.mybatis;
import com.li.springboot.mybatis.bean.Monster;
import com.li.springboot.mybatis.mapper.MonsterMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
/**
* @author 李
* @version 1.0
*/
@SpringBootTest
public class ApplicationTest {
@Resource
private MonsterMapper monsterMapper;//註入的實際上是它的代理類
//測試MonsterMapper介面是否可用
@Test
public void getMonsterMapper() {
Monster monster = monsterMapper.getMonsterById(1);
System.out.println("monster=" + monster);
}
}
測試結果:成功從資料庫中獲取信息。
接下來的Service、Controller層和ssm沒有多大區別,這裡不再贅述
1.1.6補充-對mybatis的配置
- SpringBoot對mybatis的配置有兩種方式:
(1)使用傳統方式配置,即使用mybatis-config.xml。不過要先在application.yml文件中指定mybatis配置文件的路徑。
mybatis:
config-location: #指定mybatis-config.xml文件的路徑
(2)直接使用application.yml文件進行配置,例如:
mybatis:
type-aliases-package: com.li.springboot.mybatis.bean #指定別名
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #指定標準的日誌輸出
- 兩種方式的選擇:
- 如果配置比較簡單,可以在yml中直接配置
- 如果配置內容較多,可以單獨地做一個配置文件
1.2註意事項和使用細節
SpringBoot中日期預設是格林尼治標準時間,和中國標準時相差8小時,可以通過註解@JsonFormat解決此問題:
其中pattern表示日期格式,timezone表示時區,GMT是格林尼治時間
2.SpringBoot整合MyBatis-Plus
2.1MyBatis-Plus基本介紹
-
MyBatis-Plus,簡稱MP,是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變,為簡化開發、提高效率而生。
-
強大的CRUD操作:內置了通用Mapper、通用Service,通過少量配置即可實現單表大部分CRUD操作,更有強大的條件構造器,滿足各類需求。
2.2整合案例
需求:整合SpringBoot和MyBatis-Plus,向資料庫中查詢數據。
2.2.1創建資料庫和表
略,表結構同上。
2.2.2引入依賴
pom.xml文件中引入mybatis-plus starter和其他依賴。
<!--導入SpringBoot父工程-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.3</version>
</parent>
<!--引入必要依賴-->
<dependencies>
<!--web starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MyBatis-plus starter-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--配置處理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--springboot test starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--druid 數據源,也可以使用預設的數據源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
</dependencies>
2.2.3配置數據源
(1)在resource/application.yml中配置數據源
server:
port: 9090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_mybatisplus?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
(2)創建配置類,設置Druid數據源:這一步和mybatis整合相同,見上1.1.3操作
2.2.4代碼實現
(1)創建JavaBean--Monster.java,用於表映射(同1.1.4的操作,略)
(2)創建mapper介面,用於聲明方法
相比於mybatis需要自己聲明方法,MP提供了一個通用的BaseMapper,有很多通用的方法,通過繼承,我們就可以直接使用,簡化開發
package com.li.springboot.mybatisplus.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.li.springboot.mybatisplus.bean.Monster;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 李
* @version 1.0
* BaseMapper是MyBatisPlus內置的通用Mapper,提供了很多的方法
* 如果它提供的方法不能滿足業務需求,我們可以在這裡開發新的方法
*/
@Mapper
public interface MonsterMapper extends BaseMapper<Monster> {
}
如果在這一步沒有自定義的介面方法,就不需要使用Mapper.xml文件實現聲明
(3)開發Service
MP也提供了一個通用的Service介面,裡面也提供了很多方法
package com.li.springboot.mybatisplus.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.li.springboot.mybatisplus.bean.Monster;
/**
* @author 李
* @version 1.0
* 1.在mybatis中,是在MonsterService聲明方法,然後在其實現類實現
* 2.而在MyBatis-Plus中,我們可以通過繼承父介面:IService,從而使用裡面的很多方法
* 3.如果它提供的方法不能滿足業務需求,再開發新的方法
*/
@Service
public interface MonsterService extends IService<Monster> {
}
註意:如果在業務Service介面聲明瞭自定義方法,通常會創建一個實現類實現介面方法,問題是:由於業務Service介面繼承了IService介面,那麼業務Service的實現類要同時實現兩個介面的方法才行,非常麻煩。
解決方案是:業務實現類通過繼承ServiceImpl類解決問題。ServiceImpl類是MyBatis-Plus提供的一個類,它已經實現了IService的方法。這樣業務實現類就只需要實現業務Service自定義的方法。
業務實現類MonsterServiceImpl:
package com.li.springboot.mybatisplus.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.li.springboot.mybatisplus.bean.Monster;
import com.li.springboot.mybatisplus.mapper.MonsterMapper;
import com.li.springboot.mybatisplus.service.MonsterService;
/**
* @author 李
* @version 1.0
*/
public class MonsterServiceImpl
extends ServiceImpl<MonsterMapper, Monster>
implements MonsterService {
//通過繼承ServiceImpl,這個實現類中就只用實現業務Service自定義的方法
}
controller層的實現和mybatis的大同小異,這裡就不寫了
2.2.5補充-對MP的配置
- MyBatis-Plus的配置和MyBatis配置幾乎沒有區別,在SpringBoot中,同樣可以通過如下方式進行配置:
(1)使用傳統的配置文件配置,不過要先在application.yml文件中指定配置文件的路徑:
mybatis-plus:
config-location: xxx #指定mp配置文件的路徑
(2)直接使用application.yml文件進行配置,例如:
mybatis-plus:
configuration: # 進行mybatis-plus配置,配置項和mybatis一樣
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
@MapperScan註解(修飾於主程式)可以替代@Mapper(修飾於mapper介面),basePackages屬性可以接收多個值
2.3註意事項和使用細節
(1)@TableName
描述:表名註解,標識實體類對應的表。如果實體類的類名和表名一致,則該註解可以省略,否則需要通過@TableName指定表名
(2)為了開發方便,IDEA可以安裝MyBatisX插件,參考文檔。該插件具有如下功能:XML 跳轉、生成代碼(需先在 idea 配置 Database 配置數據源)、重置模板、JPA 提示(生成新增、生成查詢、生成修改、生成刪除)