SpringBoot从入门到放弃,第四章,整合JDBC Druid Mybatis

原创
2019/11/14 19:20
阅读数 306

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:\Users\Administrator\Desktop\电商设计\images\7.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;
    
 	...   
}
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部