一、JDBC
1.单数据源
1).配置
①:引入依赖(数据库依赖,引擎依赖)
②:配置数据库信息
2).测试
①:启动类中引入 DataSource 并自动装配,编写一个 showConnection 方法获取 DataSource 实例和连接信息 Connection 实例
②:启动类实现 CommandLineRunner 接口,重写run方法,调用 showConnection 方法
③:启动项目,查看打印信息
1 /** 2 * 启动类 3 * 实现CommandLineRunner来重写run方法 4 * @author Administrator 5 */ 6 @SpringBootApplication 7 @Slf4j 8 public class DataspringApplication implements CommandLineRunner { 9 @Autowired 10 private DataSource dataSource; 11 12 public static void main(String[] args) { 13 SpringApplication.run(DataspringApplication.class, args); 14 } 15 16 /** 17 * 重写run方法 18 * @param args 启动参数 19 * @throws Exception 异常信息 20 */ 21 @Override 22 public void run(String... args) throws Exception { 23 showConnection(); 24 } 25 26 /** 27 * 展示数据源信息和连接信息 28 * @throws SQLException SQL异常信息 29 */ 30 private void showConnection() throws SQLException { 31 log.info("dataSource------------>{}",dataSource.toString()); 32 Connection connection = dataSource.getConnection(); 33 log.info("connection------------>{}",connection.toString()); 34 connection.close(); 35 } 36 }
3).查看启动的spring项目中有哪些bean
在cmd面板或者Terminal面板输入 curl http://localhost:8080/actuator/beans 可以查看运行的项目所有的bean,
在浏览器输入该url也可以查看,使用json美化工具更易于查看
ps:查看beans必须有actuator依赖,可能会出现NOT FOUND 或者 404页面,此时需要查看是否添加依赖,
如果依赖已经添加,则在application.yml文件中添加如下配置:
1 management: 2 endpoints: 3 web: 4 exposure: 5 include: health,beans,mapping,env
如果仅仅是查看bean,可以只写bean,具体原因参考:https://blog.csdn.net/qq_34412985/article/details/105466771
3).自己配置所需的Bean
①:数据源相关:
DataSource:根据选择的连接池实现决定
1 /** 2 * 自己配置数据源,可以将配置信息写在配置文件中 3 * @return 数据源实例 4 * @throws Exception 异常信息 5 */ 6 @Bean 7 public DataSource dataSource() throws Exception { 8 Properties properties = new Properties(); 9 properties.setProperty("driverClassName","驱动类名"); 10 properties.setProperty("url","数据库url"); 11 properties.setProperty("username","数据库用户名"); 12 properties.setProperty("password","数据库登录密码"); 13 return BasicDataSourceFactory.createDataSource(properties); 14 }
②:事务相关(可选):
PlatformTransactionManager(DataSourceTransactionManager)
1 /** 2 * 事务管理 3 * @return 数据源事务管理实例 4 */ 5 @Bean 6 public PlatformTransactionManager transactionManager(){ 7 return new DataSourceTransactionManager(); 8 }
TransactionTemplate
③:操作相关(可选)
JdbcTemplate
4)Spring Boot对数据源的配置
①:DataSourceAutoConfiguration:配置DataSource
②:DataSourceTransactionManagerAutoConfiguration:配置DataSourceTransactionManager
③:JdbcTemplateAutoConfiguration:配置JdbcTemplate
ps:符合条件是才进行配置
2.多数据源
1)配置注意事项:
①:不同数据源的配置要分开
②:关注每次使用的数据源(一定要注意留心每次使用的是那个数据源):
有多个DataSource时系统如何判断
对应的设施(事务、ORM等)如何选择DataSource
2)配置:
①:手工配置两组DataSource
②:与SpringBoot协同工作
方法一:多个实现类时,在某个实现类(需要注入到容器中的Bean)上添加@Primary注解,使该实现类作为自动注入的首选Bean,后SpringBoot相关的自动配置都会围绕这个Bean进行
以下是案例演示,实际使用时的service不会或者说一般不会这样
controller:
1 @Controller 2 public class UserController { 3 @Autowired 4 private UserService userService; 5 }
service:
接口:public interface UserService {}
实现类:
1 @Service 2 @Primary 3 public class StudentService implements UserService {}
1 @Service 2 public class TeacherService implements UserService {}
将StudentService作为UserService的首选Bean
使用@Qualifier注解对Bean进行命名或者组件声明时进行命名(各个Bean进行Name区分),自动注入时,使用@Qualifier注解通过Name对Bean进行选择
以下是案例演示,实际使用时的service不会或者说一般不会这样
controller:
1 @Controller 2 public class UserController { 3 @Autowired 4 @Qualifier("student") 5 private UserService userService; 6 }
service:
接口同上
实现类:
1 @Service("student") 2 @Primary 3 public class StudentService implements UserService {}
1 @Service("teacher") 2 public class TeacherService implements UserService {}
方法二:排除SpringBoot的自动配置(关于数据源的自动配置类有)
DataSourceAutoConfiguration
DataSourceTransactionManagerAutoConfiguration
JdbcTemplateAutoConfiguration
将自动配置类排除掉之后,自己在代码中对其进行控制
排除SpringBoot自动配置:
1 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, 2 DataSourceTransactionManager.class, 3 JdbcTemplateAutoConfiguration.class})
自己进行配置:
配置类:
foo:
1 /** 2 * 自定义foo数据源配置 3 */ 4 @Configuration 5 public class FooDatasourceConfig { 6 /** 7 * 读取配置内容 8 * @return 数据源配置 9 */ 10 @Bean 11 @ConfigurationProperties("foo.datasource") 12 public DataSourceProperties fooDataSourceProperties(){ 13 return new DataSourceProperties(); 14 } 15 16 /** 17 * 创建数据源,交给Spring管理 18 * @return 数据源 19 */ 20 @Bean 21 public DataSource fooDataSource(){ 22 DataSourceProperties dataSourceProperties = fooDataSourceProperties(); 23 return dataSourceProperties.initializeDataSourceBuilder().build(); 24 } 25 26 /** 27 * 该数据源的事务控制 28 * @param fooDataSource 数据源 29 * @return 对应的事务控制,交给Spring管理 30 */ 31 @Bean 32 @Resource 33 public PlatformTransactionManager fooTxManager(DataSource fooDataSource){ 34 return new DataSourceTransactionManager(fooDataSource); 35 } 36 }
barf:
1 /** 2 * 自定义bar数据源 3 * @author Administrator 4 */ 5 @Configuration 6 public class BarDataSourceConfig { 7 /** 8 * 读取配置内容 9 * @return 数据源配置 10 */ 11 @Bean 12 @ConfigurationProperties("bar.datasource") 13 public DataSourceProperties barDataSourceProperties(){ 14 return new DataSourceProperties(); 15 } 16 17 /** 18 * 创建数据源,交给Spring管理 19 * @return 数据源 20 */ 21 @Bean 22 public DataSource barDataSource(){ 23 DataSourceProperties dataSourceProperties = barDataSourceProperties(); 24 return dataSourceProperties.initializeDataSourceBuilder().build(); 25 } 26 27 /** 28 * 该数据源的事务控制 29 * @param barDataSource 数据源 30 * @return 对应的事务控制,交给Spring管理 31 */ 32 @Bean 33 @Resource 34 public PlatformTransactionManager varTxManager(DataSource barDataSource){ 35 return new DataSourceTransactionManager(barDataSource); 36 } 37 }
配置文件:
foo:
datasource:
url: jdbc:...
username: root
password: root
bar:
datasource:
url: jdbc:...
username: root
password: root
二、好用的连接池
1.HikariCP:
特点:快
原因:进行了字节码级别的优化和大量小改进
使用:SpringBoot 2.X 默认使用 HikariCP
配置:spring.datasouece.hikari.* 配置
有哪些配置详见官网:https://github.com/brettwooldridge/HikariCP
SpringBoot1.X 默认使用Tomcat连接池,需要移除 tomcat-jdbc 依赖
配置:spring.datasource.type=com.zaxxer.hikari.HikariDataSource
SpringBoot的HikariCP默认配置:
1 /** 2 * Hikari DataSource configuration. 3 */ 4 @Configuration(proxyBeanMethods = false) 5 @ConditionalOnClass(HikariDataSource.class) 6 @ConditionalOnMissingBean(DataSource.class) 7 @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", 8 matchIfMissing = true) 9 static class Hikari { 10 11 @Bean 12 @ConfigurationProperties(prefix = "spring.datasource.hikari") 13 HikariDataSource dataSource(DataSourceProperties properties) { 14 HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class); 15 if (StringUtils.hasText(properties.getName())) { 16 dataSource.setPoolName(properties.getName()); 17 } 18 return dataSource; 19 } 20 21 }
2.Alibaba Druid:
特点:监控,且不影响性能;防止SQL注入;内置加密配置;多扩展点
使用:
配置:1)直接配置DruidDataSource
2)使用SpringBoot:添加druid-spring-boot-starter依赖
spring.datasource.druid.* 配置
有哪些配置详见官网:https://github.com/alibaba/druid
Druid Filter(druid 的扩展点通过此实现):
用于定制连接池操作的各个环节,继承 FiletereventAdapter 重写各个扩展点的方法实现 Filter ,修改 META-INF/druid-filter.properties 增加 Filter 配置
3.连接池选择是的考量点:
可靠性->性能->功能->可运维性->可扩展性->其他
三、SpringJDBC访问数据库
1)Spring的JDBC操作类(主要集中在 spring-jdbc 包中)
core,JdbcTemplate等相关核心接口和类
datasource,数据源相关的辅助类
object,将基本的JDBC操作封装成对象
support,错误码等其他辅助工具
2)重要注解: @Repository
3)简单操作:
JdbcTemplate类中的方法:query、queryForObject、queryForList、update、execute
4)SQL批处理
JdbcTemplate类中的方法:batchUpdate(传入Sql语句和BatchPreparedStatementSetter类)
NamedParameterJdbcTemplate类中的方法:batchUpdate(传入Sql语句和SqlParameterSourceUtils.createBatch()类)