SpringBoot从入门到放弃,第四章,整合JDBCDruidMybatis

编程

SpringBoot从入门到放弃,第四章

一、springboot整合JDBC和DRUID

1、POM

<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>

2、application.yml

server:

port: 8080

spring:

datasource:

username: root

password: 123456

url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC

driver-class-name: com.mysql.jdbc.Driver

3、jdbcTemplate

@RestController

public class HelloJdbcController {

@Autowired

private JdbcTemplate jdbcTemplate;

@GetMapping("/jdbcData")

public List jdbcData(){

return jdbcTemplate.queryForList("select * from student");

}

}

4、结果

[{"id":1,"stuname":"s1","classid":1},{"id":2,"stuname":"s2","classid":1},

{"id":3,"stuname":"s3","classid":1},{"id":4,"stuname":"s4","classid":2},

{"id":5,"stuname":"s5","classid":3},{"id":6,"stuname":"s6","classid":3}]

5、源码解读

位置:org.springframework.boot:spring-boot-autoconfigure:2.2.1.RELEASE包下的JDBC

DataSource注入

DataSourceConfiguration给容器导入数据源的

abstract class DataSourceConfiguration {

protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {

return (T) properties.initializeDataSourceBuilder().type(type).build();

}

@Configuration(proxyBeanMethods = false)

@ConditionalOnClass(HikariDataSource.class)

@ConditionalOnMissingBean(DataSource.class)

@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",

matchIfMissing = true)

static class Hikari {

@Bean

@ConfigurationProperties(prefix = "spring.datasource.hikari")

HikariDataSource dataSource(DataSourceProperties properties) {

HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);

if (StringUtils.hasText(properties.getName())) {

dataSource.setPoolName(properties.getName());

}

return dataSource;

}

}

....

}

以上我们可以看出:如果我们将spring.datasource.type配置成com.alibaba.druid.pool.DruidDataSource并将相关的druid包导入,也可以更换数据源

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid-spring-boot-starter</artifactId>

<version>1.1.10</version>

</dependency>

DataSourceProperties将application中的配置信息注入数据源的

@ConfigurationProperties(prefix = "spring.datasource")

public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean{

private String url;

private String username;

private String password;

private String driverClassName;

private List<String> schema;

....

public DataSourceBuilder<?> initializeDataSourceBuilder() {

return DataSourceBuilder.create(getClassLoader()).type(getType()).driverClassName(determineDriverClassName())

.url(determineUrl()).username(determineUsername()).password(determinePassword());

}

}

我们可以在YML中配置自动建表语句:

spring:

datasource:

schema:

- classpath:user.sql

- classpath:order.sql

自动配置源码如下:

boolean createSchema() {

List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");

if (!scripts.isEmpty()) {

if (!isEnabled()) {

logger.debug("Initialization disabled (not running DDL scripts)");

return false;

}

String username = this.properties.getSchemaUsername();

String password = this.properties.getSchemaPassword();

runScripts(scripts, username, password);

}

return !scripts.isEmpty();

}

6、整合DRUID

pom

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid-spring-boot-starter</artifactId>

<version>1.1.10</version>

</dependency>

YML

server:

port: 8080

spring:

datasource:

username: root

password: 123456

url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC

driver-class-name: com.mysql.jdbc.Driver

type: com.alibaba.druid.pool.DruidDataSource

druid:

initial-size: 8

min-idle: 1

max-active: 20

max-wait: 60000

time-between-eviction-runsMillis: 60000

min-evictable-idle-timeMillis: 300000

validation-query: select "x" FROM DUAL

test-while-idle: true

test-on-borrow: false

test-on-return: false

pool-prepared-statements: true

max-open-prepared-statements: 20

max-pool-prepared-statement-per-connection-size: 20

filters: stat

connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

use-global-data-source-stat: true

也可以增加如下内容:

#监控配置

# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter

spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值true

spring.datasource.druid.web-stat-filter.url-pattern=

spring.datasource.druid.web-stat-filter.exclusions=

spring.datasource.druid.web-stat-filter.session-stat-enable=

spring.datasource.druid.web-stat-filter.session-stat-max-count=

spring.datasource.druid.web-stat-filter.principal-session-name=

spring.datasource.druid.web-stat-filter.principal-cookie-name=

spring.datasource.druid.web-stat-filter.profile-enable=

# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置

spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet默认值true

spring.datasource.druid.stat-view-servlet.url-pattern=

spring.datasource.druid.stat-view-servlet.reset-enable=

spring.datasource.druid.stat-view-servlet.login-username=

spring.datasource.druid.stat-view-servlet.login-password=

spring.datasource.druid.stat-view-servlet.allow=

spring.datasource.druid.stat-view-servlet.deny=

启动类APP

@SpringBootApplication

public class BootJdbcApplication {

public static void main(String[] args) {

SpringApplication.run(BootJdbcApplication.class, args);

}

}

访问:

http://localhost:8080/druid

注意:如果引入的不是druid-spring-boot-starter而是如下

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.1.10</version>

</dependency>

YML中的一些列 参数是无法自动加入到DruidDataSource中的,我们需要在配置文件中增加代码,如下:

@Bean

@ConfigurationProperties(prefix = "spring.datasource")//会将spring.datasoruce下的参数自动注入到DruidDataSource的上

public DataSource getDataSource() {

return new DruidDataSource();

}

YML去掉DRUID

server:

port: 8080

spring:

datasource:

username: root

password: 123456

url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC

