Spring Boot 集成Mybatis和Druid快速入门
MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架,它摒除了大部分的JDBC代码、手工设置参数和结果集重获,只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。
Druid 是阿里巴巴开源的数据库连接池解决方案,因为有阿里巴巴背书,所以 Druid 是当今国内 Java 开发中非常流行的数据库连接池。本文介绍 Spring Boot 集成 Druid 和Mybatis框架的基础配置和应用,数据库采用MySQL。
软件环境
- MySql 8.0.11
- java version 13.0.1
- IntelliJ IDEA 2019.3.2 (Ultimate Edition)
Druid数据库连接池
Druid是什么?它首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员可以通过定制来实现自己需要的功能。
Druid在监控,可扩展,稳定性和高可用方面具有明显得优势,通过提供的监控功能可以观察数据库连接池和sql查询工作情况,使用druid连接池可以提高数据库的访问性能。
Druid支持哪些数据库? Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池,若要支持Druid,需要自己配置。
新建Spring Boot项目
为了简单,项目名姑且命名为wiener。我们在此以Maven作为项目构建工具,来构建Spring Boot应用程序,创建步骤如下,比较简单:



这里只勾选了Lombok插件。

Content root根据需要选择即可。然后,点击Finish,接下来请等待项目初始化完成。这里先给出创建完成后的项目结构图,方便大家了解需要新增哪些文件。

