魏名华

不要偷懒,做更好的自己

Nothing


No Welcome Message

玩转Spring全家桶--第二章:JDBC必知必会 (10讲)

05 | 如何配置单数据源

H2

H2数据库介绍   H2数据库地址:http://www.h2database.com/html/main.html

  H2是一个开源的嵌入式(非嵌入式设备)数据库引擎,它是一个用Java开发的类库,可直接嵌入到应用程序中,与应用程序一起打包发布,不受平台限制。   

1.1 与其他开源数据库比较

  H2与Derby、HSQLDB、MySQL、PostgreSQL等开源数据库相比,H2的优势为:a.存Java开发,不受平台限制;b.H2只有一个jar包,占用空间小,适合嵌入式数据库;c.有web控制台,用于管管理数据库。

作者:Jerry的技术博客 来源:CSDN 原文:https://blog.csdn.net/xktxoo/article/details/78014739 版权声明:本文为博主原创文章,转载请附上博文链接!

lombok

通过lombok注解实现自动生成get、set方法:https://www.zhihu.com/question/42348457

jdbc

Java Database Connectivity

bean

JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。

只是一个简单的特殊的类,并没有什么,只是为什么要设计这样的类,用来做什么,后面看看

https://www.zhihu.com/question/19773379 这个解释了为什么用javabean,不知道科不科学

leesper 2019-02-23
老师,总是在Java里听到Bean这个词,到底什么是Bean,能详细讲讲吗,这些概念上还是有点模糊。

作者回复: Bean简单来讲就是由Spring容器创建并托管的实例。

Autowired

自动装配@Autowired&@Resource: https://blog.csdn.net/qq_27470131/article/details/79601287

springboot 自动配置数据源

private void showConnection() throws SQLException {
		log.info(dataSource.toString());
		Connection conn = dataSource.getConnection();
		log.info(conn.toString());
		conn.close();
}

输出log:

:HikariDataSource (HikariPool-1)
:HikariProxyConnection@2101326063 wrapping conn0: url=jdbc:h2:mem:testdb user=SA
  • 查看配置的bean:

http://localhost:8080/actuator/beans

手动配置数据源

pure-spring-datasource-demo,这个demo演示了,不用spring boot,手动配置数据源

数据初始化

  • sql文件在resources目录下,可以省略不写下列代码:
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
spring.datasource.initialization-mode=ALWAYS
  • sql文件在resources/sql目录下,必须加上下列代码:
spring.datasource.schema=classpath:sql/schema.sql
spring.datasource.data=classpath:sql/data.sql
spring.datasource.initialization-mode=ALWAYS
  • spring boot 会自动执行schema.sql、data.sql
private void showData() {
		jdbcTemplate.queryForList("SELECT * FROM FOO")
				.forEach(row -> log.info(row.toString()));
}

输出log:

:{ID=1, BAR=aaa}
:{ID=2, BAR=bbb}

06 | 如何配置多数据源

配置多数据源的注意事项

1、不不同数据源的配置要分开

2、关注每次使⽤用的数据源 有多个DataSource时系统如何判断 对应的设施(事务、ORM等)如何选择DataSource

Spring Boot中的多数据源配置

1、⼿手⼯工配置两组 DataSource 及相关内容

2、与Spring Boot协同⼯工作(⼆选一)

2.1、配置@Primary类型的Bean 2.2、排除Spring Boot的⾃自动配置 DataSourceAutoConfiguration DataSourceTransactionManagerAutoConfiguration JdbcTemplateAutoConfiguration

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class})
@Slf4j
public class MultiDataSourceDemoApplication {
	...
}

07 | 那些好用的连接池们:HikariCP

HikariCP性能很高,做了很多牛逼的优化,是spring boot的默认数据库连接池

常⽤用 HikariCP 配置参数 spring.datasource.hikari.maximumPoolSize=10 spring.datasource.hikari.minimumIdle=10 spring.datasource.hikari.idleTimeout=600000 spring.datasource.hikari.connectionTimeout=30000 spring.datasource.hikari.maxLifetime=1800000

https://github.com/brettwooldridge/HikariCP

08 | 那些好用的连接池们:Alibaba Druid

经过阿⾥里里巴巴各⼤大系统的考验,值得信赖

实⽤用的功能

详细的监控(真的是全⾯面) ExceptionSorter,针对主流数据库的返回码都有⽀支持 SQL 防注⼊入 内置加密配置 众多扩展点,⽅方便便进⾏行行定制

使用Druid

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc<artifactId>
		<exclusions>
			<exclusion>
				<artifactId>HikariCP</artifactId>
				<groupId>com.zaxxer</groupId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid-spring-boot-starter<artifactId>
		<version>1.1.10</version>
	</dependency>

在jdbc排除默认的HikariCP

09 | 如何通过Spring JDBC访问数据库

spring-jdbc

Spring 的 JDBC 操作类 core,JdbcTemplate 等相关核⼼心接⼝口和类 datasource,数据源相关的辅助类 object,将基本的 JDBC 操作封装成对象 support,错误码等其他辅助⼯工具

通过注解定义 Bean

@Component @Repository @Service @Controller @RestController

JdbcTemplate

query queryForObject queryForList update execute

SQL批处理

JdbcTemplate batchUpdate BatchPreparedStatementSetter

NamedParameterJdbcTemplate batchUpdate SqlParameterSourceUtils.createBatch

具体操作增删改查,看代码simple-jdbc-demo

插入2种方法: 1、jdbcTemplate.update; 2、simpleJdbcInsert.executeAndReturnKey(simpleJdbcInsert在SimpleJdbcDemoApplication)

Arrays.asList("b", "c").forEach(bar -> {
  jdbcTemplate.update("INSERT INTO FOO (BAR) VALUES (?)", bar);
});

HashMap<String, String> row = new HashMap<>();
row.put("BAR", "d");
Number id = simpleJdbcInsert.executeAndReturnKey(row);
log.info("ID of d: {}", id.longValue());

10 | 什么是Spring的事务抽象(上)

Spring 的事务抽象

这个是啥?就是事物的隔离性等等设置?

11 | 什么是Spring的事务抽象(下)

编程式事物代码:programmatic-transaction-demo 声明式事物代码:declarative-transaction-demo

12 | 了解Spring的JDBC异常抽象

errorcode-demo: 自定义数据库异常(同时介绍了怎么做单元测试)

13 | 课程答疑(上)

/actuator/health 健康检查 /actuator/beans 查看容器器中的所有 Bean /actuator/mappings 查看 Web 的 URL 映射 /actuator/env 查看环境信息

14 | 课程答疑(下)