自学内容网 自学内容网

springboot数据层开发


1、数据源自动管理

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

在pom文件中添加以下这些依赖来进行数据库的连接和管理

<!-- 提供 Spring BootJDBC 的支持 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- DBCP2 提供数据库连接池实现 -->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-dbcp2</artifactId>
</dependency>
<!-- MySQLJDBC 驱动 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <scope>runtime</scope>
</dependency>

使用YAML方式配置,创建application.yaml

#server:
#  port: 8085
spring:
  datasource:
    username: root
    password: 2020
    #数据库连接的url
    url: jdbc:mysql://localhost:3306/boot_demo
    driver-class-name: com.mysql.jdbc.Driver
    #数据库连接池的类型
    type: com.zaxxer.hikari.HikariDataSource

在默认情况下,数据库连接可以使用DataSource池进行自动配置

也可以自己指定数据源配置,通过type来选取使用哪种数据源

#server:
#  port: 8085
spring:
  datasource:
    username: root
    password: 2020
    #数据库连接的url
    url: jdbc:mysql://localhost:3306/boot_demo
    driver-class-name: com.mysql.jdbc.Driver
    #数据库连接池的类型
    type: com.zaxxer.hikari.HikariDataSource
   # type: org.apache.commons.dbcp2.BasicDataSource

2、配置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.15</version>
</dependency>

修改application.yaml中数据库连接池的类型

并添加一些其他配置要求

spring:
  datasource:
    username: root
    password: 2020
    url: jdbc:mysql://localhost:3306/boot_demo
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5 
    #初始时连接池中创建的连接数量
    minIdle: 5 
    #连接池中的最小空闲连接数
    maxActive: 20 
    #最大活跃连接数
    maxWait: 60000 
    #连接池中连接的最大等待时间
    timeBetweenEvictionRunsMillis: 60000 
    #定时检查空闲连接的间隔时间
    minEvictableIdleTimeMillis: 300000 
    #连接在连接池中保持空闲而不被驱逐的最小时间
    validationQuery: SELECT 1 FROM DUAL 
    #检测连接是否有效的 SQL 查询
    testWhileIdle: true 
    #是否在空闲时检查连接的有效性
    testOnBorrow: false 
    #是否在获取连接时检查连接的有效性
    testOnReturn: false 
    #是否在归还连接时检查连接的有效性
    poolPreparedStatements: true 
    #是否启用预编译语句池
    filters: stat,wall,log4j 
    # 监控统计 防火墙 日志记录
    maxPoolPreparedStatementPerConnectionSize: 20 
    #每个连接的最大 PSCache 数量
    useGlobalDataSourceStat: true 
    #是否启用全局监控
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    #将相同的 SQL 合并统计;慢查询的阈值为 500 毫秒

创建数据源的注册类

@Configuration
//创建数据源注册类
public class DruidConfig {

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

配置druid运行期监控

@Configuration
//创建数据源注册类
public class DruidConfig {


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

    //1.配置druid运行期监控
    @Bean
    public ServletRegistrationBean statViewServlet() {
        // 创建 Servlet 注册对象,设置访问路径为 /druid/*
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        // 配置监控页面的参数
        Map<String, String> initParams = new HashMap<>();
        // 设置登录用户名
        initParams.put("loginUsername", "root");
        // 设置登录密码
        initParams.put("loginPassword", "2020");
        // 设置允许访问的 IP,空字符串表示允许所有 IP
        initParams.put("allow", "");
        // 设置拒绝访问的 IP
        initParams.put("deny", "192.168.15.21");
        // 将参数绑定到 Servlet 注册对象
        bean.setInitParameters(initParams);
        return bean;
    }

    //2.配置web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        // 创建过滤器注册对象
        FilterRegistrationBean bean = new FilterRegistrationBean();
        // 设置过滤器为 Druid 的 WebStatFilter
        bean.setFilter(new WebStatFilter()); 

        // 配置过滤器的初始化参数
        Map<String, String> initParams = new HashMap<>();
        // 排除静态资源和监控页面路径
        initParams.put("exclusions", "*.js,*.css,/druid/*"); 

        // 将初始化参数绑定到过滤器注册对象
        bean.setInitParameters(initParams);

        // 设置过滤器作用的 URL 模式,过滤所有请求路径
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }

}

在浏览器输入http://localhost:8080/druid打开监控页面

image-20250110093831849

3、Spring Boot整合JDBCTemplate

新建数据库boot_demo并创建表my_user

