• 从头学习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()类)

  • 相关阅读:
    OC方法交换swizzle详细介绍——不再有盲点
    集合深浅拷贝以及经常遇到的坑(面试常问)
    网络安全——一图看懂HTTPS建立过程
    NSTimer定时器进阶——详细介绍,循环引用分析与解决
    NSRunLoop原理详解——不再有盲点
    灵活、可高度自定义的——Progress进度圈、弹窗、加载进度、小菊花
    swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
    swift学习笔记4——扩展、协议
    swift学习笔记3——类、结构体、枚举
    个推推送处理
  • 原文地址:https://www.cnblogs.com/xiao-lin-unit/p/13858158.html
Copyright © 2020-2023  润新知