项目结构图
集成Mybatis和Druid
在dependencies中引入相关依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.eg</groupId>
<artifactId>wiener</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>wiener</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>13</java.version>
</properties> <dependencies>
<!--web核心依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
spring-boot-maven-plugin是Spring Boot 的编译插件。
配置application.properties信息
server.port=8087
# 配置应用的上下文路径
server.servlet.context-path=/wiener # 配置当前要使用的数据源的操作类型那个
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#驱动类
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/my2020?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root #连接池的配置信息
# 初始化大小
spring.datasource.druid.initial-size=5
# 最小
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-idle=200
# 最大
spring.datasource.druid.max-active=100
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=10000
spring.datasource.druid.validationQuery=select 'x' mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.eg.wiener.dto
以上属性配置在resources目录下的application.properties文件中。由于是快速入门篇,配置这些Mybatis和Druid属性即可。
Mybatis扩展属性配置
mybatis.config-location:指定mybatis-config.xml的位置;
mybatis.check-config-location:检查mybatis-config.xml是否存在;
mybatis.mapper-locations:指定mapper的xml的位置;
mybatis.type-aliases-package:指定别名的包,可以多个,逗号分隔;
它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。(value的值一定要是包的全名)
mybatis.type-handlers-package:指定handler的扫描码路径;
mybatis.executor-type:执行器类型: SIMPLE, REUSE, BATCH;
mybatis.configuration-properties:MyBatis配置的外部化属性。指定的属性可以用作MyBatis配置文件和映射文件的占位符;
mybatis.configuration:嵌套配置,具体子配置如下;
defaultStatementTimeout:设置超时时间,它决定驱动等待数据库响应的秒数;
defaultFetchSize:为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖;
mapUnderscoreToCamelCase:是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射;
autoMappingUnknownColumnBehavior:指定发现自动映射目标未知列(或者未知属性类型)的行为;NONE:不做任何反应;WARNING:输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN);FAILING:映射失败 (抛出 SqlSessionException);
具体参考:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
定义DruidConfig和相关实现
package com.eg.wiener.config; import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
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 javax.sql.DataSource; /**
* https://www.cnblogs.com/feiyangbahu/p/9842363.html
* <p>
* SpringBoot配置MySql数据库和Druid连接池
*/
@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean druidServlet() {// 主要实现web监控的配置处理
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
new StatViewServlet(), "/druid/*");//表示进行druid监控的配置处理操作
servletRegistrationBean.addInitParameter("allow", "127.0.0.1,129.168.1.11");//白名单
servletRegistrationBean.addInitParameter("deny", "129.168.1.12");//黑名单
servletRegistrationBean.addInitParameter("loginUsername", "root");//用户名
servletRegistrationBean.addInitParameter("loginPassword", "root");//密码
servletRegistrationBean.addInitParameter("resetEnable", "false");//是否可以重置数据源
return servletRegistrationBean;
} /**
* 监控面板访问路径:
* http://localhost:8087/wiener/druid/login.html
*
* @throws
* @Title: druidServlet
* @Description: 注册一个StatViewServlet 相当于在web.xml中声明了一个servlet
* @param: void
* @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();
}
}
应用的上下文路径(也称为项目路径),是构成url地址的一部分。Spring Boot默认只有一个Servlet,默认会映射到根路径/,配置上下文路径和端口号的方法是在application.properties文件中添加如下配置:
server.port=8087
# 配置应用的上下文路径,也可以称为项目路径,是构成url地址的一部分
server.servlet.context-path=/wiener
访问Druid监控系统时,默认访问路径如下:
http://IP:PORT/projectName/druid/login.html
在未配置项目上下文路径时,其访问路径如下:
http://localhost:8087/druid/login.html
在配置应用上下文路径后,其访问路径如下:
http://localhost:8087/wiener/druid/login.html
package com.eg.wiener.dto; import lombok.Getter;
import lombok.Setter;
import lombok.ToString; import java.io.Serializable; /**
* @author Wiener
*/
@Setter
@Getter
@ToString
public class User implements Serializable { private Long id;
private String userName;
private Integer age;
private String address;
private String mobilePhone;
}
Dao层只提供一个接口,通过用户id查找用户信息;温馨提示,需要使用@ Repository注解,否则,Spring Boot无法扫描。
package com.eg.wiener.dao; import com.eg.wiener.dto.User;
import org.springframework.stereotype.Repository; @Repository
public interface UserDao { User getUserById(Long userId); }
Mapper文件:
<?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="com.eg.wiener.dao.UserDao"> <resultMap id="BaseResultMap" type="com.eg.wiener.dto.User">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName"/>
<result column="address" jdbcType="VARCHAR" property="address" />
<result column="age" jdbcType="TIMESTAMP" property="age" />
<result column="mobile_phone" jdbcType="TIMESTAMP" property="mobilePhone" />
</resultMap>
<sql id="Base_Column_List">
id, mobile_phone,user_name,address,age
</sql> <!-- 通过ID获取用户信息-->
<select id="getUserById" parameterType="Long" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
<where>
id = #{userId}
</where>
</select>
</mapper>
新增接口类:
package com.eg.wiener.service;
import com.eg.wiener.dto.User;
public interface UserService {
User getUserById(Long userId);
}
编写接口实现类UserServiceImpl,并对其添加@Service注解,使得它能被Spring Boot扫描,在Controller中使用@Autowired注入。
package com.eg.wiener.service.impl; import com.eg.wiener.dao.UserDao;
import com.eg.wiener.dto.User;
import com.eg.wiener.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl implements UserService {
private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); @Autowired
private UserDao userDao;
@Override
public User getUserById(Long userId) {
logger.info("--------*****-----------");
return userDao.getUserById(userId);
}
}
package com.eg.wiener.controller; import com.eg.wiener.dto.User;
import com.eg.wiener.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author Wiener
*/
@RestController
@RequestMapping("/user")
public class UserController {
private static Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired
private UserService userService; /**
* 示例地址 http://localhost:8087/wiener/user/getUserById?userId=1
*
* @author Wiener
* @date 2020/6/25 11:27
*/
@RequestMapping("/getUserById")
public User getUserById(Long userId) {
User user = userService.getUserById(userId);
return user;
}
}
启动类配置@MapperScan注解
package com.eg.wiener; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
@MapperScan("com.eg.wiener.dao")
public class WienerApplication { public static void main(String[] args) {
SpringApplication.run(WienerApplication.class, args);
} }
在启动类中使用注解@MapperScan批量扫描所有的Mapper接口。
启动项目并且登录监控系统后,在数据源页面可以看到数据库配置信息。当请求函数getUserById三次时,在Session监控页面可以看到请求次数对应的值为3。

