博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)...
阅读量:5322 次
发布时间:2019-06-14

本文共 13209 字,大约阅读时间需要 44 分钟。

 

1、概念:SpringBoot 整合 MyBatis

2、背景

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

2.1、配置 druid 数据源

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

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

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 ('公关部') ;

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

mysql
mysql-connector-java
5.0.4
com.alibaba
druid
1.0.31

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

server:  port: 80spring:  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                          # 等待连接获取的最大超时时间

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

org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0

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

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)@WebAppConfigurationpublic class TestDataSource {    @Resource    private DataSource dataSource;    @Test    public void testConnection() throws Exception {        System.out.println(this.dataSource);    }}

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

2.2、配置 MyBatis

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

org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0

1、 随后要去修改 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

2、 建立一个 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 + "]";    }}

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

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

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

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

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

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

package cn.study.microboot.service;import java.util.List;import cn.study.microboot.vo.Dept;public interface IDeptService {    public List
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;@Servicepublic class DeptServiceImpl implements IDeptService {    @Resource    private IDeptDAO deptDAO;    @Override    public List
list() { return this.deptDAO.findAll(); }}

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

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)@WebAppConfigurationpublic class TestDeptService {    @Resource    private IDeptService deptService;    @Test    public void testList() throws Exception {        System.out.println(this.deptService.list());    }}

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

2.3、事务控制

1、 修改 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
list() ;}

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

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

package cn.study.microboot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.transaction.annotation.EnableTransactionManagement;@SpringBootApplication    // 启动SpringBoot程序,而后自带子包扫描@EnableTransactionManagementpublic class StartSpringBootMain {    public static void main(String[] args) throws Exception {        SpringApplication.run(StartSpringBootMain.class, args);    }}

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

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

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

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

INSERT INTO dept(dname) VALUES (#{dname}) ;

· 在 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));    }

此时会报错

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

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

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

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

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

%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n
${LOG_HOME}/${APP}_detail.log
%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n
${LOG_HOME}/${APP}_detail.log.%d{yyyyMMdd}
${LOG_HOME}/${APP}_access.log
%d{yy-MM-dd.HH:mm:ss.SSS};%X{ServiceId};%m%n
${LOG_HOME}/${APP}_access.log.%d{yyyyMMdd}

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

ch.qos.logback
logback-core

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

2.4、druid 监控

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

1、 如果要想进行 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;@Configurationpublic 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();    }}

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

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;@RestControllerpublic class DeptController extends AbstractBaseController {    @Resource    private IDeptService deptService ;    @RequestMapping(value = "/list", method = RequestMethod.GET)    public Object list() { // 通过model可以实现内容的传递        return this.deptService.list() ;     }}

3、 如果要想进行监控还需要开启一个过滤配置,而这个过滤配置的开启需要通过 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就可以看到监控页面了

转载于:https://www.cnblogs.com/yueguanguanyun/p/9293553.html

你可能感兴趣的文章
String比较
查看>>
Django之Models
查看>>
Spring缓存注解@Cache使用
查看>>
CSS 透明度级别 及 背景透明
查看>>
Linux 的 date 日期的使用
查看>>
PHP zip压缩文件及解压
查看>>
SOAP web service用AFNetWorking实现请求
查看>>
C# JSON字符串序列化与反序列化
查看>>
HTTPS、SPDY和HTTP/2的性能比较
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
sublime快捷键
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Hyper-V Centos7 网络设置 虚拟机固定IP
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(31):画刷 转:http://blog.csdn.net/tcjiaan/article/details/7460226
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>
记Angular与Django REST框架的一次合作(2):前端组件化——Angular
查看>>
08.存储Cinder→5.场景学习→08.Backup Volume→1.概述与配置
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>