SpringBoot整合JDBC、Druid

SpringBoot整合JDBC、Druid

对于数据访问层,无论是SQL(关系型数据库)还NOSQL(非关系型数据库),SpringBoot底层采用的事SpringData的方式进行统一处理。SpringData在spring全家桶中也是和SpringBoot、SpringCloud等齐名的项目。

springboot整合数据库的话,需要的启动器jar包如下,都是和data有关的

1、SpringBoot整合JDBC

1.1、知识补充:数据源和数据库连接池

Java中的数据源就是javax.sql.DataSource。DataSource的创建可以有不同的实现。DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池。

JNDI方式创建DataSource: (Java Naming and Directory Interface,Java命名和目录接口)。首先要配置数据源的相关连接信息,也就是数据源连接池。该配置应该在Tomcat安装目录下的conf/context.xml文件中配置。

连接池基本的思想原理:

  • 在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。
  • 数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

连接池通俗理解:  

数据库连接池就是准备一个池子,里面放着很多生成好的Connection,用户请求获得连接,就不需要getConnection,只要从池子里拿一个给他就行了,这样省掉了生成Connection的时间,效率上会有很大提高,不过当然会占用一些内存,稍微大点网站都会用到数据库连接池的~

数据库连接池技术的优点:

  • 资源重用
  • 更快的系统反应速度
  • 新的资源分配手段
  • 统一的连接管理,避免数据库连接泄露

综上:

  • 配置一个数据库连接就是配置一些账户、密码、数据库url等。
  • 配置一个数据库连接池就是批量配置这些多个数据库连接【方便】

1.2、导入JDBC场景

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

 

点击该jdbc场景源码:通过查看依赖,我们可以看见通过导入jdbc场景,SpringBoot给我们自动导入了数据源、数据库操作、事务管理等配置。

但是从上容易发现:为什么导入了JDBC场景,官方为何不导入数据库的驱动?因为

  • 官方不知道我们接下要操作什么数据库。
  • 我们在导入数据库驱动时,要注意导入的数据库驱动与本机的数据库版本对应。(高版本mysql驱动向下兼容)

1.3、导入数据库驱动包(MySQL为例)

mysql自动仲裁的版本:默认最新版本,这里是8.0的版本

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

但是如果想要改变版本[数据库版本应该和驱动版本一样]:有下面两种方式【maven的时候讲过】

  • 直接依赖引入具体版本(maven的就近依赖原则)

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>   //直接写上,最短路径优先
    </dependency>
    
  • 重新声明版本(maven的属性的就近优先原则)

    <properties>
        <java.version>1.8</java.version>
        <mysql.version>5.1.49</mysql.version>
    </properties>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    

补充: 可以在创建SpringBoot工程的时候,提前选择好JDBC和Mysql driver的场景

1.4、相关数据源自动配置类分析

进入jdbc的依赖包:可以看见如下信息

  1. DataSourceAutoConfiguration : 数据源的自动配置。
    1. 修改数据源相关的配置:spring.datasource开头的配置
    2. 数据库连接池的配置,是自己容器中没有DataSource才自动配置的。
    3. 底层自动配置好的连接池是:HikariDataSource
  2. DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置。
  3. JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置(spring用来操作数据库的一个小组件),可以来对数据库进行CRUD。
    1. 可以修改前缀为spring.jdbc的配置项【@ConfigurationProperties(prefix = “spring.jdbc”)】来修改JdbcTemplate。
      spring:
        jdbc:
          query-timeout: 3
      
    2. @Bean @Primary JdbcTemplate:Spring容器中有这个JdbcTemplate组件,使用@Autowired自动注入
  4. JndiDataSourceAutoConfiguration: JNDI的自动配置。
  5. XADataSourceAutoConfiguration: 分布式事务相关的。

1.5、修改配置项,配置数据源

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/runoob?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

注意:mysql8.0以上版本数据库连接配置:

  • className发生了变更,现在为com.mysql.cj.jdbc.Driver
  • 8.0以上必须配置时区,应该是为了数据库的时间戳全球一致性serverTimezone=UTC ,否则会报错
driverClassName=com.mysql.cj.jdbc.Driver 
#8.0版本Driver会标红,但是不影响
#serverTimezone-UTC表示在springboot中设置时区,才会不报错
#useUnicode-true&charac terEncoding=utf- 8表示:使用unicode和utf-8编码,防止乱码
url=jdbc:mysql://localhost:3306/project?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username=root
password=root

1.6、单元测试数据源【test目录下】

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;

@Slf4j
@SpringBootTest
class Boot05WebAdminApplicationTests {

