Springboot数据层开发全解析

 更新时间:2025年12月05日 09:43:24   作者:期待のcode  
本文介绍了SpringBoot数据层开发中数据源自动管理的配置方法,介绍了springboot整合jdbcTemplate、Springboot整合mybatis注解版、Springboot整合mybatis配置文件,感兴趣的朋友跟随小编一起看看吧

数据源自动管理

引入jdbc的依赖和springboot的应用场景

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

创建application.yaml

测试数据源

@RunWith(SpringRunner.class)
@SpringBootTest
public class DataSourcesTest {
    @Autowired
    DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        System.out.println(dataSource.getClass());
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }
}

org.springframework.boot.autoconfigure.jdbc

参考 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration,SpringBoot 默认使用的是 hikari 连接池,默认支持 org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、dbcp2.BasicDataSource 数据源连接池类型,使用 spring.datasource.type 进行指定自定义的数据源类型。

自定义数据源类型源码:

配置druid数据源

首先需要引入druid 连接池和日志依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

在 application.yaml 中加入 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

验证:

在 application.yaml 中加入其他属性配置

DataSourceProperties 类源码:

spring.datasource 中默认没有这些属性,所以 application.yaml 中会标黄,且不起作用

我们需要创建数据源注册类

@Configuration
public class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource(){
        return new DruidDataSource();
    }
}

DruidDataSource 类包含了那些其他配置属性,如图:

验证,发现这样属性配置就起作用了

配置druid运行期监控

StatViewServlet 是 Druid 数据库连接池提供的一个内置监控 Servlet,核心作用是通过 Web 界面可视化监控 Druid 连接池的运行状态、SQL 执行情况、慢查询统计等核心指标,是 Druid 连接池的核心监控组件之一。

WebStatFilter 是 Druid 数据库连接池提供的一款 Web 监控过滤器,核心作用是采集 Web 应用中HTTP 请求与数据库操作的关联链路数据,为 StatViewServlet(Druid 监控页面)提供Web 层面的监控数据支撑。

代码内容:
我们需要配置一个管理后台的 Servlet,还需要配置一个监控的 filter,以及配置初始化参数

@Configuration
public class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource(){
        return new DruidDataSource();
    }
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),
                "/druid/*");
        Map<String,String> initParams = new HashMap<>();
        initParams.put("loginUsername","root");
        initParams.put("loginPassword","root");
        initParams.put("allow","");//默认就是允许所有访问
        initParams.put("deny","192.168.15.21");
        bean.setInitParameters(initParams);
        return bean;
    }
    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean;
        bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

http://localhost:8080/druid 打开监控页面

springboot整合jdbcTemplate

首先需要在数据库中创建表

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `username` varchar(10) DEFAULT NULL,
  `userId` int(10) NOT NULL,
  `password` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Springboot中提供了JdbcTemplateAutoConfiguration的自动配置 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,
JdbcTemplateAutoConfiguration源码:

@Controller
public class TestController {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @ResponseBody
    @RequestMapping("/query")
    public List<Map<String, Object>> query(){
        List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM user");
        return maps;
    }
}

由于 Springboot 中提供了 JdbcTemplateAutoConfiguration 的自动配置,直接使用 @Autowired 注解注入即可,启动 springboot,测试访问 http://localhost:8080/query

访问成功

打开监控页面

Springboot整合mybatis注解版

导入 mybatis 整合 springboot 模块

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>

com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

创建JavaBean

