1、概念:SpringBoot 整合 MyBatis

2、背景

  SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发都一定秉持着 MVC 设计模式的原则,MVC 里面业务层不可少,数据层永远要与业务层绑定在一起,既然要进行数据层的操作,那么肯定首选的一定就是 MyBatis,因为 MyBatis 整合处理之后尤其是与 Spring 整合里面可以直接避免掉 DAO 层的编写, 同时 VO 类也是最干净的,这一点上绝对要比其它的 ORMapping 组件都方便。

2.1、配置 druid 数据源

这个数据库连接池的配置是由阿里提供的,并且由于其性能很高,同时具备有很好的监控性,在实际的开发之中已经开始广泛的使用了。

1、 首先编写一个数据库创建脚本:

  1. DROP DATBASE IF EXISTS study ;
  2. CREATE DATBASE study CHARACTER SET UTF8 ;
  3. USE study ;
  4. CREATE TABLE dept (
  5. deptno BIGINT AUTO_INCREMENT ,
  6. dname VARCHAR(50) ,
  7. CONSTRAINT pk_deptno PRIMARY KEY(deptno)
  8. ) ;
  9. INSERT INTO dept(dname) VALUES ('开发部') ;
  10. INSERT INTO dept(dname) VALUES ('财务部') ;
  11. INSERT INTO dept(dname) VALUES ('市场部') ;
  12. INSERT INTO dept(dname) VALUES ('后勤部') ;
  13. INSERT INTO dept(dname) VALUES ('公关部') ;

2、 随后要进行druid 的数据源的配置,如果要想使用druid 的数据源,那么首先一定要去修改 pom.xml 配置文件,引入以下包:

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <version>5.0.4</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba</groupId>
  8. <artifactId>druid</artifactId>
  9. <version>1.0.31</version>
  10. </dependency>

3、 如果要进行数据源的整合处理,直接修改 application.yml 配置文件即可:

  1. server:
  2. port: 80
  3. spring:
  4. messages:
  5. basename: i18n/Messages,i18n/Pages
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
  8. driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驱动程序类
  9. url: jdbc:mysql://localhost:3306/study # 数据库连接地址
  10. username: root # 数据库用户名
  11. password: mysqladmin # 数据库连接密码
  12. dbcp2: # 进行数据库连接池的配置
  13. min-idle: 5 # 数据库连接池的最小维持连接数
  14. initial-size: 5 # 初始化提供的连接数
  15. max-total: 5 # 最大的连接数
  16. max-wait-millis: 200 # 等待连接获取的最大超时时间

4、 如果这个时候你需要进行 junit 代码测试,则一定要将 mybatis 开发包配置过来,因为只有在 mybatis 开发包里面才会将 druid 的配置的数据库连接池变为所需要的 DataSource 数据源对象。

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>1.3.0</version>
  5. </dependency>

5、 测试一下当前的连接池是否可用

  1. package cn.study.microboot.test;
  2.  
  3. import javax.annotation.Resource;
  4. import javax.sql.DataSource;
  5.  
  6. import org.junit.Test;
  7. import org.junit.runner.RunWith;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  10. import org.springframework.test.context.web.WebAppConfiguration;
  11.  
  12. import cn.study.microboot.StartSpringBootMain;
  13.  
  14. @SpringBootTest(classes = StartSpringBootMain.class)
  15. @RunWith(SpringJUnit4ClassRunner.class)
  16. @WebAppConfiguration
  17. public class TestDataSource {
  18. @Resource
  19. private DataSource dataSource;
  20. @Test
  21. public void testConnection() throws Exception {
  22. System.out.println(this.dataSource);
  23. }
  24. }

此时可以获取数据库连接,表示当前的 druid 的配置正确。

2.2、配置 MyBatis

如果要进行 mybatis 的配置一定要导入 spring-boot 所支持的 mybatis 开发包。

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>1.3.0</version>
  5. </dependency>