    //springboot已经帮我们把大部分都配置好了,我们只需要配置少部分信息就可以实现连接数据库
    //这里我们直接注入
    @Autowired
    DataSource dataSource ;

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Test//用@org.junit.Test会报空指针异常,可能跟JUnit新版本有关
    void contextLoads() {
        //jdbcTemplate.queryForObject("select * from account_tbl")
        //jdbcTemplate.queryForList("select * from account_tbl",)
        Long aLong = jdbcTemplate.queryForObject("select count(*) from account_tbl", Long.class);
        log.info("记录总数:{}",aLong);
        //查看数据源对象的class对象,即默认数据源对象
        System.out.println(dataSource.getClass());

    }
}

结果

2、自定义方式整合第三方数据源--druid

1、Druid是什么?

Java程序很大一部分需要操作数据库,为了提高操作数据库的性能,就不得不使用数据库连接池。Druid是阿里巴巴开源平台上的一个数据库连接池的实现,结合了C3P0、DBCP等DB池的优点,同时加入了日志监控。

Druid能很好的监控DB池连接和SQL的执行情况,是针对监控而生的连接池。SpringBoot2.0以上默认使用Hikari数据源,而Hikari和Druid都是当前JAVAweb上最优秀的数据源。

Druid官网:github.com/alibaba/dru…

官方文档 - Druid连接池介绍:

2、SpringBoot整合第三方druid连接池

  • 找starter场景

官方文档 - Druid Spring Boot Starter:简化上述的配置

引入场景依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.17</version>
</dependency>

分析自动配置:

  • 扩展配置项 spring.datasource.druid
  • 自动配置类DruidDataSourceAutoConfigure
  • DruidSpringAopConfiguration.class, 监控SpringBean的;配置项:spring.datasource.druid.aop-patterns
  • DruidStatViewServletConfiguration.class, 监控页的配置。spring.datasource.druid.stat-view-servlet默认开启。
  • DruidWebStatFilterConfiguration.class,web监控配置。spring.datasource.druid.web-stat-filter默认开启。
  • DruidFilterConfiguration.class所有Druid的filter的配置:
private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";

配置数据源示例:这里我们没有用到上面的这些druid提供的监控配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_account
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

测试:写一个控制器,使用jdbc的方式获取一下信息:

package com.example.boot.controller;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class JdbcController {
    @Resource
    JdbcTemplate jdbcTemplate;

    @GetMapping("/getCount")
    public int getCount(){
        String sql = "select count(*) from student";
        Integer number = jdbcTemplate.queryForObject(sql, Integer.class);
        return number;
    }
}

3、配置Druid的监控页功能,开启sql监控、web防火墙功能:

yaml文件配置相应监控功能

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/runoob?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    username: root
    password: ajt19980607###
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.lemon.admin.*  #监控SpringBean
      filters: stat,wall     # 底层开启功能,stat(sql监控),wall(防火墙)

      stat-view-servlet: # 配置监控页功能
        enabled: true
        login-username: admin
        login-password: admin
        resetEnable: false

      web-stat-filter: # 监控web
        enabled: true
        urlPattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'


      filter:
        stat: # 对上面filters里面的stat的详细配置
          slow-sql-millis: 1000
          logSlowSql: true
          enabled: true
        wall:
          enabled: true
          config:
            drop-table-allow: false

测试:

再次使用jdbc的方式获取一下信息:

package com.example.boot.controller;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class JdbcController {
    @Resource
    JdbcTemplate jdbcTemplate;

    @GetMapping("/getCount")
    public int getCount(){
        String sql = "select count(*) from student";
        Integer number = jdbcTemplate.queryForObject(sql, Integer.class);
        return number;
    }
}

配置好以后,启动服务器,打开地址:localhost:8080/druid/html 并利用配置的信息进行登录,就可以看到一些本次程序执行的信息

我们再看看Druid的监控: 他告诉了我们,那个网页我刷新了1次,执行时间用了165秒,最慢的一次用了165秒。读取的行数有1行。

 


