0


Spring Boot:数据库的整合

Spring Boot

在这里插入图片描述

前言

在 Spring Boot :Web开发之视图模板技术的整合 文章中,介绍了 Spring Boot 整合视图模板技术。然而,仅仅整合视图模板技术可能还不能满足所有业务需求,因此还需要进一步扩展 Spring MVC 的默认配置。

简单补充说明
扩展 Spring Boot 中的 Spring MVC 默认配置通常涉及实现 WebMvcConfigurer 接口以自定义视图解析器、拦截器等,使用 @ControllerAdvice 处理全局异常和数据绑定,自定义参数解析器和返回值处理器,配置 CORS 、静态资源处理、异常映射等,以及通过 @Bean 定义或覆盖默认 Bean 。这些操作有助于满足特定业务需求,但需注意避免与自动配置冲突。

在 Spring Boot 学习中,已初步了解到开发 Web 项目时构建完整应用的两个关键步骤——视图显示和业务逻辑代码的编写。但是,一个完整的应用往往还需要与数据库进行交互,以实现数据的持久化存储和检索。通过整合数据库,可以利用 Spring Boot 的自动配置和简化特性,高效地管理数据库连接、执行 CRUD 操作,并确保数据的安全性和一致性。下面简单介绍 Spring Boot 整合数据库。

Spring Boot 整合 JDBC

Spring Boot 整合 JDBC 的过程相对简单,其提供了自动配置来简化 JDBC 的配置。

简单示例:
首先,创建新项目 SpringBootIntegJDBC

注:
在勾选启动器上勾选 Web 、JDBCMySQL
在这里插入图片描述

然后,在 application.properties 全局配置文件中只需要配置数据库连接信息(关于 Spring 数据源在 Spring Boot 中有默认配置)

spring.datasource.username=root
spring.datasource.password=0123
spring.datasource.url=jdbc:mysql://localhost:3306/springbootintegjdbc
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

最后,在 SpringBootIntegJdbcApplicationTests 测试类中进行测试

packagecn.edu.SpringBootIntegJDBC;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.jdbc.core.JdbcTemplate;importjavax.sql.DataSource;importjava.sql.Connection;importjava.sql.SQLException;importjava.util.List;importjava.util.Map;importjava.util.Objects;@SpringBootTestclassSpringBootIntegJdbcApplicationTests{@AutowiredprivateDataSource dataSource;@AutowiredprivateJdbcTemplate jdbcTemplate;@TestvoidcontextLoads()throwsSQLException{//        // 输出数据源类型;Spring Boot 默认的数据源为 HikariDataSource ,而不是 C3P0//        System.out.println(dataSource.getClass());//        // 获取数据库的连接对象//        Connection connection = dataSource.getConnection();//        System.out.println(connection);//        connection.close();// 获取 springbootintegjdbcdemo 表的所有记录List<Map<String,Object>> maps = jdbcTemplate.queryForList("select id,name from springbootintegjdbcdemo");System.out.println(maps);}}

结果如图:在这里插入图片描述

Spring Boot 整合 Druid 数据源

Druid 常见问题
Druid 是阿里巴巴推出的一款开源的高性能数据库连接池,提供了强大的监控和扩展功能,支持所有 JDBC 兼容的数据库,如 Oracle、MySQL、SQL Server 等。Spring Boot 默认使用 HikariCP 作为数据源( HikariDataSource 是基于 HikariCP 连接池实现的 Java 数据库连接池),但 Druid 由于其出色的性能和监控功能,在实际开发中也很受欢迎。

Spring Boot 整合 Druid 数据源的过程也相对直接。

简单示例:
首先,创建新项目 SpringBootIntegDruid ,并在 pom.xml 中添加以下依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.20</version></dependency><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>

注:
在勾选启动器上勾选 Web 、JDBCMySQLThymeleaf
在这里插入图片描述

然后,在 resources 目录下创建 log4j.properties 资源文件并进行以下配置

#日志级别,分为八个级别( Off-关闭日志记录 > Fatal-严重错误 > Error-错误 > Warn-警告 > Info-运行信息 > Debug-调试 > Trace-低级信息 > All-所有日志记录)
#日志级别越高,过滤的信息越多

#配置根节点
log4j.rootLogger=Debug,stdout,D
#配置控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=Info
##输出格式(%d %p [%1] %m %n——日期时间 类 路径 信息 换行)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%l] %m %n

#配置文件输出
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.Append=true
log4j.appender.D.File=./log4j.log
log4j.appender.D.Threshold=Debug
#输出格式
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d %p [%l] %m %n

接着,在 application.properties 全局配置文件中进行 type 配置而改变数据源。并且,还需要配置 Druid 数据源特性( Spring Boot 默认配置中没有)
DruidDataSource 配置

spring.datasource.username=root
spring.datasource.password=0123
spring.datasource.url=jdbc:mysql://localhost:3306/springbootintegjdbc
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#type 配置而改变数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#配置 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.validationQuery=select 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
#配置监控统计拦截的 filters ,去掉后监控界面 sql 无法统计,wall 用于防火墙
spring.datasource.filters=stat,wall,log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.useGlobalDataSourceStat=true
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

随之,创建 Configuration 包并在包内创建一个 DruidConfiguration 类

packagecn.edu.SpringBootIntegDruid.Configuration;importcom.alibaba.druid.pool.DruidDataSource;importcom.alibaba.druid.support.jakarta.StatViewServlet;importcom.alibaba.druid.support.jakarta.WebStatFilter;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.boot.web.servlet.ServletRegistrationBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;importjava.util.Arrays;importjava.util.HashMap;importjava.util.Map;// 通过配置类创建数据源对象,并手动获取这些配置,配置到数据源@ConfigurationpublicclassDruidConfiguration{@ConfigurationProperties(prefix ="spring.datasource")// 把配置 Druid 数据源特性值注入到 DruidDataSource 对象中@Bean// 返回对象存放到 Spring IoC 容器中publicDataSourcedataSource(){returnnewDruidDataSource();}// 配置监控整个 Web 应用@BeanpublicServletRegistrationBeangetStatViewServlet(){ServletRegistrationBean servletRegistrationBean =newServletRegistrationBean(newStatViewServlet());// 映射 /druid/ 下的所有地址到 StatViewServletString[] urlArr =newString[]{"/druid/*"};// 设置对本 Servlet 的 url 映射地址
        servletRegistrationBean.setUrlMappings(Arrays.asList(urlArr));// druid 后台页面基本设置Map<String,String> stringMap =newHashMap<>();// 后台登录用户账号
        stringMap.put("loginUsername","admin");// 后台登录用户密码
        stringMap.put("loginPassword","admin");// 安全性设置:允许 ip 地址能否访问
        stringMap.put("allow"," ");// 设置为空字符则任何 ip 地址都可以访问 druid 监控后台// stringMap.put("deny","ip地址") // 指定某个 ip 地址不可访问
        servletRegistrationBean.setInitParameters(stringMap);return servletRegistrationBean;}// 配置 Web 监控的拦截器 filter@BeanpublicFilterRegistrationBeangetWebStatFilter(){FilterRegistrationBean filterRegistrationBean =newFilterRegistrationBean(newWebStatFilter());// 除了外,拦截所有请求
        filterRegistrationBean.setUrlPatterns(Arrays.asList(newString[]{"/*"}));Map<String,String> stringMap =newHashMap<>();
        stringMap.put("exclusions","/druid/*,*.js,*.css,*.jpg,*.png");return filterRegistrationBean;}}

