从头学习Spring之二(操作数据之JDBC)

一、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  }
View Code

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

    如果仅仅是查看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  }
View Code

    ②:事务相关(可选):

      PlatformTransactionManager(DataSourceTransactionManager)

1  /**
2   * 事务管理
3   * @return  数据源事务管理实例
4   */
5  @Bean
6  public PlatformTransactionManager transactionManager(){
7      return new DataSourceTransactionManager();
8  }
View Code

      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 }
View Code

            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 }
View Code

              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 }
View Code

            配置文件:

foo:
  datasource:
    url: jdbc:...
    username: root
    password: root

bar:
  datasource:
    url: jdbc:...
    username: root
    password: root
View Code

二、好用的连接池

  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     }
View Code

  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()类)

原文地址:https://www.cnblogs.com/xiao-lin-unit/p/13858158.html