MyBatis 是一個可以自定義SQL、存儲過程和高級映射的持久層框架,它摒除了大部分的JDBC代碼、手工設置參數和結果集重獲,只使用簡單的XML 和注解來配置和映射基本數據類型、Map 接口和POJO 到數據庫記錄。相對Hibernate和Apache OJB等“一站式”ORM解決方案而言,Mybatis 是一種“半自動化”的ORM實現。
Druid 是阿里巴巴開源的數據庫連接池解決方案,因為有阿里巴巴背書,所以 Druid 是當今國內 Java 開發中非常流行的數據庫連接池。本文介紹 Spring Boot 集成 Druid 和Mybatis框架的基礎配置和應用,數據庫采用MySQL。
軟件環境
- MySql 8.0.11
- java version 13.0.1
- IntelliJ IDEA 2019.3.2 (Ultimate Edition)
Druid數據庫連接池
Druid是什么?它首先是一個數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。
整個項目由數據庫連接池、插件框架和SQL解析器組成。該項目主要是為了擴展JDBC的一些限制,可以讓程序員實現一些特殊的需求,比如向密鑰服務請求憑證、統計SQL信息、SQL性能收集、SQL注入檢查、SQL翻譯等,程序員可以通過定制來實現自己需要的功能。
Druid在監控,可擴展,穩定性和高可用方面具有明顯得優勢,通過提供的監控功能可以觀察數據庫連接池和sql查詢工作情況,使用druid連接池可以提高數據庫的訪問性能。
Druid支持哪些數據庫? Druid支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存占用優化,MySql的ping檢測優化。目前Spring Boot中默認支持的連接池有dbcp,dbcp2, tomcat, hikari三種連接池,若要支持Druid,需要自己配置。
新建Spring Boot項目
為了簡單,項目名姑且命名為wiener。我們在此以Maven作為項目構建工具,來構建Spring Boot應用程序,創建步驟如下,比較簡單:
這里只勾選了Lombok插件。
Content root根據需要選擇即可。然后,點擊Finish,接下來請等待項目初始化完成。這里先給出創建完成后的項目結構圖,方便大家了解需要新增哪些文件。
項目結構圖
集成Mybatis和Druid
在dependencies中引入相關依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.eg</groupId>
<artifactId>wiener</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>wiener</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>13</java.version>
</properties>
<dependencies>
<!--web核心依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
spring-boot-maven-plugin是Spring Boot 的編譯插件。
配置application.properties信息
server.port=8087 # 配置應用的上下文路徑 server.servlet.context-path=/wiener # 配置當前要使用的數據源的操作類型那個 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #驅動類 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/my2020?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&serverTimezone=UTC
spring.datasource.username=root spring.datasource.password=root #連接池的配置信息 # 初始化大小 spring.datasource.druid.initial-size=5 # 最小 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-idle=200 # 最大 spring.datasource.druid.max-active=100 # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆 spring.datasource.druid.filters=stat,wall,log4j # 配置獲取連接等待超時的時間 spring.datasource.druid.max-wait=10000 spring.datasource.druid.validationQuery=select 'x' mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.eg.wiener.dto
以上屬性配置在resources目錄下的application.properties文件中。由於是快速入門篇,配置這些Mybatis和Druid屬性即可。
Mybatis擴展屬性配置
mybatis.config-location:指定mybatis-config.xml的位置;
mybatis.check-config-location:檢查mybatis-config.xml是否存在;
mybatis.mapper-locations:指定mapper的xml的位置;
mybatis.type-aliases-package:指定別名的包,可以多個,逗號分隔;
它一般對應我們的實體類所在的包,這個時候會自動取對應包中不包括包名的簡單類名作為包括包名的別名。多個package之間可以用逗號或者分號等來進行分隔。(value的值一定要是包的全名)
mybatis.type-handlers-package:指定handler的掃描碼路徑;
mybatis.executor-type:執行器類型: SIMPLE, REUSE, BATCH;
mybatis.configuration-properties:MyBatis配置的外部化屬性。指定的屬性可以用作MyBatis配置文件和映射文件的占位符;
mybatis.configuration:嵌套配置,具體子配置如下;
defaultStatementTimeout:設置超時時間,它決定驅動等待數據庫響應的秒數;
defaultFetchSize:為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋;
mapUnderscoreToCamelCase:是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射;
autoMappingUnknownColumnBehavior:指定發現自動映射目標未知列(或者未知屬性類型)的行為;NONE:不做任何反應;WARNING:輸出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級必須設置為 WARN);FAILING:映射失敗 (拋出 SqlSessionException);
具體參考:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
定義DruidConfig和相關實現
package com.eg.wiener.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; /** * https://www.cnblogs.com/feiyangbahu/p/9842363.html * <p> * SpringBoot配置MySql數據庫和Druid連接池 */ @Configuration public class DruidConfig { @Bean public ServletRegistrationBean druidServlet() {// 主要實現web監控的配置處理
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean( new StatViewServlet(), "/druid/*");//表示進行druid監控的配置處理操作
servletRegistrationBean.addInitParameter("allow", "127.0.0.1,129.168.1.11");//白名單
servletRegistrationBean.addInitParameter("deny", "129.168.1.12");//黑名單
servletRegistrationBean.addInitParameter("loginUsername", "root");//用戶名
servletRegistrationBean.addInitParameter("loginPassword", "root");//密碼
servletRegistrationBean.addInitParameter("resetEnable", "false");//是否可以重置數據源
return servletRegistrationBean; } /** * 監控面板訪問路徑: * http://localhost:8087/wiener/druid/login.html * * @throws * @Title: druidServlet * @Description: 注冊一個StatViewServlet 相當於在web.xml中聲明了一個servlet * @param: void * @return: ServletRegistrationBean */ @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*");//所有請求進行監控處理
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");//排除
return filterRegistrationBean; } @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource druidDataSource() { return new DruidDataSource(); } }
應用的上下文路徑(也稱為項目路徑),是構成url地址的一部分。Spring Boot默認只有一個Servlet,默認會映射到根路徑/,配置上下文路徑和端口號的方法是在application.properties文件中添加如下配置:
server.port=8087 # 配置應用的上下文路徑,也可以稱為項目路徑,是構成url地址的一部分 server.servlet.context-path=/wiener
訪問Druid監控系統時,默認訪問路徑如下:
http://IP:PORT/projectName/druid/login.html
在未配置項目上下文路徑時,其訪問路徑如下:
http://localhost:8087/druid/login.html
在配置應用上下文路徑后,其訪問路徑如下:
http://localhost:8087/wiener/druid/login.html
package com.eg.wiener.dto; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; /** * @author Wiener */ @Setter @Getter @ToString public class User implements Serializable { private Long id; private String userName; private Integer age; private String address; private String mobilePhone; }
Dao層只提供一個接口,通過用戶id查找用戶信息;溫馨提示,需要使用@ Repository注解,否則,Spring Boot無法掃描。
package com.eg.wiener.dao; import com.eg.wiener.dto.User; import org.springframework.stereotype.Repository; @Repository public interface UserDao { User getUserById(Long userId); }
Mapper文件:
<?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.eg.wiener.dao.UserDao">
<resultMap id="BaseResultMap" type="com.eg.wiener.dto.User">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName"/>
<result column="address" jdbcType="VARCHAR" property="address" />
<result column="age" jdbcType="TIMESTAMP" property="age" />
<result column="mobile_phone" jdbcType="TIMESTAMP" property="mobilePhone" />
</resultMap>
<sql id="Base_Column_List"> id, mobile_phone,user_name,address,age </sql>
<!-- 通過ID獲取用戶信息-->
<select id="getUserById" parameterType="Long" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from user <where> id = #{userId} </where>
</select>
</mapper>
新增接口類:
package com.eg.wiener.service; import com.eg.wiener.dto.User; public interface UserService { User getUserById(Long userId); }
編寫接口實現類UserServiceImpl,並對其添加@Service注解,使得它能被Spring Boot掃描,在Controller中使用@Autowired注入。
package com.eg.wiener.service.impl; import com.eg.wiener.dao.UserDao; import com.eg.wiener.dto.User; import com.eg.wiener.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); @Autowired private UserDao userDao; @Override public User getUserById(Long userId) { logger.info("--------*****-----------"); return userDao.getUserById(userId); } }
package com.eg.wiener.controller; import com.eg.wiener.dto.User; import com.eg.wiener.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author Wiener */ @RestController @RequestMapping("/user") public class UserController { private static Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired private UserService userService; /** * 示例地址 http://localhost:8087/wiener/user/getUserById?userId=1 * * @author Wiener * @date 2020/6/25 11:27 */ @RequestMapping("/getUserById") public User getUserById(Long userId) { User user = userService.getUserById(userId); return user; } }
啟動類配置@MapperScan注解
package com.eg.wiener; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.eg.wiener.dao") public class WienerApplication { public static void main(String[] args) { SpringApplication.run(WienerApplication.class, args); } }
在啟動類中使用注解@MapperScan批量掃描所有的Mapper接口。
啟動項目並且登錄監控系統后,在數據源頁面可以看到數據庫配置信息。當請求函數getUserById三次時,在Session監控頁面可以看到請求次數對應的值為3。
總結
以上就是這篇文章的全部內容了,希望本文對大家的學習或者工作能帶來一定的幫助,如有好的改進方式或者文中有任何錯誤,請留言交流。祝各位生活愉快!
Reference
https://www.jianshu.com/p/e6c9e9945e45
https://zhidao.baidu.com/question/116778634.html
https://www.jianshu.com/p/9dc6f4418a06
https://www.jianshu.com/p/541874714907