Springboot数据层开发

Springboot数据层开发

数据源自动管理

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

xml 复制代码
        <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

测试数据源

java 复制代码
@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 连接池和日志依赖

xml 复制代码
        <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 中会标黄,且不起作用

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

java 复制代码
@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,以及配置初始化参数

java 复制代码
@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

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

sql 复制代码
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源码:

java 复制代码
@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 模块

xml 复制代码
        <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

java 复制代码
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

java 复制代码
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 直接注入使用。

单元测试

java 复制代码
@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 的下划线转驼峰命名自动映射功能

java 复制代码
@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 复制代码
<?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 复制代码
<?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 注解版也同样会生效

相关推荐
上78将1 小时前
JVM回收垃圾机制
java·开发语言·jvm
Evan芙1 小时前
shell编程求10个随机数的最大值与最小值
java·linux·前端·javascript·网络
BD_Marathon1 小时前
【IDEA】IDEA的详细设置
java·ide·intellij-idea
未来coding1 小时前
Spring AI ChatModel API 详解【基于官方文档】
java·后端·spring
忘记9261 小时前
重复注解的机制是什么
java
喜欢流萤吖~1 小时前
Servlet 生命周期详解
java·servlet
刘一说1 小时前
JDK 25新纪元:技术革新与老项目迁移的冷思考
java·开发语言
无限进步_1 小时前
C语言双向循环链表实现详解:哨兵位与循环结构
c语言·开发语言·数据结构·c++·后端·算法·链表
小帅学编程1 小时前
Java基础
java·开发语言