再创建 Controller 包并在包内创建一个 DruidDemoController 类

packagecn.edu.SpringBootIntegDruid.Controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.GetMapping;importjava.util.List;importjava.util.Map;@ControllerpublicclassDruidDemoController{@AutowiredprivateJdbcTemplate jdbcTemplate;@GetMapping("/DruidDemo.html")publicStringDruidDemo(Model model){List<Map<String,Object>> maps = jdbcTemplate.queryForList("select id,name from springbootintegjdbcdemo");
        model.addAttribute("druidEntities",maps);return"DruidDemo";}}

还有在 resources/templates 的目录下创建一个 DruidDemo.html

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>DruidDemo</title></head><body><divth:each="druidEntities,druidEntity:${druidEntities}"><spanth:text="${druidEntities}"/></div></body></html>

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/druid 进行登录,再输入 http://localhost:8080/DruidDemo.html 后查看 SQL 监控
结果如图:
在这里插入图片描述

查询结果:
在这里插入图片描述

SQL 监控结果:
在这里插入图片描述

Spring Boot 整合 MyBatis

Spring Boot 整合 MyBatis 是一种常见的做法,用于简化 Java Web 应用的数据库访问。

简单示例:
首先,创建新项目 SpringBootIntegMyBatis

注:
在勾选启动器上勾选 Web 、JDBCMySQLMyBatis
在这里插入图片描述

然后,在 application.properties 全局配置文件中进行以下配置

spring.datasource.username=root
spring.datasource.password=0123
spring.datasource.url=jdbc:mysql://localhost:3306/springbootintegjdbc
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#指定 mybatis 配置文件位置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mappers/*.xml

接着,分别创建 Entity 包和 Dao 包,并且对应创建一个 MyBatisDemoEntity 类和 MyBatisEntityDemoDao 接口

packagecn.edu.SpringBootIntegMyBatis.Entity;publicclassMyBatisDemoEntity{privateint id;privateString name;publicMyBatisDemoEntity(){}publicMyBatisDemoEntity(int id,String name){this.id = id;this.name = name;}publicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}@OverridepublicStringtoString(){return"MyBatisEntityDemo{"+"id="+ id +", name='"+ name +'\''+'}';}}

声明一个方法,以添加用户为例