作者:花粥之间
链接:https://juejin.cn/post/7073492637159784479
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个快速开发框架,而MyBatis是一个流行的ORM框架,Druid是一个高性能的数据库连接池。将它们整合在一起可以提高开发效率和系统性能。具体步骤如下: 1. 引入相关依赖:在pom.xml文件中添加spring-boot-starter-jdbc、mybatis-spring-boot-starter和druid-spring-boot-starter依赖。 2. 配置数据源:在application.properties文件中配置数据源信息,包括数据库URL、用户名、密码等。 3. 配置MyBatis:在application.properties文件中配置MyBatis相关信息,包括mapper文件路径、实体类包路径等。 4. 配置Druid:在application.properties文件中配置Druid相关信息,包括连接池大小、监控页面路径等。 5. 编写Mapper接口和SQL语句:在Mapper接口中定义SQL语句,并使用@Mapper注解标注该接口。 6. 编写Service层和Controller层:在Service层中调用Mapper接口,实现业务逻辑;在Controller层中处理请求和响应。 7. 启动应用程序:使用Spring Boot的启动器启动应用程序,访问相关接口即可。 总之,整合Spring Boot、MyBatis和Druid可以让我们更方便地开发数据库应用程序,提高开发效率和系统性能。 ### 回答2: Spring Boot 是目前非常热门的一种快速构建 web 应用程序的框架,而 Mybatis 是一款非常流行的 Java 数据库持久化框架,Druid 是阿里巴巴开发的数据库连接池和监控工具。Spring Boot 整合 Mybatis 和 Druid 的开发方式比较简单,只需要进行相应的配置即可。 首先,在 pom.xml 文件中添加 Mybatis 和 Druid 的依赖: ``` <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> ``` 然后,在 application.yml 或 application.properties 中添加相应的配置,以下是一个示例: ``` spring: datasource: type: com.alibaba.druid.pool.DruidDataSource username: root password: root url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver druid: min-idle: 5 max-active: 20 initial-size: 5 test-on-borrow: true validation-query: SELECT 1 mybatis: mapper-locations: classpath:mapper/*.xml ``` 其中,spring.datasource 下的配置是数据库连接相关的配置,druid 下的配置是连接池相关的配置,mybatis 下的配置是 Mybatis 相关的配置。 最后,在需要使用 Mybatis 的类上添加 @Mapper 注解即可,例如: ``` @Mapper public interface UserDao { List<User> selectAll(); void insert(User user); } ``` 这样,我们就通过 Spring Boot 整合了 Mybatis 和 Druid,并且可以方便地使用它们来访问数据库。同时,Druid 还提供了一些监控和统计功能,可以方便地了解应用程序访问数据库的性能和健康情况。 ### 回答3: 随着互联网应用越来越普及,Java Web开发也变得越来越火热,相应的Spring Boot、MyBatis、Druid等技术也得到了广泛的应用。其中,Spring Boot是基于Spring Framework的一种全新框架,通过封装成熟的框架和工具,提高了开发效率,减少了配置量;MyBatis是一款优秀的基于Java的ORM框架,可以让开发人员更加专注于SQL本身,而无需过多关注底层的操作。Druid是一个强大的数据库连接池,具有监控、性能分析、SQL注入检查和防御、不同操作系统适配等特点,能够有效提高应用的性能和稳定性。 Spring Boot整合MyBatis和Druid,可以将这三个技术更有效地结合起来,发挥它们的优点。 具体步骤如下: 1. 创建基于Spring Boot的Web工程,并在pom.xml文件中引入相关依赖。 ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.22</version> </dependency> ``` 2. 创建数据库连接的配置文件application.properties。 ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.config-location=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:com/example/mapper/*Mapper.xml mybatis.type-aliases-package=com.example.entity # Druid数据源配置 # 初始化大小、最小、最大连接数 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 # 配置连接空闲的最大时间,超时将被关闭,单位毫秒 spring.datasource.maxEvictableIdleTimeMillis=900000 # 配置连接池中的连接创建时的默认自动提交配置 spring.datasource.defaultAutoCommit=true # 对于长时间不使用的连接强制关闭 spring.datasource.removeAbandoned=true spring.datasource.removeAbandonedTimeout=1800 spring.datasource.logAbandoned=true spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.filters=stat,wall,log4j ``` 3. 创建MyBatis的配置文件mybatis-config.xml。 ```xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true" /> <setting name="logImpl" value="LOG4J" /> </settings> </configuration> ``` 4. 在Spring Boot的启动类上添加@Configuration注解,并通过@Bean注解来配置SqlSessionFactory和SqlSessionTemplate。 ```java @SpringBootApplication @Configuration @MapperScan(basePackages = "com.example.mapper") public class Application { @Autowired DataSource dataSource; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate() throws Exception { SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory()); return sqlSessionTemplate; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 5. 创建Mapper接口和对应的XML文件。 ```java public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User selectUserById(int id); } ``` ```xml <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userMap" type="com.example.entity.User"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> <result column="password" property="password" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="VARCHAR"/> </resultMap> <select id="selectUserById" resultMap="userMap"> SELECT id, username, password, age FROM user WHERE id = #{id} </select> </mapper> ``` 6. 创建实体类,并注入Mapper接口到Service中进行操作。 ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User selectById(int id) { return userMapper.selectUserById(id); } } ``` 7. 创建Controller,提供对外RESTful API接口。 ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User selectById(@PathVariable int id) { return userService.selectById(id); } } ``` 综上,以上是Spring Boot整合MyBatis和Druid的流程。由于Spring Boot的封装,开发人员只需要关注业务逻辑的处理,而无需过多关注底层技术的实现细节,大大提高了开发效率。同时,MyBatis和Druid提供了非常强大和灵活的数据操作支持和连接池管理,可以有效地提高应用的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值