SpringBoot之数据库连接,JDBC、Druid数据源、Mybatis整合

Spring Boot之整合数据库

1、SpringBoot之JDBC

  1. 使用对应的启动器
<!-- jdbc的启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 数据库的启动器-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  1. 配置数据源

由于使用了对应的jdbc启动器,所以springboot自动装配了jdbc对应的组件,我们可以直接使用,只需要配置好数据源即可。DataSourceAutoConfiguration这个类就是jdbc的自动装配类,它对应的properties文件就是数据源的配置属性。

image-20220108170526340

对应的配置文件为:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=tmerue&characterEncoding=utf-8&serveTimezone=UTC
    password: 1234567
    username: root

配置了数据源以后,springboot自动封装了一个DataSource组件到spring容器中,这样就可以通过这个数据源获取数据库连接,连接到数据库中就可以进行数据库的操作。springboot默认的数据源是HikariDataSource

@Autowired
DataSource dataSource;

@Test
void contextLoads() throws SQLException {
    System.out.println(dataSource);
    Connection connection = dataSource.getConnection();
    System.out.println(connection);

}

springboot也封装了JdbcTemplate这个类,直接通过这个已经封装好类进行数据库的操作。例如像下面:

@Autowired
JdbcTemplate jdbcTemplate;

@Test
void contextLoads() throws SQLException {
    // sql语句
    String sql = "select *from user";
    // 将查询的结果封装到一个List中
    List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
    // 遍历结果
    for (Object o:result) {
        System.out.println(o);
    }
}

2、SpringBoot之Druid

​ Druid数据源是阿里巴巴开源的一个数据库连接池,结合了c3p0、DBCP等其它数据连接池的众多优点,同时加入了日志监控系统。Druid可以很好监控DB连接池和SQL的执行情况,是一个很优秀的数据源。

2.1、druid使用步骤

  1. 导入依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>
  1. 修改默认的数据源:只需要在配置文件中设置type属性即可。
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=tmerue&characterEncoding=utf-8&serveTimezone=UTC
    password: 1234567
    username: root
    type: com.alibaba.druid.pool.DruidDataSource

其他常用配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=tmerue&characterEncoding=utf-8&serveTimezone=UTC
    password: 1234567
    username: root
    type: com.alibaba.druid.pool.DruidDataSource
    # 初始化大小
    initial-size: 5
    # 最小连接数
    min-idle: 5
    # 最大连接数
    max-active: 20
    # 配置获取连接等待超时的时间
    max-wait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
    time-between-eviction-runs-millis: 60000
    # 配置一个连接在池中最小生存时间
    min-evictable-idle-time-millis: 300000
    # 打开 PSCache,并且指定每个连接上 PSCache 的大小
    pool-prepared-statements: true
    # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
    # stat是监控的,wall是防火墙,log4j是日志
    filters: stat,wall,log4j

2.2、druid日志监控

  1. 将配置文件注入到DruidDataSource中:
@Configuration
public class DruidConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }
}
  1. 后台数据库监控的配置:
@Bean
public ServletRegistrationBean statViewServlet(){
    // 第一个参数是一个类,第二个参数是访问路径,一般都是druid
    ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
    HashMap<String, String> initParameters = new HashMap<>();
    // 设置后台监控系统的登录密码,map的key只能这样写,不能改变
    initParameters.put("loginUsername","xiaotanke");
    initParameters.put("loginPassword","xiaotanke");
    // 配置谁能访问(白名单),如果值是一个空串就是所有人就可以访问
    initParameters.put("allow","127.0.0.1");
    // 配置黑名单
    initParameters.put("test","198.168.11.123");
    bean.setInitParameters(initParameters);
    return bean;
}
  1. 通过localhost/druid进行访问后台的数据库监控系统,需要先登录。

image-20220109184229792

image-20220109184306126

2.3、druid过滤器

// 过滤器
@Bean
public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(new WebStatFilter());
    HashMap<String, String> initParameters = new HashMap<>();
    // 这些资源就不进行统计
    initParameters.put("exclusions","*.js,*.css,*.png,*.jpg,/druid/*");
    bean.setInitParameters(initParameters);
    return bean;
}

由于在SpringBoot中内置了Servlet容器,没有了web.xml文件,但是可以通过这种方式来注册一个servletfilterlistener等。通过XXXRegistrationBean,然后配置其属性,然后注入到Spring容器中就可以使用了。

3、SpringBoot整合Mybatis

  1. 连接数据库并进行测试。
  2. 通过数据库中的字段,创建实体类。
  3. 编写mapper接口。
@Mapper  // 这个注解表示这是一个mybatis的mapper接口
@Repository  // 注入到Spring容器中
public interface UserMapper {

    // 查询所有的用户
    List<User> queryAllUser();

}

除了使用@Mapper注解将这个接口标注为一个mybatis的mapper接口,也可以在主程序的使用@MapperScan进行包扫描。这个注解对应的包下的所有接口在编译的时候就可以生成对应的实现类,可以配置多个包进行扫描。