总结
以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作能带来一定的帮助,如有好的改进方式或者文中有任何错误,请留言交流。祝各位生活愉快!
Reference
https://www.jianshu.com/p/e6c9e9945e45
https://zhidao.baidu.com/question/116778634.html
https://www.jianshu.com/p/9dc6f4418a06
https://www.jianshu.com/p/541874714907
Spring Boot 集成Mybatis和Druid快速入门的更多相关文章
- Spring Boot 集成 Mybatis(druid 数据库连接池 以及 分页配置)
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射,目前很大一部分互联网.软件公司都在使用这套框架 关于Mybatis-Generator的下载可以到这个地址:http ...
- 详解Spring Boot集成MyBatis的开发流程
MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集. spring Boot是能支持快速创建Spring应用的Java框 ...
- spring boot集成mybatis(1)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot集成mybatis(2) - 使用pagehelper实现分页
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot集成mybatis(3) - mybatis generator 配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Spring Boot集成MyBatis开发Web项目
1.Maven构建Spring Boot 创建Maven Web工程,引入spring-boot-starter-parent依赖 <project xmlns="http://mav ...
- 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法
spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...
- spring boot集成MyBatis 通用Mapper 使用总结
spring boot集成MyBatis 通用Mapper 使用总结 2019年 参考资料: Spring boot集成 MyBatis 通用Mapper SpringBoot框架之通用mapper插 ...
- spring boot集成mybatis只剩两个sql 并提示 Cannot obtain primary key information from the database, generated objects may be incomplete
前言 spring boot集成mybatis时只生成两个sql, 搞了一个早上,终于找到原因了 找了很多办法都没有解决, 最后注意到生成sql的时候打印了一句话: Cannot obtain pri ...
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...
随机推荐
- Ubuntu 22.04 添加 AppImage 到应用程序
前言 AppImage 逐渐成为 Linux 常用的一种软件包格式,本文将介绍如何将 AppImage 文件添加到 Ubuntu 的应用程序中. 如下图中的 CAJViewer : 操作过程 设置相关 ...
- ITSS 运维2.0 实践
最近公司在评审itss 2.0,参与了一部分工作,对工作过程中的问题梳理如下: 大的背景:评审itss 2.0会有评审 为什么公司会申请各种资质 首次申请资质后,公司可以申请一笔费用(x万元)! 申请 ...
- selenium 提示 Non-UTF-8 code starting with '\xc4'
解决(1):在程序最上方加上语句,# coding=gbk 解决(2):在preference下进行修改
- SpringCloud带你走进微服务的世界
认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打 ...
- 解决nvm ls-remote 列表只出现iojs版本
前言 在 nvm 安装 node 时发现显示不存在此版本,使用 nvm ls-remote 查看可安装列表时发现,列表中只有 iojs $ nvm ls-remote iojs-v1.0.0 iojs ...
- Django实战项目-学习任务系统-用户登录
第一步:先创建一个Django应用程序框架代码 1,先创建一个Django项目 django-admin startproject mysite 将创建一个目录,其布局如下: mysite/ mana ...
- OpenHarmony 开源鸿蒙北向开发——hdc工具安装
hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHar ...
- RMQ 和 LCA 问题
# Part 1 RMQ RMQ,即区间信息维护问题 如最大值,最小值,GCD 等 RMQ 算法实现很多 具体有线段树,树状数组和 ST 表 但综合时间复杂度最好的是 ST 表 查询 O(1),预处理 ...
- 【JDBC第3章】使用PreparedStatement实现CRUD操作
第3章:使用PreparedStatement实现CRUD操作 3.1 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果.其实一个数据库连接就是一 ...
- Web前端入门第 27 问:你知道 CSS 被浏览器分为了几大类吗?
埋头苦写多年的 CSS,从没注意到 CSS 被浏览器分了类,直到偶然的一次翻阅开发者工具,才发现原来 CSS 属性也被浏览器归类收纳了. Chrome 下面是 Chrome 的开发者工具中 CSS 的 ...