1、 随后要去修改 application.yml 配置文件,追加 mybatis 的相关配置项:

  1. mybatis:
  2. config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
  3. type-aliases-package: cn.study.microboot.vo # 定义所有操作类的别名所在包
  4. mapper-locations: # 所有的mapper映射文件
  5. - classpath:mybatis/mapper/**/*.xml

2、 建立一个 Dept 的 VO 类:

  1. package cn.study.microboot.vo;
  2.  
  3. import java.io.Serializable;
  4.  
  5. @SuppressWarnings("serial")
  6. public class Dept implements Serializable {
  7. private Long deptno ;
  8. private String dname ;
  9. public Long getDeptno() {
  10. return deptno;
  11. }
  12. public void setDeptno(Long deptno) {
  13. this.deptno = deptno;
  14. }
  15. public String getDname() {
  16. return dname;
  17. }
  18. public void setDname(String dname) {
  19. this.dname = dname;
  20. }
  21. @Override
  22. public String toString() {
  23. return "Dept [deptno=" + deptno + ", dname=" + dname + "]";
  24. }
  25. }

3、 在 src/main/resources 目录下建立有一个 mybatis/mybatis.cfg.xml 配置文件:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 进行Mybatis的相应的环境的属性定义 -->
  7. <settings> <!-- 在本项目之中开启二级缓存 -->
  8. <setting name="cacheEnabled" value="true"/>
  9. </settings>
  10. </configuration>

4、 src/main/resources/mybatis 下建立有一个 mapper 子目录,而后在里面定义有 cn/mldn/Dept.xml 配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="cn.study.microboot.dao.IDeptDAO">
  5. <select id="findAll" resultType="Dept">
  6. SELECT deptno,dname FROM dept ;
  7. </select>
  8. </mapper>

5、 建立 IDeptDAO 接口,注意接口所在的包:

  1. package cn.study.microboot.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.apache.ibatis.annotations.Mapper;
  6.  
  7. import cn.study.microboot.vo.Dept;
  8. @Mapper
  9. public interface IDeptDAO {
  10. public List<Dept> findAll() ;
  11. }

在定义 DAO 接口的时候由于需要自动生成实现子类,所以在接口声明处一定要编写有一个“@Mapper”注解,否则你的 DAO 接口和*.xml 的 Mapper 文件无法整合在一起。

6、 建立一个 IDeptService 接口,作为服务使用:

  1. package cn.study.microboot.service;
  2.  
  3. import java.util.List;
  4.  
  5. import cn.study.microboot.vo.Dept;
  6.  
  7. public interface IDeptService {
  8. public List<Dept> list() ;
  9. }
  1. package cn.study.microboot.service.impl;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.annotation.Resource;
  6.  
  7. import org.springframework.stereotype.Service;
  8.  
  9. import cn.study.microboot.dao.IDeptDAO;
  10. import cn.study.microboot.service.IDeptService;
  11. import cn.study.microboot.vo.Dept;
  12. @Service
  13. public class DeptServiceImpl implements IDeptService {
  14. @Resource
  15. private IDeptDAO deptDAO;
  16. @Override
  17. public List<Dept> list() {
  18. return this.deptDAO.findAll();
  19. }
  20.  
  21. }

7、 进行代码测试类的编写:

  1. package cn.study.microboot.test;
  2.  
  3. import javax.annotation.Resource;
  4.  
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  9. import org.springframework.test.context.web.WebAppConfiguration;
  10.  
  11. import cn.study.microboot.StartSpringBootMain;
  12. import cn.study.microboot.service.IDeptService;
  13.  
  14. @SpringBootTest(classes = StartSpringBootMain.class)
  15. @RunWith(SpringJUnit4ClassRunner.class)
  16. @WebAppConfiguration
  17. public class TestDeptService {
  18. @Resource
  19. private IDeptService deptService;
  20. @Test
  21. public void testList() throws Exception {
  22. System.out.println(this.deptService.list());
  23. }
  24. }

