Spring-Boot學習筆記-整合Mybatis-Druid-PageHelper

寫在前面

  看過幾個大牛寫的博客還有在一些網課網站上看的講SpringBoot的視頻,幾乎都是講的基於Hibernate來進行數據庫操作。雖然我之前也學習過Hibernate,不過,我更喜歡Mybatis這種可以自定義SQL,而且還更輕量級的框架,所以我通過查閱資料,對Mybatis進行了整合。整合期間失敗過很多次,主要的原因是我查閱的大部分資料都是很早之前的版本,在我現在使用的版本中並不適用;次要的原因就是部分整合方案並不是我所認爲好的方案。經過查閱很多資料,進行過很多次測試,終於整合成功,來寫一篇文章記錄我的整合過程。


版本信息


項目結構

         


前期準備

  既然我們是整合數據庫框架,那麼,我們前期新建一個數據庫是必須的吧。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,有idname兩個屬性,並有相應的settergetter方法.
  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


參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章