SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 數據源、配置 MyBatis、事務控制、druid 監控)

聲明:本文來源於MLDN培訓視頻的課堂筆記,寫在這裏只是爲了方便查閱。css

一、概念:SpringBoot 整合 MyBatisjava

二、背景mysql

  SpringBoot 獲得最終效果是一個簡化到極致的 WEB 開發,可是隻要牽扯到 WEB 開發,就絕對不可能缺乏數據層操做,全部的開發都必定秉持着 MVC 設計模式的原則,MVC 裏面業務層不可少,數據層永遠要與業務層綁定在一塊兒,既然要進行數據層的操做,那麼確定首選的必定就是 MyBatis,由於 MyBatis 整合處理以後尤爲是與 Spring 整合裏面能夠直接避免掉 DAO 層的編寫, 同時 VO 類也是最乾淨的,這一點上絕對要比其它的 ORMapping 組件都方便。web

2.一、配置 druid 數據源spring

這個數據庫鏈接池的配置是由阿里提供的,而且因爲其性能很高,同時具有有很好的監控性,在實際的開發之中已經開始普遍的使用了。sql

一、 首先編寫一個數據庫建立腳本:數據庫

DROP DATBASE IF EXISTS study ; CREATE DATBASE study CHARACTER SET UTF8 ; USE study ; CREATE TABLE dept ( deptno BIGINT AUTO_INCREMENT , dname VARCHAR(50) , CONSTRAINT pk_deptno PRIMARY KEY(deptno) ) ; INSERT INTO dept(dname) VALUES ('開發部') ; INSERT INTO dept(dname) VALUES ('財務部') ; INSERT INTO dept(dname) VALUES ('市場部') ; INSERT INTO dept(dname) VALUES ('後勤部') ; INSERT INTO dept(dname) VALUES ('公關部') ;

二、 隨後要進行druid 的數據源的配置,若是要想使用druid 的數據源,那麼首先必定要去修改 pom.xml 配置文件,引入如下包:apache

<dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.0.4</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.31</version>
            </dependency>

三、 若是要進行數據源的整合處理,直接修改 application.yml 配置文件便可:設計模式

server: port: 80 spring: messages: basename: i18n/Messages,i18n/Pages datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置當前要使用的數據源的操做類型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驅動程序類 url: jdbc:mysql://localhost:3306/study # 數據庫鏈接地址 username: root # 數據庫用戶名 password: mysqladmin # 數據庫鏈接密碼 dbcp2: # 進行數據庫鏈接池的配置 min-idle: 5 # 數據庫鏈接池的最小維持鏈接數 initial-size: 5 # 初始化提供的鏈接數 max-total: 5 # 最大的鏈接數 max-wait-millis: 200 # 等待鏈接獲取的最大超時時間

四、 若是這個時候你須要進行 junit 代碼測試,則必定要將 mybatis 開發包配置過來,由於只有在 mybatis 開發包裏面纔會將 druid 的配置的數據庫鏈接池變爲所須要的 DataSource 數據源對象。瀏覽器

 <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.0</version>
            </dependency>

五、 測試一下當前的鏈接池是否可用

package cn.study.microboot.test; import javax.annotation.Resource; import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import cn.study.microboot.StartSpringBootMain; @SpringBootTest(classes = StartSpringBootMain.class) @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration public class TestDataSource { @Resource private DataSource dataSource; @Test public void testConnection() throws Exception { System.out.println(this.dataSource); } }

此時能夠獲取數據庫鏈接,表示當前的 druid 的配置正確。

2.二、配置 MyBatis

若是要進行 mybatis 的配置必定要導入 spring-boot 所支持的 mybatis 開發包。

 <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.0</version>
            </dependency>

一、 隨後要去修改 application.yml 配置文件,追加 mybatis 的相關配置項:

mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: cn.study.microboot.vo # 定義全部操做類的別名所在包 mapper-locations: # 全部的mapper映射文件 - classpath:mybatis/mapper/**/*.xml

二、 創建一個 Dept 的 VO 類:

