Spring 持久化数据

Spring的持久化数据 spring中持久化数据的方式很多,本文主要介绍几种配置datasource的方法,以及如何通过spring内置的jdbc模板实现数据的持久化 TOP

配置数据源:

通过JDBC驱动程序定义的数据源;
通过JNDI查找的数据源;
连接池的数据源;

  • JNDI:
    这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。另外,在应用服务器中管理的数据源通常以池的方式组织,从而具备更好的性能,并且还支持系统管理员对其进行热切换 通过装配 ```
- 连接池:<br>
开源库:Apache Commons DBCP、c3p0、BoneCP

<bean id=”database” class=”xxx.dbcp.BasicDataSource” p:driverClassName=”xx” …>

- 基于JDBC驱动的数据源:<br>
spring提供了3个数据源类
DriverManagerDataSource(在每个连接请求时都会返回一个新建的连接)、SimpleDriverDataSource、SingleConnectionDataSource(在每个连接请求时都会返回同一个的连接)

<bean id=”dataSource” calss=”xxx.DriverManagerDataSource” p:dirverClassName=”xx” …>

- 使用嵌入式的数据源:<br>
优势(在每次启动服务时,都能重新填充数据)
<jdbc:embedded-database id="dataSourceEm" type="H2">
    <jdbc:script location="schema.sql"/>
</jdbc:embedded-database> ``` - 通过profile选择数据源<br> 只要在配置bean前,添加<beans profile="dev">即可

在spring中使用jdbc

平时在使用jdbc最容易出现的问题:1.代码混乱且很多冗余;2.异常情况无法处理; 解决方法:使用jdbc模板

  • 使用jdbc模板
    Spring为JDBC提供了三个模板类供选择
    JdbcTemplate(被废弃):最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询
    NamedParameterJdbcTemplate:使用该模板类执行查询时可以将值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数
    SimpleJdbcTemplate:该模板类利用Java 5的一些特性如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource datasource){
      return new JdbcTemplate(datasource);
    }
    

    如果通过jdbcTemplate查找数据,则需要将结果映射到对象中

    return jdbc.queryForObject(select_by_id, new SpitterRowMapper(), id);
    private static final class SpitterRowMapper implements RowMapper<Spitter>{
      public Spiter mapRow(ResultSet rs, int rowNum){
          return new Spitter(rs.getLong("id"), ....)
      }
    }
    其中queryForObject有三个参数
    String对象,包含了要从数据库中查找数据的SQL
    RowMapper对象,用来从ResultSet中提取数据并构建域对象
    可变参数列表,列出了要绑定到查询上的索引参数值
    对于查询返回的每一行数据,JdbcTemplate将会调用RowMapper的mapRow()方法,并传入一个ResultSet和包含行号的整数。在SpitterRowMapper的mapRow()方法中,我们创建了Spitter对象并将ResultSet中的值填充进去
    还可以通过方法引用、匿名函数的方法处理queryForObject
    
  • 使用命名参数
    以往插入数据时可能是这样
    jdbc.update("insert into xx (a,b) values (?,?)", s.getxx(), s.getxx())
    

    这样可能会导致如果参数顺序有变化,那么还需要修改从参数值的顺序
    通过命名参数可以避免这种问题

    jdbc.update("insert into xx (id,name) values (:id, :name)", new HashMap(){put("name", s.getName());})
    并且要将模板类改为NamedParameterJdbcTemplate