packagecn.edu.SpringBootIntegMyBatis.Dao;importcn.edu.SpringBootIntegMyBatis.Entity.MyBatisDemoEntity;publicinterfaceMyBatisEntityDemoDao{// 添加publicvoidadd(MyBatisDemoEntity myBatisEntityDemo);}

随之,在 resources/mybatis 目录下创建一个 mybatis-config.xml 配置文件,并进行以下配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><settingname="mapUnderscoreToCamelCase"value="true"/></settings></configuration>

再在 resources/mybatis/mappers 目录下创建一个 MyBatisEntityDemoDao.xml 映射文件,并进行以下配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace 必须为接口的全类名 --><mappernamespace="cn.edu.SpringBootIntegMyBatis.Dao.MyBatisEntityDemoDao"><!-- id 必须为接口对应的方法名 --><selectid="add">
        insert into springbootintegjdbcdemo  (name) values (#{name})
    </select></mapper>

最后,先在 SpringBootIntegMyBatisApplication 启动类中添加 @MapperScan({“cn.edu.SpringBootIntegMyBatis.Dao”}) 注解
在这里插入图片描述
再在 SpringBootIntegMyBatisApplicationTests 测试类中进行测试

packagecn.edu.SpringBootIntegMyBatis;importcn.edu.SpringBootIntegMyBatis.Dao.MyBatisEntityDemoDao;importcn.edu.SpringBootIntegMyBatis.Entity.MyBatisDemoEntity;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;@SpringBootTestclassSpringBootIntegMyBatisApplicationTests{@AutowiredprivateMyBatisEntityDemoDao myBatisEntityDemoDao;@TestvoidcontextLoads(){// 添加测试MyBatisDemoEntity myBatisEntityDemo =newMyBatisDemoEntity();
        myBatisEntityDemo.setName("赵云");
        myBatisEntityDemoDao.add(myBatisEntityDemo);}}

结果如图:
在这里插入图片描述
在这里插入图片描述

Spring Boot 整合 JPA

JPA 是 Java EE 5 的标准之一,提供了一种对象关系映射(ORM)的规范,使得开发者可以使用面向对象的方式来操作数据库。
浅谈JPA框架

Spring Boot 整合 JPA 可以极大地简化数据持久层的配置和开发。

简单示例:
首先,创建新项目 SpringBootIntegJPA

注:
在勾选启动器上勾选 Web 、JDBCMySQLJPA
在这里插入图片描述

然后,在 application.properties 全局配置文件中进行以下配置

spring.datasource.username=root
spring.datasource.password=0123
spring.datasource.url=jdbc:mysql://localhost:3306/springbootintegjdbc
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# SpringBoot 内部使用 SpringData , SpringData 的 JPA 是使用 Hibernate 实现的
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

接着,分别创建 Entity 包、Dao 包和 Controller 包,并且对应创建一个 JpaDemoEntity 类、JpaDemoDao 接口和 JpaDemoController 类

packagecn.edu.SpringBootIntegJPA.Entity;importjakarta.persistence.*;@Entity@Table(name ="springbootintegjdbcdemo")publicclassJpaDemoEntity{privateint id;privateString name;@Id@GeneratedValue(strategy =GenerationType.IDENTITY)publicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}@OverridepublicStringtoString(){return"JpaEntityDemo{"+"id="+ id +", name='"+ name +'\''+'}';}}

注:JpaDemoDao 接口继承 JpaRepository<实体类,主键类型>即可

packagecn.edu.SpringBootIntegJPA.Dao;importcn.edu.SpringBootIntegJPA.Entity.JpaDemoEntity;importorg.springframework.data.jpa.repository.JpaRepository;publicinterfaceJpaDemoDaoextendsJpaRepository<JpaDemoEntity,Integer>{}

注:没有使用视图模板的情况下,在 JpaDemoController 类中添加 @ResponseBody 注解

packagecn.edu.SpringBootIntegJPA.Controller;importcn.edu.SpringBootIntegJPA.Dao.JpaDemoDao;importcn.edu.SpringBootIntegJPA.Entity.JpaDemoEntity;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.ResponseBody;@ControllerpublicclassJpaDemoController{@AutowiredprivateJpaDemoDao jpaDemoDao;@ResponseBody// 在没有使用视图模板下,使用该注解@GetMapping("/JpaDemo.html")publicStringsave(){JpaDemoEntity jpaDemoEntity =newJpaDemoEntity();
        jpaDemoEntity.setName("关羽");
        jpaDemoDao.save(jpaDemoEntity);return"添加成功!!!";}}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/JpaDemo.html 并按下回车键进行测试
结果如图:
在这里插入图片描述
在这里插入图片描述


本文转载自: https://blog.csdn.net/qq_56886142/article/details/136979315
版权归原作者 啊Q老师 所有, 如有侵权,请联系我们删除。

“Spring Boot:数据库的整合”的评论:

还没有评论