此时测试通过,则 SpringBoot 与 MyBatis 已经可以成功的整合在一起进行项目开发,此时的配置要比之前使用 Spring + Mybatis 直接配置简单 N 多倍。

2.3、事务控制

1、 修改 IDeptService 接口,追加一个只读事务控制:

  1. package cn.study.microboot.service;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.transaction.annotation.Propagation;
  6. import org.springframework.transaction.annotation.Transactional;
  7.  
  8. import cn.study.microboot.vo.Dept;
  9.  
  10. public interface IDeptService {
  11. @Transactional(readOnly = true)
  12. public List<Dept> list() ;
  13. }

此时配置了一个只读的事务操作,那么也就是说在这个业务方法只能够采用读的模式来进行操作。

2、 但是现在你配置了一个注解并不表示当前已经合理的支持了事务,如果要进行事务的启用,还需要在程序启动类上追加一个 新的注解配置:

  1. package cn.study.microboot;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.transaction.annotation.EnableTransactionManagement;
  6.  
  7. @SpringBootApplication // 启动SpringBoot程序,而后自带子包扫描
  8. @EnableTransactionManagement
  9. public class StartSpringBootMain {
  10. public static void main(String[] args) throws Exception {
  11. SpringApplication.run(StartSpringBootMain.class, args);
  12. }
  13. }

3、 如果现在要想更好的观察到事务的问题,最简单的做法是编写一个数据增加操作,而后为这个业务方法设置只读配置。

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

  1. package cn.study.microboot.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.apache.ibatis.annotations.Mapper;
  6.  
  7. import cn.study.microboot.vo.Dept;
  8. @Mapper
  9. public interface IDeptDAO {
  10. public List<Dept> findAll();
  11. public boolean doCreate(Dept vo) ;
  12. }

· 修改 Dept.xml 配置文件,追加一个方法的实现 SQL 语句:

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

· 在 IDeptService 接口之中追加有一个业务方法:

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

· 编写测试方法:

  1. @Test
  2. public void testAdd() throws Exception {
  3. Dept dept = new Dept();
  4. dept.setDname("测试部");
  5. System.out.println(this.deptService.add(dept));
  6. }

此时会报错

4、 如果在实际的工作之中,对于更新操作应该强制性的启动一个事务控制才对:

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

此时应该明确的表示该操作方法应该启动有一个事务的配置项。

5、 在使用Spring+MyBatis里面处理的时候应该考虑到信息显示问题,所以此处建议使用logback日志组件来进行日志信息的配置;

· 将 logback.xml 配置文件拷贝到 src/main/resources 目录之中;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <configuration scan="true">
  4. <property name="APP" value="${project.artifactId}" />
  5. <property name="LOG_HOME" value="/data/www/log/${APP}" />
  6. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  7. <encoder>
  8. <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
  9. </encoder>
  10. </appender>
  11. <appender name="DETAIL"
  12. class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
  13. <File>${LOG_HOME}/${APP}_detail.log</File>
  14. <encoder>
  15. <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
  16. </encoder>
  17. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  18. <fileNamePattern>${LOG_HOME}/${APP}_detail.log.%d{yyyyMMdd}</fileNamePattern>
  19. </rollingPolicy>
  20. </appender>
  21. <appender name="ACCESS"
  22. class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
  23. <File>${LOG_HOME}/${APP}_access.log</File>
  24. <encoder>
  25. <pattern>%d{yy-MM-dd.HH:mm:ss.SSS};%X{ServiceId};%m%n</pattern>
  26. </encoder>
  27. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  28. <fileNamePattern>${LOG_HOME}/${APP}_access.log.%d{yyyyMMdd}</fileNamePattern>
  29. </rollingPolicy>
  30. </appender>
  31.  
  32. <logger name="ACCESS">
  33. <appender-ref ref="ACCESS" />
  34. </logger>
  35. <logger name="druid.sql.Statement" level="DEBUG" />
  36. <logger name="cn.study.microboot.dao" level="TRACE" />
  37.  
  38. <root level="INFO">
  39. <appender-ref ref="DETAIL" />
  40. <appender-ref ref="CONSOLE" />
  41. </root>
  42. </configuration>

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

  1. <dependency>
  2. <groupId>ch.qos.logback</groupId>
  3. <artifactId>logback-core</artifactId>
  4. </dependency>

