SpringBoot之数据访问操作

SpringBoot连接池DataSource定义

Boot提供了默认内置集成的DataSource,也可以使用外部的。

1.spring.datasource默认连接池

  • 默认内集成DataSource对象(默认,id名dataSource)

    开发只需要添加下面连接池jar包引入,Boot可以自动创建出DataSource连接池对象。

    <!-- tomcat连接池和jdbc支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- 驱动包 -->
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.3</version>
    </dependency>
    
    • 内部会优先采用tomcat-jdbc连接池;
    • 然后找HikariCP连接池;
    • 最后找dbcp、dbcp2连接池;
    • 在application.properties配置文件定义连接池参数约定如下

      spring.datasource.username=xxx
      spring.datasource.password=xxx
      spring.datasource.url=xxx
      #spring.datasource.driver-class-name=xxx
      spring.datasource.type=xxx
      
    • 追加spring-boot-starter-jdbc.jar内部会依赖导入tomcat-jdbc功能。

    • 如果追加了dbcp连接池,默认还是找tomcat-jdbc,想要改变可以设置spring.datasource.type=包名.类名

2.使用外部连接池

连接池种类很多,常用的有dbcp2、c3p0、druid、proxool等

  1. 创建c3p0连接池

    • 导入c3p0连接池jar引入

      <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
      </dependency>
      
    • 在application.properties定义c3p0连接池参数

      spring.datasource.c3p0.user=ZXH
      spring.datasource.c3p0.password=123
      spring.datasource.c3p0.jdbcUrl=jdbc:oracle:thin:@localhost:1521/XE
      spring.datasource.c3p0.driverClass=oracle.jdbc.OracleDriver
      
    • 在入口类子包创建C3p0DataSourceConfig.java

      @Configuration//支持@Bean,内部带有@Component
      public class C3p0DataSourceConfig {
      
          @Bean(name="c3p0")//将返回的dataSource添加到Spring容器
          @ConfigurationProperties(prefix="spring.datasource.c3p0")
          public DataSource createC3p0(){
      //      ComboPooledDataSource ds = new ComboPooledDataSource();
              DataSource ds = DataSourceBuilder.create()
                  .type(ComboPooledDataSource.class)
                  .build();
              return ds;
          }
      
      }
      
    • 测试类

      @RunWith(SpringRunner.class)
      @SpringBootTest(classes={BootApplication.class})
      public class TestDataSource {
      
          @Resource(name="c3p0")
          private DataSource ds;
      
          @Test
          public void test1(){
              System.out.println(ds);
          }
      
      }
      
      1. druid

      提供监控功能。

      • 导入druid连接池jar引入

        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.0.18</version>
        </dependency>
        
      • 在application.properties定义druid连接池参数

        spring.datasource.druid.username=ZXH
        spring.datasource.druid.password=123
        spring.datasource.druid.url=jdbc:oracle:thin:@localhost:1521/XE
        spring.datasource.druid.driverClassName=oracle.jdbc.OracleDriver
        
      • 在入口类子包创建DruidDataSourceConfig.java

        @Configuration
        public class DruidDataSourceConfig {
        
            @Bean(name="druid")
            @Primary//将当前连接池作为默认的
            @ConfigurationProperties(prefix="spring.datasource.druid")
            public DataSource createDruid(){
                DataSource ds = DataSourceBuilder.create()
                    .type(DruidDataSource.class).build();
                return ds;
            }
        
        }
        
      • 测试类

        @RunWith(SpringRunner.class)
        @SpringBootTest(classes={BootApplication.class})
        public class TestDataSource {
        
            @Resource//默认注入带@Primay的连接池
        //  @Autowired
        //  @Qualifier("druid")
            private DataSource ds;
        
            @Test
            public void test1(){
                System.out.println(ds);
            }
        
        }
        
  2. 多个连接池应用问题

    • @Primary

    当程序中存在多个DataSource对象时,会出现注入冲突,此时可以将一个连接池设置为@Primary,意思是不指定名称时,会默认注入带有@Primary的连接池。

    • spring.datasource默认连接池无效

    程序中创建DataSource连接池对象后,默认tomcat连接池无效,如果需要使用可以显式创建,方法如下

    @Configuration
    public class DefaultDataSourceConfig {
    
        @Bean(name="dataSource")
        public DataSource createDefault(){
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name="dbcp")
        public DataSource createDbcp(){
            return DataSourceBuilder.create()
                .type(BasicDataSource.class).build();
        }
    
    }
    

SpringBoot应用JdbcTemplate

  1. 根据表编写实体类

    实体类属性名和表字段名保持一致。

    public class Evaluation implements Serializable{
        private Integer  id;                           
        private Integer  user_id;               
        private Integer  product_id;                     
        private Integer  order_id;                    
        private String  title;   
        //省略其他setter和getter方法
    }
    
  2. 编写DAO接口和实现类

    DAO接口:

    public interface EvaluationDao {
        public List<Evaluation> findAll();
    }
    

    DAO实现类:使用JdbcTemplate实现数据库增删改查;JdbcTemplate对象自动配置会自动创建

    @Repository("evalDao")
    public class JdbcEvaluationDao implements EvaluationDao{
    
        @Resource
        private JdbcTemplate template;
    
        public List<Evaluation> findAll() {
            String sql = "select * from xdl_product_evaluation";
            List<Evaluation> list = template.query(
                sql, new BeanPropertyRowMapper<Evaluation>(Evaluation.class));
            return list;
        }
    
    }
    
  3. 如何为JdbcTemplate指定连接池?

    解决方法:注入需要的DataSource,自己创建JdbcTemplate对象

    @Configuration
    public class JdbcTemplateConfig {
    
        @Bean(name="c3p0Template")
        @Autowired
        public JdbcTemplate createJdbcTemplate1(
            @Qualifier("c3p0")DataSource ds){
            JdbcTemplate template = 
                    new JdbcTemplate(ds);
            return template;        
        }
    
        @Bean(name="druidTemplate")
        @Primary
        @Autowired
        public JdbcTemplate createJdbcTemplate2(
            @Qualifier("druid")DataSource ds){
            JdbcTemplate template = 
                    new JdbcTemplate(ds);
            return template;        
        }
    
    }
    

    注意:多数据源注入采用@Autowired和@Qualifier(“id名”),使用@Resource(name=”id”)有时无法区分。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值