driver-class-name: com.mysql.jdbc.Driver

type: com.alibaba.druid.pool.DruidDataSource

initial-size: 8

min-idle: 1

max-active: 20

max-wait: 60000

time-between-eviction-runsMillis: 60000

min-evictable-idle-timeMillis: 300000

validation-query: select "x" FROM DUAL

test-while-idle: true

test-on-borrow: false

test-on-return: false

pool-prepared-statements: true

max-open-prepared-statements: 20

max-pool-prepared-statement-per-connection-size: 20

filters: stat

connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

use-global-data-source-stat: true

因为在druid-spring-boot-starter中的配置源码是这样的:

@ConfigurationProperties("spring.datasource.druid")

public class DruidStatProperties {

}

且在启动类中增加

@Bean

public ServletRegistrationBean druidStatViewServlet() {

//ServletRegistrationBean提供类的进行注册

ServletRegistrationBean servletRegistrationBean =

new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

//添加初始化参数:initParams

//白名单:

servletRegistrationBean.addInitParameter("allow", "127.0.0.1");

//IP黑名单(同时存在时,deny优先于allow)

//如果满足deny,就提示:sorry,you are not permitted to view this page

servletRegistrationBean.addInitParameter("deny", "192.168.1.73");

//登录查看信息的账号和密码

servletRegistrationBean.addInitParameter("loginUsername", "admin");

servletRegistrationBean.addInitParameter("loginPassword", "123456");

servletRegistrationBean.addInitParameter("resetEnable", "false");

return servletRegistrationBean;

}

@Bean

public FilterRegistrationBean druidStatFilter() {

FilterRegistrationBean filterRegistrationBean =

new FilterRegistrationBean(new WebStatFilter());

//添加过滤规则

filterRegistrationBean.addUrlPatterns("/*");

//添加需要忽略的格式信息

filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif," +

"*.jpg,*.png, *.css,*.ico,/druid/*");

return filterRegistrationBean;

}

二、SpringBoot整合Mybatis

1、POM

![7](C:UsersAdministratorDesktop电商设计images7.png)<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid-spring-boot-starter</artifactId>

<version>1.1.10</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.1</version>

</dependency>

我们查看一下mybatis的jar包依赖关系

2、entity

@Data

@ToString

public class Student {

private Integer id;

private String stuName;

private Integer classId;

}

3、mapper

//或者在启动类上直接增加@MapperScan扫描包-->推荐@MapperScan

@Mapper

public interface StudentMapper {

List<Student> findAll();

}

4、Controller

@RestController

public class HelloJdbcController {

@Autowired

private StudentMapper studentMapper;

@GetMapping("/findAll")

public List<Student> findAllStudent(){

return studentMapper.findAll();

}

}

5、Mapper.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.lee.bootjdbc.mapper.StudentMapper">

<select id="findAll" resultType="com.lee.bootjdbc.entity.Student">

select * from student

</select>

</mapper>

6、mybatis-config.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>

7、application.yml

server:

port: 8080

spring:

datasource:

username: root

password: 123456

url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC

driver-class-name: com.mysql.jdbc.Driver

type: com.alibaba.druid.pool.DruidDataSource

druid:

initial-size: 8

min-idle: 1

max-active: 20

max-wait: 60000

time-between-eviction-runsMillis: 60000

min-evictable-idle-timeMillis: 300000

validation-query: select "x" FROM DUAL

test-while-idle: true

test-on-borrow: false

test-on-return: false

pool-prepared-statements: true

max-open-prepared-statements: 20

max-pool-prepared-statement-per-connection-size: 20

filters: stat

connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

use-global-data-source-stat: true

mybatis:

config-location: classpath:mybatis/mybatis-config.xml

mapper-locations: classpath:mybatis/mapper/*.xml

8、访问测试

http://localhost:8080/findAll

结果:

[{"id":1,"stuName":"s1","classId":1},{"id":2,"stuName":"s2","classId":1},

{"id":3,"stuName":"s3","classId":1},{"id":4,"stuName":"s4","classId":2},

{"id":5,"stuName":"s5","classId":3},{"id":6,"stuName":"s6","classId":3}]

9、源码解析

在org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.1中autoconfigure包下

MybatisAutoConfiguration

这里为mybatis注入了sqlSessionFactory,自动加载了配置信息等

@Configuration@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})@ConditionalOnBean({DataSource.class})@EnableConfigurationProperties({MybatisProperties.class})@AutoConfigureAfter({DataSourceAutoConfiguration.class})public class MybatisAutoConfiguration {

@Bean

@ConditionalOnMissingBean

public SqlSessionFactory sqlSessionFactory(DataSource dataSource){

...

}

@Bean

@ConditionalOnMissingBean

public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {

...

}

public static class AutoConfiguredMapperScannerRegistrar{

}

public void setBeanFactory(BeanFactory beanFactory){

this.beanFactory = beanFactory;

}

}

这里会加载application中mybatis的配置信息,且以mybatis开始

@ConfigurationProperties( prefix = "mybatis")

public class MybatisProperties {

public static final String MYBATIS_PREFIX = "mybatis";

private String configLocation;

private String[] mapperLocations;

private String typeAliasesPackage;

private String typeHandlersPackage;

private boolean checkConfigLocation = false;

private ExecutorType executorType;

private Properties configurationProperties;

...

}

以上是 SpringBoot从入门到放弃,第四章,整合JDBCDruidMybatis 的全部内容, 来源链接: utcz.com/z/510782.html

回到顶部