SpringBoot?2.7.18?集成?Mybatis?Plus?+?Druid的實(shí)例詳解
一并附上 Mybatis 和 Mybatis Plus 的使用區(qū)別
MyBatis Mapper.XML 標(biāo)簽使用說明
Pom 依賴
Mybatis
<!-- 統(tǒng)一管理 jar 包版本 -->
<properties>
<druid-boot.version>1.1.10</druid-boot.version>
<mybatis-boot.version>2.1.0</mybatis-boot.version>
<mysql-connector.version>8.0.16</mysql-connector.version>
<mssql-jdbc.version>8.2.2.jre8</mssql-jdbc.version>
<oracle-jdbc.version>19.3.0.0</oracle-jdbc.version>
<pagehelper-starter.version>1.2.10</pagehelper-starter.version>
</properties>
<!--子模塊繼承之后,鎖定版本+子模塊不用寫 groupid 和 version -->
<dependencyManagement>
<dependencies>
<!-- mybatis + druid + mysql + mssql-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-boot.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-boot.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper-starter.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${mssql-jdbc.version}</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>${oracle-jdbc.version}</version>
</dependency>
<!-- mybatis + druid + mysql + mssql-->
</dependencies>
</dependencyManagement>Mybatis Plus
使用框架自帶的分布控件,如果使用 pagehelper 會(huì)報(bào) JSqlParser 的版本沖突,根據(jù)情況排除 pagehelper 版本(不推薦)。
<!-- 統(tǒng)一管理 jar 包版本 -->
<properties>
<druid-boot.version>1.2.23</druid-boot.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
<mysql-connector.version>8.0.33</mysql-connector.version>
<mssql-jdbc.version>8.2.2.jre8</mssql-jdbc.version>
<oracle-jdbc.version>19.3.0.0</oracle-jdbc.version>
</properties>
<!--子模塊繼承之后,鎖定版本+子模塊不用寫 groupid 和 version -->
<dependencyManagement>
<dependencies>
<!-- mybatis plus + druid + mysql + mssql-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--分頁-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${mssql-jdbc.version}</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>${oracle-jdbc.version}</version>
</dependency>
<!-- mybatis plus + druid + mysql + mssql-->
</dependencies>
</dependencyManagement>yml 配置
Mybatis
mybatis:
# 指定sql映射文件位置
mapper-locations: classpath*:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-handlers-package: com.vipsoft.base.handler # MySQL 8.0 用以mysql中json格式的字段,進(jìn)行轉(zhuǎn)換的自定義轉(zhuǎn)換器,轉(zhuǎn)換為實(shí)體類的JSONObject屬性Mybatis-Plus
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
global-config:
banner: true
db-config:
id-type: auto
where-strategy: not_empty
insert-strategy: not_empty
update-strategy: not_null
type-handlers-package: com.vipsoft.base.handler # MySQL 8.0 用以mysql中json格式的字段,進(jìn)行轉(zhuǎn)換的自定義轉(zhuǎn)換器,轉(zhuǎn)換為實(shí)體類的JSONObject屬性
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
jdbc-type-for-null: 'null'
call-setters-on-nulls: true
shrink-whitespaces-in-sql: truedruid
SpringBoot 配置多數(shù)據(jù)源
spring:
profiles:
active: dev
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/web/,file:${cuwor.file.path}
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
#數(shù)據(jù)源基本配置
url: jdbc:mysql://192.168.1.100:3306/production_education?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL
username: root
password: root
#連接池的設(shè)置
druid:
initial-size: 5 #初始化時(shí)建立物理連接的個(gè)數(shù)
min-idle: 5 #最小連接池?cái)?shù)量
max-active: 200 #最大連接池?cái)?shù)量 maxIdle已經(jīng)不再使用
max-wait: 60000 #獲取連接時(shí)最大等待時(shí)間,單位毫秒
test-while-idle: true #申請(qǐng)連接的時(shí)候檢測(cè),如果空閑時(shí)間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測(cè)連接是否有效。
time-between-eviction-runs-millis: 60000 #既作為檢測(cè)的間隔時(shí)間又作為testWhileIdel執(zhí)行的依據(jù)
#銷毀線程時(shí)檢測(cè)當(dāng)前連接的最后活動(dòng)時(shí)間和當(dāng)前時(shí)間差大于該值時(shí),關(guān)閉當(dāng)前連接
min-evictable-idle-time-millis: 30000
validation-query: select 'x' #用來檢測(cè)連接是否有效的sql 必須是一個(gè)查詢語句( mysql中為 select 'x' oracle中為 select 1 from dual)
test-on-borrow: false #申請(qǐng)連接時(shí)會(huì)執(zhí)行validationQuery檢測(cè)連接是否有效,開啟會(huì)降低性能,默認(rèn)為true
test-on-return: false #歸還連接時(shí)會(huì)執(zhí)行validationQuery檢測(cè)連接是否有效,開啟會(huì)降低性能,默認(rèn)為true
#exception-sorter: true #當(dāng)數(shù)據(jù)庫拋出不可恢復(fù)的異常時(shí),拋棄該連接
#pool-prepared-statements: true #是否緩存preparedStatement,mysql5.5+建議開啟
max-pool-prepared-statement-per-connection-size: 20 #當(dāng)值大于0時(shí)poolPreparedStatements會(huì)自動(dòng)修改為true
filters: stat,wall #配置擴(kuò)展插件
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 #通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
use-global-data-source-stat: true #合并多個(gè)DruidDataSource的監(jiān)控?cái)?shù)據(jù)
#設(shè)置訪問druid監(jiān)控頁的賬號(hào)和密碼,默認(rèn)沒有--放DrugConfig配置中
#stat-view-servlet.login-username: admin
#stat-view-servlet.login-password: adminConfig 配置
Druid 配置沒有變化
package com.vipsoft.base.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//配置Druid的監(jiān)控
//1、配置一個(gè)管理后臺(tái)的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","vipsoft");
initParams.put("resetEnable","false");
initParams.put("allow","");//默認(rèn)就是允許所有訪問
initParams.put("deny","192.168.15.21"); //IP黑名單(同時(shí)存在時(shí),deny優(yōu)先于allow)
bean.setInitParameters(initParams);
return bean;
}
//2、配置一個(gè)web監(jiān)控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}Mybatis Plus 分頁,需要添加 攔截器配置,否則分頁不生效
package com.vipsoft.base.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 分頁插件 -- 否則分頁不生效
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
Mapper掃描
@MapperScan({"com.vipsoft.admin.mapper"}) 和 Mybatis 無區(qū)別
package com.vipsoft.admin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = {"com.vipsoft"})
@SpringBootApplication
@MapperScan({"com.vipsoft.admin.mapper"})
public class VipSoftAdminApplication {
public static void main(String[] args) {
SpringApplication.run(VipSoftAdminApplication.class, args);
}
}Entity
SysMenu
//@TableName("sys_menu") 默認(rèn)會(huì)將 SysMenu 解析成 sys_menu 如果解析后不是正確的表名,需要通過 TableName進(jìn)行指定,
public class SysMenu extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 菜單ID */
@TableId(value = "menu_id", type = IdType.ASSIGN_ID)
private Long menuId;
/** 菜單名稱 */
@TableField(value = "menu_name")
private String menuName;
/** 父菜單名稱 */
@TableField(exist = false) //非數(shù)據(jù)庫字段,進(jìn)行排除
private String parentName;
....省略
}Mapper.xml
SysMenuMapper.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.vipsoft.admin.mapper.SysMenuMapper">
<resultMap type="com.vipsoft.admin.entity.SysMenu" id="SysMenuResult">
<id property="menuId" column="menu_id"/>
<result property="menuName" column="menu_name"/>
<result property="parentName" column="parent_name"/>
<result property="parentId" column="parent_id"/>
<result property="orderNum" column="order_num"/>
<result property="path" column="path"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="listMenu" parameterType="com.vipsoft.admin.entity.SysMenu" resultMap="SysMenuResult">
select menu_id, menu_name, parent_id, order_num, create_time from sys_menu
<where>
<if test="menuName != null and menuName != ''">
AND menu_name like concat('%', #{menuName}, '%')
</if>
<if test="visible != null and visible != ''">
AND visible = #{visible}
</if>
<if test="status != null and status != ''">
AND status = #{status}
</if>
</where>
order by parent_id, order_num
</select>
<select id="listMenuPage" resultMap="SysMenuResult">
select menu_id, menu_name, parent_id, order_num, create_time from sys_menu
<where>
<if test="query.menuName != null and query.menuName != ''">
AND menu_name like concat('%', #{query.menuName}, '%')
</if>
<if test="query.visible != null and query.visible != ''">
AND visible = #{query.visible}
</if>
<if test="query.status != null and query.status != ''">
AND status = #{query.status}
</if>
</where>
order by parent_id, order_num
</select>
</mapper>
Mapper - SysMenuMapper
需要繼承 BaseMapper
package com.vipsoft.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vipsoft.admin.entity.SysMenu;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 菜單表 數(shù)據(jù)層
*/
public interface SysMenuMapper extends BaseMapper<SysMenu> {
List<SysMenu> listMenu(SysMenu menu);
IPage<SysMenu> listMenuPage(Page page, @Param("query") SysMenu menu);
}Service
ISysMenuService
package com.vipsoft.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vipsoft.admin.entity.SysMenu;
import java.util.List;
/**
* 菜單 業(yè)務(wù)層
*
*/
public interface ISysMenuService
{
/**
* 列表查詢(自定義SQL,分頁)
*/
List<SysMenu> listMenu(SysMenu menu);
/**
* 列表查詢(框架分頁)
*/
IPage selectPage(SysMenu menu);
/**
* 列表查詢(自定義SQL,分頁)
*/
IPage listMenuPage(SysMenu menu);
}SysMenuService
package com.vipsoft.admin.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vipsoft.admin.entity.SysMenu;
import com.vipsoft.admin.mapper.SysMenuMapper;
import com.vipsoft.admin.service.ISysMenuService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.PageParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* 菜單 業(yè)務(wù)層處理
*
* @author ruoyi
*/
@Service
public class SysMenuServiceImpl implements ISysMenuService {
@Autowired
private SysMenuMapper menuMapper;
/**
* 列表查詢(自定義SQL,分頁)
*/
@Override
public List<SysMenu> listMenu(SysMenu menu) {
return menuMapper.listMenu(new SysMenu());
}
/**
* 列表查詢(框架分頁)
*/
@Override
public IPage selectPage(SysMenu menu) {
Page page = new Page();
page.setCurrent(2);
page.setSize(10);
List<OrderItem> orderItems = new ArrayList<>();
orderItems.add(OrderItem.desc("menu_id"));
page.setOrders(orderItems);
Page pageList = menuMapper.selectPage(page, null);
return pageList;
}
/**
* 列表查詢(自定義SQL,分頁)
*/
@Override
public IPage listMenuPage(SysMenu menu) {
Page page = new Page();
page.setCurrent(2);
page.setSize(10);
List<OrderItem> orderItems = new ArrayList<>();
orderItems.add(OrderItem.desc("menu_id")); //先按 menu_id 排序,再按 mapper.xml 中的排(可以在查詢輸出的SQL中查看)
page.setOrders(orderItems);
IPage<SysMenu> pageList = menuMapper.listMenuPage(page, menu);
return pageList;
}
}Controller
package com.vipsoft.admin.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vipsoft.admin.entity.SysMenu;
import com.vipsoft.admin.service.ISysMenuService;
import com.vipsoft.base.core.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 菜單信息
*/
@RestController
@RequestMapping("/menu")
public class SysMenuController {
@Autowired
private ISysMenuService menuService;
/**
* 獲取菜單列表
*/
@GetMapping("/selectPage")
public ApiResult selectPage(SysMenu menu) {
IPage menus = menuService.selectPage(menu);
return new ApiResult(menus);
}
/**
* 獲取菜單列表
*/
@GetMapping("/list")
public ApiResult listMenu(SysMenu menu) {
List<SysMenu> menus = menuService.listMenu(menu);
return new ApiResult(menus);
}
/**
* 獲取菜單列表
*/
@GetMapping("/listMenuPage")
public ApiResult listMenuPage(SysMenu menu) {
IPage menus = menuService.listMenuPage(menu);
return new ApiResult(menus);
}
}到此這篇關(guān)于SpringBoot 2.7.18 集成 Mybatis Plus + Druid的文章就介紹到這了,更多相關(guān)SpringBoot 2.7.18 集成 Mybatis Plus + Druid內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)小型圖書館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)小型圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
java中stringbuffer線程安全分析實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于java中stringbuffer線程安全分析實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01
springboot中在非bean類中調(diào)用bean的實(shí)現(xiàn)方法
在Spring Boot中,非Bean類調(diào)用Bean方法通常需要通過靜態(tài)方法獲取Bean實(shí)例,然后調(diào)用相應(yīng)的方法,這種方法避免了直接在非Bean類中注入Bean,保持了代碼的簡(jiǎn)潔和可維護(hù)性,通過這種方式,可以在不改變?cè)写a結(jié)構(gòu)的情況下,實(shí)現(xiàn)Bean方法的調(diào)用2025-02-02
Springboot整合spring-boot-starter-data-elasticsearch的過程
本文詳細(xì)介紹了Springboot整合spring-boot-starter-data-elasticsearch的過程,包括版本要求、依賴添加、實(shí)體類添加、索引的名稱、分片、副本設(shè)置等,同時(shí),還介紹了如何使用ElasticsearchRepository類進(jìn)行增刪改查操作2024-10-10
POI XSSFSheet shiftRows bug問題解決
這篇文章主要介紹了POI XSSFSheet shiftRows bug問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Spring boot事件監(jiān)聽實(shí)現(xiàn)過程解析
這篇文章主要介紹了,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