· 在正常情况下 mybatis 中的日志信息的输出操作必须设置其对应的命名空间,在 logback.xml 中追加如下信息:

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

2.4、druid 监控

druid 数据库连接池之所以使用非常广泛,其最主要的原因在于它可以直接提供性能监控。那么本次来针对于当前已经实现好 的 druid 配置来进行性能监控的处理配置。

1、 如果要想进行 Druid 的性能的监控操作,则需要做一些基础配置,例如:你访问的 IP 地址是否是白名单。

  1. package cn.study.microboot.config;
  2.  
  3. import javax.sql.DataSource;
  4.  
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  7. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10.  
  11. import com.alibaba.druid.pool.DruidDataSource;
  12. import com.alibaba.druid.support.http.StatViewServlet;
  13. import com.alibaba.druid.support.http.WebStatFilter;
  14.  
  15. @Configuration
  16. public class DruidConfig {
  17. @Bean
  18. public ServletRegistrationBean druidServlet() { // 主要实现WEB监控的配置处理
  19. ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
  20. new StatViewServlet(), "/druid/*"); // 现在要进行druid监控的配置处理操作
  21. servletRegistrationBean.addInitParameter("allow",
  22. "127.0.0.1,192.168.1.159"); // 白名单
  23. servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名单
  24. servletRegistrationBean.addInitParameter("loginUsername", "studyjava"); // 用户名
  25. servletRegistrationBean.addInitParameter("loginPassword", "hello"); // 密码
  26. servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否可以重置数据源
  27. return servletRegistrationBean ;
  28. }
  29. @Bean
  30. public FilterRegistrationBean filterRegistrationBean() {
  31. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
  32. filterRegistrationBean.setFilter(new WebStatFilter());
  33. filterRegistrationBean.addUrlPatterns("/*"); // 所有请求进行监控处理
  34. filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
  35. return filterRegistrationBean ;
  36. }
  37. @Bean
  38. @ConfigurationProperties(prefix = "spring.datasource")
  39. public DataSource druidDataSource() {
  40. return new DruidDataSource();
  41. }
  42. }

2、 为了更好的说明问题,建议建立一个控制器进行业务层的调用;

  1. package cn.study.microboot.controller;
  2.  
  3. import javax.annotation.Resource;
  4.  
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.bind.annotation.RestController;
  8.  
  9. import cn.study.microboot.service.IDeptService;
  10. import cn.study.microboot.util.controller.AbstractBaseController;
  11.  
  12. @RestController
  13. public class DeptController extends AbstractBaseController {
  14. @Resource
  15. private IDeptService deptService ;
  16. @RequestMapping(value = "/list", method = RequestMethod.GET)
  17. public Object list() { // 通过model可以实现内容的传递
  18. return this.deptService.list() ;
  19. }
  20. }

3、 如果要想进行监控还需要开启一个过滤配置,而这个过滤配置的开启需要通过 application.yml 文件配置;

  1. spring:
  2. messages:
  3. basename: i18n/Messages,i18n/Pages
  4. datasource:
  5. type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
  6. driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驱动程序类
  7. url: jdbc:mysql://localhost:3306/study # 数据库连接地址
  8. username: root # 数据库用户名
  9. password: mysqladmin # 数据库连接密码
  10. filters: stat,wall,log4j
  11. dbcp2: # 进行数据库连接池的配置
  12. min-idle: 5 # 数据库连接池的最小维持连接数
  13. initial-size: 5 # 初始化提供的连接数
  14. max-total: 5 # 最大的连接数
  15. max-wait-millis: 200 # 等待连接获取的最大超时时间

