寫在前面
看過幾個大牛寫的博客還有在一些網課網站上看的講SpringBoot的視頻,幾乎都是講的基於Hibernate來進行數據庫操作。雖然我之前也學習過Hibernate,不過,我更喜歡Mybatis這種可以自定義SQL,而且還更輕量級的框架,所以我通過查閱資料,對Mybatis進行了整合。整合期間失敗過很多次,主要的原因是我查閱的大部分資料都是很早之前的版本,在我現在使用的版本中並不適用;次要的原因就是部分整合方案並不是我所認爲好的方案。經過查閱很多資料,進行過很多次測試,終於整合成功,來寫一篇文章記錄我的整合過程。
版本信息
- JDK: 1.8.0_111
- 數據庫: MySQL 5.7
- IDE: Spring Tool Suite 3.8.3.RELEASE
- 構建工具: Apache Maven 3.3.9
- SpringBoot: 1.5.1.RELEASE
- Druid:1.0.28
- Mybatis-SpringBoot: 1.2.0 (基於SpringBoot的版本,不是單純的Mybatis)
- PageHelper-SpringBoot: 1.1.0 (基於SpringBoot的版本,不是單純的PageHelper)
項目結構
前期準備
既然我們是整合數據庫框架,那麼,我們前期新建一個數據庫是必須的吧。SQL如下:
CREATE SCHEMA `demo` DEFAULT CHARACTER SET utf8 ;
CREATE TABLE `demo`.`t_demo` (
`id` INT NOT NULL,
`name` CHAR(7) NULL,
PRIMARY KEY (`id`));
INSERT INTO `demo`.`t_demo` (`id`, `name`) VALUES ('1', 'howieli');
INSERT INTO `demo`.`t_demo` (`id`, `name`) VALUES ('2', '李昊');
添加依賴
<!-- 添加mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 添加druid依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.28</version>
</dependency>
<!--
spring boot mybatis依賴
使用大於1.0.0版本,因爲1.0.0版本不支持攔截器插件
當前最新版本爲1.2.0版本
-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- 添加pagehelper分頁插件依賴 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
新增配置信息
添加依賴後,在SpringBoot
的配置文件application.yml
中添加如下配置:
server:
port: 8080
logging:
level:
cn.howieli.boot: TRACE
# spring:
# thymeleaf:
# cache: false
#Druid連接池配置
druid:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
filters: stat,wall,log4j
maxActive: 20
initialSize: 0
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
maxOpenPreparedStatements: 20
#Mybatis配置
mybatis:
type-aliases-package: cn.howieli.boot.model
mapper-locations:
- classpath*:cn/howieli/boot/mapper/*.xml
#分頁插件配置
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
其中,mybatis
下主要配置了javaBean
包路徑和xml
的路徑,至於dao
或者叫mapper
的接口文件在哪配置,這個需要在啓動類添加一個@MapperScan
註解或者每個接口文件上添加@Mapper
註解都可以實現,這裏主要使用前者的方案配置,在入口文件添加註解:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan //配置Druid的監控頁面需要用到的註解
@MapperScan("cn.howieli.boot.dao") //通過該註解,掃面該包下面的接口文件
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
pagehelper的配置,按照作者GitHub照搬下來的。
這裏需要注意的是,druid
會提示警告,說是不支持的屬性,這的確是不支持的,所以我們需要再寫一個類來注入這些屬性。代碼如下:
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration
public class DruidConfig {
private Logger logger = LoggerFactory.getLogger(DruidConfig.class);
@Value("${druid.url}")
private String dbUrl;
@Value("${druid.username}")
private String username;
@Value("${druid.password}")
private String password;
@Value("${druid.driver-class-name}")
private String driverClassName;
@Value("${druid.initialSize}")
private int initialSize;
@Value("${druid.minIdle}")
private int minIdle;
@Value("${druid.maxActive}")
private int maxActive;
@Value("${druid.maxWait}")
private int maxWait;
@Value("${druid.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${druid.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${druid.validationQuery}")
private String validationQuery;
@Value("${druid.testWhileIdle}")
private boolean testWhileIdle;
@Value("${druid.testOnBorrow}")
private boolean testOnBorrow;
@Value("${druid.testOnReturn}")
private boolean testOnReturn;
@Value("${druid.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${druid.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${druid.filters}")
private String filters;
@Value("${druid.connectionProperties}")
private String connectionProperties;
@Value("${druid.maxOpenPreparedStatements}")
private int maxOpenPreparedStatements;
@Bean
@Primary //Spring優先選擇被該註解所標記的數據源
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl)
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
datasource.setConnectionProperties(connectionProperties);
datasource.setMaxOpenPreparedStatements(maxOpenPreparedStatements);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter", e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
}
這樣就配置好了Druid
的數據庫連接池。
配置Druid監控頁面
我的整合過程沒有使用SpringBoot
的默認數據源,而是使用了由阿里巴巴開發的Druid
的數據源。因爲Druid
提供了一個高效、功能強大、可擴展性好的數據庫連接池,還可以監控數據庫訪問性能和SQL
執行情況等等強大的功能。
下面,我們就配置一下Druid
的監控頁面,首先新建一個Servlet
,代碼如下:
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import com.alibaba.druid.support.http.StatViewServlet;
@WebServlet(urlPatterns = "/druid/*",
initParams = {
@WebInitParam(name = "allow", value="127.0.0.1"),
@WebInitParam(name="deny", value="192.168.1.73"),// IP黑名單 (存在共同時,deny優先於allow)
@WebInitParam(name="loginUsername", value="admin"),// 用戶名
@WebInitParam(name="loginPassword", value="123456"),// 密碼
@WebInitParam(name="resetEnable", value="false")// 禁用HTML頁面上的“Reset All”功能
})
public class DruidStatViewServlet extends StatViewServlet {
private static final long serialVersionUID = 1L;
}
我是通過註解的方式創建的Servlet
,在SpringBoot
中,需要在啓動類上加@ServletComponentScan
註解,才能找到該Servlet
,否則會報404錯誤。
再創建一個filter
過濾器,代碼如下:
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import com.alibaba.druid.support.http.WebStatFilter;
@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*",
initParams = {
@WebInitParam(name = "exclusions", value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略資源
})
public class DruidStatFilter extends WebStatFilter {
}
這樣就配置好了Druid
的監控頁面。我這裏是啓動項目後訪問http://localhost:8080/druid
,輸入你配置的用戶名密碼登錄即可。登錄之後會顯示如下頁面:
測試整合框架
我是這樣測試的:
1.cn.howieli.boot.model
包下創建User.java
,有id
和name
兩個屬性,並有相應的setter
和getter
方法.
2.cn.howieli.boot.mapper
包下創建UserMapper.xml
,實現查找所有數據和修改某用戶數據.
3.cn.howieli.boot.dao
包下創建UserDao.java
.
4.cn.howieli.boot.service
包下創建IUserService.java
5.cn.howieli.boot.service.impl
包下創建UserService.java
6.cn.howieli.boot.controller
包下創建UserController.java
主要實現了兩個功能,一個是查詢所有數據,一個是修改用戶數據。前者用於測試是否整合Mybatis
成功和PageHelper
分頁插件,後者主要通過@Transactional
註解來測試數據庫的事務控制。
代碼就不在文章中一個一個寫出,已經上傳到GitHub,需要的同學可以看一下。
Github地址:https://github.com/IT-HowieLi/SpringBoot-Mybatis-Druid-PageHelper.
小結
以上就是我整合mybatis
的整個過程,如有疏漏,還望指正。感謝!!!
個人博客:https://www.howieli.cn 和個人CSDN博客: http://blog.csdn.net/howieli_1995。