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


参考资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值