启动项目,在浏览器地址栏输入http://localhost/druid,然后输入用户名studyjava,密码hello就可以看到监控页面了

SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)的更多相关文章

  1. springboot系列七:springboot 集成 MyBatis、事物配置及使用、druid 数据源、druid 监控使用

    一.MyBatis和druid简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...

  2. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

  3. SPRING-BOOT系列之SpringBoot快速入门

    今天 , 正式来介绍SpringBoot快速入门 : 可以去如类似 https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/refer ...

  4. Spring Boot Druid数据源配置

    package com.hgvip.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.su ...

  5. 21. Spring Boot Druid 数据源配置解析

    1.数据源配置属性类源码 package org.springframework.boot.autoconfigure.jdbc; @ConfigurationProperties( prefix = ...

  6. Druid数据源配置入门

    Druid是什么 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...

  7. spring,mybatis,多数据源配置

    spring.xml配置 <!-- 对数据源进行事务管理 --> <bean id="transactionManager" class="org.sp ...

  8. 阿里druid数据源配置及数据库密码加密

    注意: 1.阿里默认只对用户密码解密 2.druid 1.0.16版本及以上的解密时需要同时配置publicKey 一.生成密文密码 1 前提:已经配置了jdk环境 1.生成密文密码需要准备druid ...

  9. Spring Boot 2.x基础教程:MyBatis的多数据源配置

    前两天,我们已经介绍了关于JdbcTemplate的多数据源配置以及Spring Data JPA的多数据源配置,接下来具体说说使用MyBatis时候的多数据源场景该如何配置. 添加多数据源的配置 先 ...

随机推荐

  1. openstack Q版部署-----Mysql、MQ、Memcached安装配置(2)

    一.安装mysql(contorller) 安装软件包: yum install -y mariadb mariadb-server python2-PyMySQL 配置my.cnf文件 vi /et ...

  2. quartz定时任务的简单使用

    开发环境: springmvc quartz-2.2.3在官网下载的. 步骤: 1.首先在web.xml中加入以下代码: <servlet> <servlet-name>Qua ...

  3. Informatic 使用过程中的问题

    1.database driver error ORA-12154 1)检查监听是否启动 2)是否在tnsnames.ora中配置

  4. Samples topic

    Rendering: http://www.cnblogs.com/miloyip/archive/2010/03/29/1698953.html http://www.scratchapixel.c ...

  5. Python-查找两个文件中相同的ip地址

    with open("testt","r") as f1: list1 = f1.readlines() print(list1) list1 = set(li ...

  6. matplotlib 直方图绘制详解

    n, bins, patches = plt.hist(datasets, bins, normed=False, facecolor=None, alpha=None) 函数说明 用于绘制多个数据集 ...

  7. libevent的入门学习-库的安装【转】

    转自:https://blog.csdn.net/lookintosky/article/details/61658067 libevent的入门学习-库的安装最近开始接触Linux应用层的东西,发现 ...

  8. FireDac 的一些应用提示

    FireDac 的一些应用提示: 1. 客户端 dataset 能用 TFDQuery 连接  dataset provider 获取数据 ? Can I use TFDQuery and conne ...

  9. curl的http上传文件代码

    int http_post_file(const char *url, const char *user, const char *pwd, const char *filename){    ass ...

  10. 初探Linux内核中的内存管理

    Linux内核设计与实现之内存管理的读书笔记 初探Linux内核管理 内核本身不像用户空间那样奢侈的使用内存; 内核不支持简单快捷的内存分配机制, 用户空间支持? 这种简单快捷的内存分配机制是什么呢? ...