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: true
druid
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: admin
Config 配置
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)文章
SpringBoot實(shí)現(xiàn)文件下載的限速功能
在SpringBoot項(xiàng)目中,實(shí)現(xiàn)文件下載的限速功能可以有效控制服務(wù)器帶寬的占用,并防止單個(gè)用戶消耗過多的資源,本文將通過具體的代碼示例和詳細(xì)的流程解釋,介紹如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)文件下載的限速功能,需要的朋友可以參考下2024-07-07java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單,雙向鏈表
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來幫助2021-07-07使用restTemplate遠(yuǎn)程調(diào)controller路徑取數(shù)據(jù)
這篇文章主要介紹了使用restTemplate遠(yuǎn)程調(diào)controller路徑取數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot整合Spring Data Elasticsearch的過程詳解
這篇文章主要介紹了SpringBoot整合Spring Data Elasticsearch的過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09java中的Consumer、Supply如何實(shí)現(xiàn)多參數(shù)?
Java的Consumer接口只能接受一個(gè)參數(shù),但可以通過自定義接口、使用Tuple或嵌套結(jié)構(gòu)來實(shí)現(xiàn)對(duì)多個(gè)參數(shù)的處理,對(duì)于Supplier接口,它不能接受參數(shù),但可以通過自定義BiSupplier、結(jié)合Function或封裝參數(shù)為對(duì)象來實(shí)現(xiàn)對(duì)兩個(gè)參數(shù)并返回一個(gè)值的功能2024-11-11SpringBoot+MyBatisPlus對(duì)Map中Date格式轉(zhuǎn)換處理的方法詳解
在?SpringBoot?項(xiàng)目中,?如何統(tǒng)一?JSON?格式化中的日期格式。本文將為大家介紹一種方法:利用MyBatisPlus實(shí)現(xiàn)對(duì)Map中Date格式轉(zhuǎn)換處理,需要的可以參考一下2022-10-10Java并發(fā)編程之volatile與JMM多線程內(nèi)存模型
這篇文章主要介紹了Java并發(fā)volatile與JMM多線程內(nèi)存模型,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程
循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下2022-02-02SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn)
本文主要介紹了SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08