聲明:本文來源於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就能夠看到監控頁面了
利用監控能夠方便的進行程序的管理,這一點在企業開發之中相當重要。