package cn.study.microboot.vo; import java.io.Serializable; @SuppressWarnings("serial") public class Dept implements Serializable { private Long deptno ; private String dname ; public Long getDeptno() { return deptno; } public void setDeptno(Long deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } @Override public String toString() { return "Dept [deptno=" + deptno + ", dname=" + dname + "]"; } }

三、 在 src/main/resources 目錄下創建有一個 mybatis/mybatis.cfg.xml 配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 進行Mybatis的相應的環境的屬性定義 -->
    <settings>    <!-- 在本項目之中開啓二級緩存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

四、 src/main/resources/mybatis 下創建有一個 mapper 子目錄,然後在裏面定義有 cn/mldn/Dept.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="cn.study.microboot.dao.IDeptDAO">
    <select id="findAll" resultType="Dept"> SELECT deptno,dname FROM dept ; </select>
</mapper>

五、 創建 IDeptDAO 接口,注意接口所在的包:

package cn.study.microboot.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import cn.study.microboot.vo.Dept; @Mapper public interface IDeptDAO { public List<Dept> findAll() ; }

在定義 DAO 接口的時候因爲須要自動生成實現子類,因此在接口聲明處必定要編寫有一個「@Mapper」註解,不然你的 DAO 接口和*.xml 的 Mapper 文件沒法整合在一塊兒。

六、 創建一個 IDeptService 接口,做爲服務使用:

package cn.study.microboot.service; import java.util.List; import cn.study.microboot.vo.Dept; public interface IDeptService { public List<Dept> list() ; }
package cn.study.microboot.service.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import cn.study.microboot.dao.IDeptDAO; import cn.study.microboot.service.IDeptService; import cn.study.microboot.vo.Dept; @Service public class DeptServiceImpl implements IDeptService { @Resource private IDeptDAO deptDAO; @Override public List<Dept> list() { return this.deptDAO.findAll(); } }

七、 進行代碼測試類的編寫:

package cn.study.microboot.test; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import cn.study.microboot.StartSpringBootMain; import cn.study.microboot.service.IDeptService; @SpringBootTest(classes = StartSpringBootMain.class) @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration public class TestDeptService { @Resource private IDeptService deptService; @Test public void testList() throws Exception { System.out.println(this.deptService.list()); } }

此時測試經過,則 SpringBoot 與 MyBatis 已經能夠成功的整合在一塊兒進行項目開發,此時的配置要比以前使用 Spring + Mybatis 直接配置簡單 N 多倍。

2.三、事務控制

一、 修改 IDeptService 接口,追加一個只讀事務控制:

package cn.study.microboot.service; import java.util.List; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import cn.study.microboot.vo.Dept; public interface IDeptService { @Transactional(readOnly = true) public List<Dept> list() ; }

此時配置了一個只讀的事務操做,那麼也就是說在這個業務方法只可以採用讀的模式來進行操做。

二、 可是如今你配置了一個註解並不表示當前已經合理的支持了事務,若是要進行事務的啓用,還須要在程序啓動類上追加一個 新的註解配置:

package cn.study.microboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication // 啓動SpringBoot程序,然後自帶子包掃描
@EnableTransactionManagement public class StartSpringBootMain { public static void main(String[] args) throws Exception { SpringApplication.run(StartSpringBootMain.class, args); } }

三、 若是如今要想更好的觀察到事務的問題,最簡單的作法是編寫一個數據增長操做,然後爲這個業務方法設置只讀配置。

· 修改 IDeptDAO 接口追加一個新的方法:

package cn.study.microboot.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import cn.study.microboot.vo.Dept; @Mapper public interface IDeptDAO { public List<Dept> findAll(); public boolean doCreate(Dept vo) ; }

· 修改 Dept.xml 配置文件,追加一個方法的實現 SQL 語句:

<insert id="doCreate" parameterType="Dept"> INSERT INTO dept(dname) VALUES (#{dname}) ; </insert>

· 在 IDeptService 接口之中追加有一個業務方法:

@Transactional((readOnly = true) public boolean add(Dept vo) ;

· 編寫測試方法:

 @Test public void testAdd() throws Exception { Dept dept = new Dept(); dept.setDname("測試部"); System.out.println(this.deptService.add(dept)); }

此時會報錯

四、 若是在實際的工做之中,對於更新操做應該強制性的啓動一個事務控制纔對:

@Transactional(propagation=Propagation.REQUIRED) public boolean add(Dept vo) ;

此時應該明確的表示該操做方法應該啓動有一個事務的配置項。

五、 在使用Spring+MyBatis裏面處理的時候應該考慮到信息顯示問題,因此此處建議使用logback日誌組件來進行日誌信息的配置;

· 將 logback.xml 配置文件拷貝到 src/main/resources 目錄之中;

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true">
    <property name="APP" value="${project.artifactId}" />
    <property name="LOG_HOME" value="/data/www/log/${APP}" />
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
        </encoder>
    </appender>
    <appender name="DETAIL" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
        <File>${LOG_HOME}/${APP}_detail.log</File>
        <encoder>
            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${APP}_detail.log.%d{yyyyMMdd}</fileNamePattern>
        </rollingPolicy>
    </appender>
    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
        <File>${LOG_HOME}/${APP}_access.log</File>
        <encoder>
            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS};%X{ServiceId};%m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${APP}_access.log.%d{yyyyMMdd}</fileNamePattern>
        </rollingPolicy>
    </appender>


    <logger name="ACCESS">
        <appender-ref ref="ACCESS" />
    </logger>
    <logger name="druid.sql.Statement" level="DEBUG" />
    <logger name="cn.study.microboot.dao" level="TRACE" />

    <root level="INFO">
        <appender-ref ref="DETAIL" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

· 在項目之中去引入 logback 的依賴程序文件:

 <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>

· 在正常狀況下 mybatis 中的日誌信息的輸出操做必須設置其對應的命名空間,在 logback.xml 中追加以下信息:

<logger name="cn.study.microboot.dao" level="TRACE" />

2.四、druid 監控

druid 數據庫鏈接池之因此使用很是普遍,其最主要的緣由在於它能夠直接提供性能監控。那麼本次來針對於當前已經實現好 的 druid 配置來進行性能監控的處理配置。

一、 若是要想進行 Druid 的性能的監控操做,則須要作一些基礎配置,例如:你訪問的 IP 地址是不是白名單。

package cn.study.microboot.config; import javax.sql.DataSource; 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 com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; @Configuration public class DruidConfig { @Bean public ServletRegistrationBean druidServlet() { // 主要實現WEB監控的配置處理
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean( new StatViewServlet(), "/druid/*"); // 如今要進行druid監控的配置處理操做
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1,192.168.1.159"); // 白名單
        servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名單
        servletRegistrationBean.addInitParameter("loginUsername", "studyjava"); // 用戶名
        servletRegistrationBean.addInitParameter("loginPassword", "hello"); // 密碼
        servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否能夠重置數據源
        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(); } }

二、 爲了更好的說明問題,建議創建一個控制器進行業務層的調用;

package cn.study.microboot.controller; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import cn.study.microboot.service.IDeptService; import cn.study.microboot.util.controller.AbstractBaseController; @RestController public class DeptController extends AbstractBaseController { @Resource private IDeptService deptService ; @RequestMapping(value = "/list", method = RequestMethod.GET) public Object list() { // 經過model能夠實現內容的傳遞
        return this.deptService.list() ; } }

三、 若是要想進行監控還須要開啓一個過濾配置,而這個過濾配置的開啓須要經過 application.yml 文件配置;

spring: messages: basename: i18n/Messages,i18n/Pages datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置當前要使用的數據源的操做類型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驅動程序類 url: jdbc:mysql://localhost:3306/study # 數據庫鏈接地址 username: root # 數據庫用戶名 password: mysqladmin # 數據庫鏈接密碼  filters: stat,wall,log4j dbcp2: # 進行數據庫鏈接池的配置 min-idle: 5 # 數據庫鏈接池的最小維持鏈接數 initial-size: 5 # 初始化提供的鏈接數 max-total: 5 # 最大的鏈接數 max-wait-millis: 200 # 等待鏈接獲取的最大超時時間

啓動項目,在瀏覽器地址欄輸入http://localhost/druid,而後輸入用戶名studyjava,密碼hello就能夠看到監控頁面了

利用監控能夠方便的進行程序的管理,這一點在企業開發之中相當重要。

相關文章
相關標籤/搜索