import java.util.Date;
public class Person {
    private int pid;
    private String pname;
    private String addr;
    private int gender;
    private Date birth;
    public Person() {
    }
    public Person(int pid, String pname, String addr, int gender, Date birth) {
        this.pid = pid;
        this.pname = pname;
        this.addr = addr;
        this.gender = gender;
        this.birth = birth;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public int getGender() {
        return gender;
    }
    public void setGender(int gender) {
        this.gender = gender;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    @Override
    public String toString() {
        return "Person{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", addr='" + addr + '\'' +
                ", gender=" + gender +
                ", birth=" + birth +
                '}';
    }
}

创建Mapper

import java.util.List;
@Mapper
public interface PersonMapper {
    @Select("select * from person")
    public List<Person> getPersons();
    @Select("select * from person t where t.pid = #{id}")
    public Person getPersonById(int id);
    @Options(useGeneratedKeys =true, keyProperty = "pid")
    @Insert("insert into person(pid, pname, addr,gender, birth)" +
            " values(#{pid}, #{pname}, #{addr},#{gender}, #{birth})")
    public void insert(Person person);
    @Delete("delete from person where pid = #{id}")
    public void update(int id);
}

其中 @Options(useGeneratedKeys =true, keyProperty = “pid”),MyBatis 会获取到自增的 pid,自动赋值给传入的 person 对象的 pid 属性。

@Mapper 用于明确标记 MyBatis 对应的 Mapper 接口,核心职责是为 MyBatis 提供接口识别信号,触发 MyBatis 对接口的解析与动态代理实现类生成;在 Spring Boot 整合 MyBatis的场景下,该动态代理类会被自动注册为 Spring 容器中的 Bean,支持业务代码通过 @Autowired 直接注入使用。

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class springBootMybatisTest {
    @Autowired
    PersonMapper personMapper;
    @Test
    public void testMybatis() throws SQLException {
        List<Person> persons = personMapper.getPersons();
        for (Person person : persons) {
            System.out.println(person);
        }
    }
 @Test
    public void testMybatis1() throws SQLException {
        Person p = personMapper.getPersonById(1);
        System.out.println(p);
    }
}

开启 MyBatis 的下划线转驼峰命名自动映射功能

@Configuration
public class MybatisConfig {
    @Bean
    public ConfigurationCustomizer getCustomizer(){
        return new ConfigurationCustomizer() {
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

当项目中 Mapper 接口数量较多,若在每个 Mapper 接口上逐一添加 @Mapper 注解,会增加重复工作量且不易维护。此时可采用 @MapperScan 注解的批量扫描方案。在 MyBatis 相关配置类或 Spring Boot 主启动类上添加 @MapperScan 注解,指定 Mapper 接口所在的包路径,MyBatis 会自动扫描该路径下所有接口,将其识别为 Mapper 接口,无需额外标注 @Mapper,即可完成动态代理实现类的生成与 Spring Bean 的注册。

Springboot整合mybatis配置文件

classpath:mybatis 下创建 sqlMapConfig.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"/>
    </settings>
</configuration>

其中 mapUnderscoreToCamelCase 值为 true 用于开启下划线转驼峰命名自动映射功能

创建sql映射文件 PersonMapper.xml

<?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.qcby.springBootMybatis.mapper.PersonMapper">
    <select id="getPersons" resultType="com.qcby.springBootMybatis.bean.Person">
        select * from person
    </select>
</mapper>

在 application.yaml 中配置 mybatis 相关配置信息

其中
config-location 值为全局配置文件路径
mapper-locations 值为sql映射文件
type-aliases-package 值为实体类全类名

测试验证

使用了 Springboo t整合 mybatis 配置文件方式,Springboot 整合mybatis 注解版也同样会生效

到此这篇关于Springboot数据层开发的文章就介绍到这了,更多相关Springboot数据层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java: 程序包com.fasterxml.jackson.annotation不存在的解决办法

    java: 程序包com.fasterxml.jackson.annotation不存在的解决办法

    当我们在导入程序之后,系统给出错误提示:java: 程序包com.fasterxml.jackson.annotation不存在,本文主要介绍了Java程序包不存在的三种解决方法,需要的朋友可以参考下
    2024-02-02
  • SpringBoot项目的多文件兼多线程上传下载

    SpringBoot项目的多文件兼多线程上传下载

    本文主要介绍了SpringBoot项目的多文件兼多线程上传下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 解决springboot 部署到 weblogic 中 jar 包冲突的问题

    解决springboot 部署到 weblogic 中 jar 包冲突的问题

    这篇文章主要介绍了springboot 部署到 weblogic 中 jar 包冲突,weblogic 也有是解决方案的,可以通过新增并配置 weblogic.xml 文件来定义哪些类需要优先从项目工程包的 jar 包中加载,本文给大家分享解决方法,需要的朋友可以参考下
    2022-08-08
  • Java正则表达式匹配字符串并提取中间值的方法实例

    Java正则表达式匹配字符串并提取中间值的方法实例

    正则表达式常用于字符串处理、表单验证等场合,实用高效,下面这篇文章主要给大家介绍了关于Java正则表达式匹配字符串并提取中间值的相关资料,需要的朋友可以参考下
    2022-06-06
  • 深入剖析Java ArrayQueue(JDK)的源码

    深入剖析Java ArrayQueue(JDK)的源码

    本篇文章主要给大家介绍一个比较简单的JDK为我们提供的容器ArrayQueue,这个容器主要是用数组实现的一个单向队列,整体的结构相对其他容器来说就比较简单了,感兴趣的可以了解一下
    2022-08-08
  • SpringMVC整合SSM实现表现层数据封装详解

    SpringMVC整合SSM实现表现层数据封装详解

    这篇文章主要介绍了SpringMVC整合SSM实现表现层数据封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • java unicode转码为中文实例

    java unicode转码为中文实例

    这篇文章主要介绍了java unicode转码为中文的实例,大家参考使用吧
    2013-12-12
  • Java -jar参数设置小结

    Java -jar参数设置小结

    本文主要介绍了Java -jar参数设置小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • JSP request.setAttribute()详解及实例

    JSP request.setAttribute()详解及实例

    这篇文章主要介绍了 javascript request.setAttribute()详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • 解决javaWEB中前后台中文乱码问题的3种方法

    解决javaWEB中前后台中文乱码问题的3种方法

    这篇文章主要介绍了解决javaWEB中前后台中文乱码问题的3种方法,中文问题一直是很多人难以解决的问题,对这方面感兴趣的朋友可以参考一下
    2015-11-11

最新评论