Spring Boot 集成Mybatis和Druid快速入门
MyBatis 是一個(gè)可以自定義SQL、存儲(chǔ)過程和高級(jí)映射的持久層框架,它摒除了大部分的JDBC代碼、手工設(shè)置參數(shù)和結(jié)果集重獲,只使用簡(jiǎn)單的XML 和注解來配置和映射基本數(shù)據(jù)類型、Map 接口和POJO 到數(shù)據(jù)庫記錄。相對(duì)Hibernate和Apache OJB等“一站式”O(jiān)RM解決方案而言,Mybatis 是一種“半自動(dòng)化”的ORM實(shí)現(xiàn)。
Druid 是阿里巴巴開源的數(shù)據(jù)庫連接池解決方案,因?yàn)橛邪⒗锇桶捅硶?Druid 是當(dāng)今國內(nèi) Java 開發(fā)中非常流行的數(shù)據(jù)庫連接池。本文介紹 Spring Boot 集成 Druid 和Mybatis框架的基礎(chǔ)配置和應(yīng)用,數(shù)據(jù)庫采用MySQL。
軟件環(huán)境
- MySql 8.0.11
- java version 13.0.1
- IntelliJ IDEA 2019.3.2 (Ultimate Edition)
Druid數(shù)據(jù)庫連接池
Druid是什么?它首先是一個(gè)數(shù)據(jù)庫連接池,但它不僅僅是一個(gè)數(shù)據(jù)庫連接池,它還包含一個(gè)ProxyDriver,一系列內(nèi)置的JDBC組件庫,一個(gè)SQL Parser。
整個(gè)項(xiàng)目由數(shù)據(jù)庫連接池、插件框架和SQL解析器組成。該項(xiàng)目主要是為了擴(kuò)展JDBC的一些限制,可以讓程序員實(shí)現(xiàn)一些特殊的需求,比如向密鑰服務(wù)請(qǐng)求憑證、統(tǒng)計(jì)SQL信息、SQL性能收集、SQL注入檢查、SQL翻譯等,程序員可以通過定制來實(shí)現(xiàn)自己需要的功能。
Druid在監(jiān)控,可擴(kuò)展,穩(wěn)定性和高可用方面具有明顯得優(yōu)勢(shì),通過提供的監(jiān)控功能可以觀察數(shù)據(jù)庫連接池和sql查詢工作情況,使用druid連接池可以提高數(shù)據(jù)庫的訪問性能。
Druid支持哪些數(shù)據(jù)庫? Druid支持所有JDBC兼容的數(shù)據(jù)庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid針對(duì)Oracle和MySql做了特別優(yōu)化,比如Oracle的PS Cache內(nèi)存占用優(yōu)化,MySql的ping檢測(cè)優(yōu)化。目前Spring Boot中默認(rèn)支持的連接池有dbcp,dbcp2, tomcat, hikari三種連接池,若要支持Druid,需要自己配置。
新建Spring Boot項(xiàng)目
為了簡(jiǎn)單,項(xiàng)目名姑且命名為wiener。我們?cè)诖艘訫aven作為項(xiàng)目構(gòu)建工具,來構(gòu)建Spring Boot應(yīng)用程序,創(chuàng)建步驟如下,比較簡(jiǎn)單:
這里只勾選了Lombok插件。
Content root根據(jù)需要選擇即可。然后,點(diǎn)擊Finish,接下來請(qǐng)等待項(xiàng)目初始化完成。這里先給出創(chuàng)建完成后的項(xiàng)目結(jié)構(gòu)圖,方便大家了解需要新增哪些文件。
項(xiàng)目結(jié)構(gòu)圖
集成Mybatis和Druid
在dependencies中引入相關(guān)依賴:
<?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
# 配置應(yīng)用的上下文路徑
server.servlet.context-path=/wiener # 配置當(dāng)前要使用的數(shù)據(jù)源的操作類型那個(gè)
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#驅(qū)動(dòng)類
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
# 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計(jì),'wall'用于防火墻
spring.datasource.druid.filters=stat,wall,log4j
# 配置獲取連接等待超時(shí)的時(shí)間
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擴(kuò)展屬性配置
mybatis.config-location:指定mybatis-config.xml的位置;
mybatis.check-config-location:檢查mybatis-config.xml是否存在;
mybatis.mapper-locations:指定mapper的xml的位置;
mybatis.type-aliases-package:指定別名的包,可以多個(gè),逗號(hào)分隔;
它一般對(duì)應(yīng)我們的實(shí)體類所在的包,這個(gè)時(shí)候會(huì)自動(dòng)取對(duì)應(yīng)包中不包括包名的簡(jiǎn)單類名作為包括包名的別名。多個(gè)package之間可以用逗號(hào)或者分號(hào)等來進(jìn)行分隔。(value的值一定要是包的全名)
mybatis.type-handlers-package:指定handler的掃描碼路徑;
mybatis.executor-type:執(zhí)行器類型: SIMPLE, REUSE, BATCH;
mybatis.configuration-properties:MyBatis配置的外部化屬性。指定的屬性可以用作MyBatis配置文件和映射文件的占位符;
mybatis.configuration:嵌套配置,具體子配置如下;
defaultStatementTimeout:設(shè)置超時(shí)時(shí)間,它決定驅(qū)動(dòng)等待數(shù)據(jù)庫響應(yīng)的秒數(shù);
defaultFetchSize:為驅(qū)動(dòng)的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個(gè)提示值。此參數(shù)只可以在查詢?cè)O(shè)置中被覆蓋;
mapUnderscoreToCamelCase:是否開啟自動(dòng)駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射;
autoMappingUnknownColumnBehavior:指定發(fā)現(xiàn)自動(dòng)映射目標(biāo)未知列(或者未知屬性類型)的行為;NONE:不做任何反應(yīng);WARNING:輸出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級(jí)必須設(shè)置為 WARN);FAILING:映射失敗 (拋出 SqlSessionException);
具體參考:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
定義DruidConfig和相關(guān)實(shí)現(xiàn)
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數(shù)據(jù)庫和Druid連接池
*/
@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean druidServlet() {// 主要實(shí)現(xiàn)web監(jiān)控的配置處理
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
new StatViewServlet(), "/druid/*");//表示進(jìn)行druid監(jiān)控的配置處理操作
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");//是否可以重置數(shù)據(jù)源
return servletRegistrationBean;
} /**
* 監(jiān)控面板訪問路徑:
* http://localhost:8087/wiener/druid/login.html
*
* @throws
* @Title: druidServlet
* @Description: 注冊(cè)一個(gè)StatViewServlet 相當(dāng)于在web.xml中聲明了一個(gè)servlet
* @param: void
* @return: ServletRegistrationBean
*/
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");//所有請(qǐng)求進(jìn)行監(jiān)控處理
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");//排除
return filterRegistrationBean;
} @Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
應(yīng)用的上下文路徑(也稱為項(xiàng)目路徑),是構(gòu)成url地址的一部分。Spring Boot默認(rèn)只有一個(gè)Servlet,默認(rèn)會(huì)映射到根路徑/,配置上下文路徑和端口號(hào)的方法是在application.properties文件中添加如下配置:
server.port=8087
# 配置應(yīng)用的上下文路徑,也可以稱為項(xiàng)目路徑,是構(gòu)成url地址的一部分
server.servlet.context-path=/wiener
訪問Druid監(jiān)控系統(tǒng)時(shí),默認(rèn)訪問路徑如下:
http://IP:PORT/projectName/druid/login.html
在未配置項(xiàng)目上下文路徑時(shí),其訪問路徑如下:
http://localhost:8087/druid/login.html
在配置應(yīng)用上下文路徑后,其訪問路徑如下:
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層只提供一個(gè)接口,通過用戶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);
}
編寫接口實(shí)現(xiàn)類UserServiceImpl,并對(duì)其添加@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;
}
}
啟動(dòng)類配置@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);
} }
在啟動(dòng)類中使用注解@MapperScan批量掃描所有的Mapper接口。
啟動(dòng)項(xiàng)目并且登錄監(jiān)控系統(tǒng)后,在數(shù)據(jù)源頁面可以看到數(shù)據(jù)庫配置信息。當(dāng)請(qǐng)求函數(shù)getUserById三次時(shí),在Session監(jiān)控頁面可以看到請(qǐng)求次數(shù)對(duì)應(yīng)的值為3。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如有好的改進(jìn)方式或者文中有任何錯(cuò)誤,請(qǐng)留言交流。祝各位生活愉快!
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
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 集成Mybatis和Druid快速入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux(Ubuntu22.04)二进
- 下一篇: 有没有这样的奶粉呢?