@SpringBootApplication
@MapperScan({"com.xiaotanke.mapper","com.xiaotanke.mapper1"})
public class SpringBootMybatisApplication {

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

}
  1. 编写mapper对应的xml文件。

在resources文件夹下创建一个mapper文件,在这个文件下创建对应实体的mapper文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaotanke.mapper.UserMapper">
    
    <select id="queryAllUser" resultType="User">
        select *from mybatis.user
    </select>
</mapper>
  1. mybatis与springboot的整合,编写配置文件。
# mybatis配置
mybatis:
  # 别名包扫描
  type-aliases-package: com.xiaotanke.entity
  # mapper的注册,注意classpath:后面不要加 /
  mapper-locations: classpath:mapper/*.xml

上面是两个基本的配置,可以配置的属性有很多,可以进入源码查看。

private String configLocation;
private String[] mapperLocations;
private String typeAliasesPackage;
private Class<?> typeAliasesSuperType;
private String typeHandlersPackage;
private boolean checkConfigLocation = false;
private ExecutorType executorType;
private Class<? extends LanguageDriver> defaultScriptingLanguageDriver;
private Properties configurationProperties;
@NestedConfigurationProperty
private Configuration configuration;
  1. 进行测试
@RestController
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/query")
    public List<User> queryAllUser(){
        return userMapper.queryAllUser();
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个示例代码,使用Spring BootDruid连接MySQL多数据源,并且对数据库密码进行了加解密: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ``` <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- Spring Boot Starter JDBC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- Druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.23</version> </dependency> <!-- Jasypt --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> </dependencies> ``` 2. 配置数据源 在 application.yml 文件中添加以下配置: ``` # 默认数据源 spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=root spring.datasource.password=ENC(加密后的密码) spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 第二个数据源 datasource2.url=jdbc:mysql://localhost:3306/db2 datasource2.username=root datasource2.password=ENC(加密后的密码) datasource2.driver-class-name=com.mysql.jdbc.Driver ``` 其中,密码字段使用 Jasypt 进行加密,格式为 `ENC(加密后的密码)`。 3. 配置Druid数据源 在配置文件中添加以下配置: ``` # Druid数据源配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # 配置第一个数据源 spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall,log4j # 配置第二个数据源 datasource2.druid.initial-size=5 datasource2.druid.min-idle=5 datasource2.druid.max-active=20 datasource2.druid.max-wait=60000 datasource2.druid.time-between-eviction-runs-millis=60000 datasource2.druid.min-evictable-idle-time-millis=300000 datasource2.druid.validation-query=SELECT 1 FROM DUAL datasource2.druid.test-while-idle=true datasource2.druid.test-on-borrow=false datasource2.druid.test-on-return=false datasource2.druid.pool-prepared-statements=true datasource2.druid.max-pool-prepared-statement-per-connection-size=20 datasource2.druid.filters=stat,wall,log4j ``` 4. 配置数据源连接池 在配置类中添加以下代码: ``` @Configuration public class DataSourceConfig { @Bean(name = "dataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource") public DruidDataSource dataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "datasource2") public DruidDataSource dataSource2() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "dataSource1TransactionManager") @Primary public DataSourceTransactionManager dataSourceTransactionManager() { return new DataSourceTransactionManager(dataSource()); } @Bean(name = "dataSource2TransactionManager") public DataSourceTransactionManager dataSource2TransactionManager() { return new DataSourceTransactionManager(dataSource2()); } @Bean(name = "dataSource1SqlSessionFactory") @Primary public SqlSessionFactory dataSourceSqlSessionFactory(@Qualifier("dataSource") DruidDataSource dataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); return sessionFactory.getObject(); } @Bean(name = "dataSource2SqlSessionFactory") public SqlSessionFactory dataSource2SqlSessionFactory(@Qualifier("dataSource2") DruidDataSource dataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper2/*.xml")); return sessionFactory.getObject(); } } ``` 其中,`@Primary` 注解表示默认数据源,`@ConfigurationProperties` 注解表示从配置文件中读取配置。 5. 配置MyBatis 在 `application.yml` 文件中添加以下配置: ``` mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity ``` 6. 编写DAO和Mapper 在 `com.example.dao` 包中编写DAO和Mapper,例如: ``` @Repository public interface UserDAO { @Select("SELECT * FROM user") @Results(id = "userResultMap", value = { @Result(property = "id", column = "id", id = true), @Result(property = "name", column = "name"), @Result(property = "email", column = "email"), @Result(property = "phone", column = "phone"), @Result(property = "createTime", column = "create_time") }) List<User> list(); } @Mapper public interface UserMapper { @Select("SELECT * FROM user") @ResultMap("userResultMap") List<User> list(); } ``` 7. 使用数据源 在Service中使用数据源,例如: ``` @Service public class UserService { @Autowired private UserDAO userDAO; @Autowired private UserMapper userMapper; @Transactional(transactionManager = "dataSource1TransactionManager") public List<User> list() { return userDAO.list(); } @Transactional(transactionManager = "dataSource2TransactionManager") public List<User> list2() { return userMapper.list(); } } ``` 其中,`@Transactional` 注解表示开启事务,`transactionManager` 参数指定使用的数据源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值