SET FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
-- Table structure for my_user
-- ----------------------------
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `p_addr` varchar(255) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  `birth` date DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of my_user
-- ----------------------------
INSERT INTO `my_user` VALUES ('1', 'zhangsan', '123', '北京', '1', '2020-06-14');

image-20250110094322346

创建TestController

@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 tx_user");
        return maps;
    }
}

启动springboot访问http://localhost:8080/query

Springboot中提供了JdbcTemplateAutoConfiguration的自动配置

org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,

JdbcTemplateAutoConfiguration源码:

image-20250110100450284

image-20250110100414191

4、Spring Boot整合mybatis注解版

引入mybatis相关依赖

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

配置数据源相关属性

这里不再赘述,可以查看配置druid数据源章节

创建数据库表

新建一个tx_person表

image-20250110101245467

创建JavaBean

public class TxPerson {

    private int pid;

    private String pname;

    private String pAddr;

    private int gender;

    private Date birth;

    public TxPerson(int pid, String pname, String pAddr, int gender, Date birth) {
        this.pid = pid;
        this.pname = pname;
        this.pAddr = pAddr;
        this.gender = gender;
        this.birth = birth;
    }

    public TxPerson() {
    }

    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 getpAddr() {
        return pAddr;
    }

    public void setpAddr(String pAddr) {
        this.pAddr = pAddr;
    }

    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 "TxPerson{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", pAddr='" + pAddr + '\'' +
                ", gender=" + gender +
                ", birth=" + birth +
                '}';
    }
}

创建mapper

@Mapper
public interface TxPersonMapper {

    @Select("select * from tx_person")
    public List<TxPerson> getPersons();


    @Select("select * from tx_person t where t.pid = #{id}")
    public TxPerson getPersonById(int id);

    @Options(useGeneratedKeys =true, keyProperty = "pid")
    @Insert("insert into tx_person(pid, pname, p_addr,gender, birth)" +
            " values(#{pid}, #{pname}, #{pAddr},#{gender}, #{birth})")
    public void insert(TxPerson person);

    @Delete("delete from tx_person where pid = #{id}")
    public void delete(int id);
}

单元测试

@SpringBootTest
class Springboot04ApplicationTests {

@Autowired
private TxPersonMapper txPersonMapper;

@Autowired
private ApplicationContext context;

@Test
public void contextLoads() throws SQLException{
// 获取 DataSource Bean
DataSource bean = (DataSource) context.getBean("dataSource");
System.out.println(bean);
}

@Test
public void testMybatis() throws SQLException{
TxPerson p = txPersonMapper.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);
            }
        };
    }
}

查询结果

TxPerson{pid=1, pname='张三', pAddr='北京', gender=1, birth=Thu Jun 14 00:00:00 CST 2018}

通过扫描器注解来扫描

我们可以不再接口上加@Mapper注解,通过在启动类上添加@MapperScan注解去指定MyBatis扫描的Mapper接口的包路径

@SpringBootApplication
@MapperScan("com.qcby.springboot04.mapper")
public class Springboot04Application {

public static void main(String[] args) {
SpringApplication.run(Springboot04Application.class, args);
}
}

Mapper接口存放在com.qcby.springboot04.mapper

image-20250110105135759

5、Spring Boot整合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>
</configuration>

创建映射文件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="cn.tx.mapper.TxPersonMapper">
    <select id="getPersons" resultType="TxPerson">
        select * from tx_person
    </select>
</mapper>

在application.yaml中配置mybatis的信息

mybatis:
  #配置MyBatis全局配置文件的路径
  config-location: classpath:mybatis/sqlMapConfig.xml
  #配置MyBatis映射文件的路径
  mapper-locations: classpath:mybatis/mapper/*.xml
  #配置类型别名路径,model类所在的包
  type-aliases-package: com.qcby.springboot04.model
/mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.tx.mapper.TxPersonMapper">
    <select id="getPersons" resultType="TxPerson">
        select * from tx_person
    </select>
</mapper>

在application.yaml中配置mybatis的信息

mybatis:
  #配置MyBatis全局配置文件的路径
  config-location: classpath:mybatis/sqlMapConfig.xml
  #配置MyBatis映射文件的路径
  mapper-locations: classpath:mybatis/mapper/*.xml
  #配置类型别名路径,model类所在的包
  type-aliases-package: com.qcby.springboot04.model

原文地址:https://blog.csdn.net/jlihan/article/details/145052561

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!