Spring中使用jdbc

  1. 目录

    Spring的数据访问哲学

    配置数据源

    在Spring中使用JDBC

    Spring的数据访问哲学 


Spring的数据访问哲学 

  • Spring的目标之一就是允许我们在开发应用程序时,能够遵循面向对象(OO)原则中的“针对接口编程”。
  • 为了避免持久化的逻辑分散到应用的各个组件中,最好将数据访问的功能放到一个或多个专注于此项任务的组件中。
  • 这样的组件通常称为数据访问对象(data access object,DAO)或Repository
  • 为了避免应用与特定的数据访问策略耦合在一起,编写良好的Repository应该以接口的方式暴露功能。
  • 下图展现了设计数据访问层的合理方式。

服务对象本身并不会处理数据访问,而是将数据访问委托给RepositoryRepository接口确保其与服务对象的松耦合。

Spring 提供了在 Spring 上下文中配置数据源 bean 的多种方式,包括:
  • 通过JDBC驱动程序定义的数据源
  • 通过JNDI查找的数据源
  • 连接池的数据源
  1. Spring应用程序经常部署在java EE应用服务器中,如WebSphereJBossTomcat这样的Web容器中。
  2. 这些服务器允许你配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理。
  3. 另外,在应用服务器中管理的数据源通常以池的方式组织,从而具备更好的性能。

使用JNDI数据源 

 基于JDBC驱动的数据源

    在 Spring 中,通过 JDBC 驱动定义数据源是最简单的配置方式。Spring提供了三个这样的数据源类供选择:
  1. DriverManageDataSource:在每个连接请求时都会返回一个新建的连接,没有进行池化管理。
  2. SimpleDriverDataSource:与DriverManageDataSource的工作方式类似,但是它直接使用JDBC驱动,来解决在特定环境下的类加载问题。
  3. SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。

使用数据源连接池 

 

  1. 相对于持久层框架,JDBC能够让我们在更低的层次上处理数据,我们可以完全控制应用程序如何读取和管理数据。
  2. 但是JDBC也有问题,比如代码臃肿。因为你要负责处理与数据库访问相关的所有事情,其中包含管理数据库资源和处理异常。
  • 上面的代码中存在大量的重复性的代码,这些代码是为了资源管理和处理异常而不得不添加。
  • Spring中把这些为了资源管理和处理异常的重复性代码叫做样板代码。
  • SpringJDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,让我们只需编写从数据库读写数据的必需代码。
Spring 将数据访问的样板代码抽象到模板类之中。 Spring JDBC 提供了二个模板类供选择:
  • JdbcTemplate:最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询。
  • NamedParameterJdbcTemplate:使用该模板类执行查询时可以将值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数。

JDBC模板 

为了让 JdbcTemplate 正常工作,只需要为其设置 DataSource 就可以了,这使得在 Spring 中配置 JdbcTemplate 非常容易,如下所示:

@Bean

public JdbcTemplate jdbcTemplate(DataSource dataSource)

{

  return new JdbcTemplate(dataSource);

}

     在这里,DataSource是通过构造器参数注入进来的。这里所引用的dataSource bean可以是javax.sql.DataSource的任意实现。现在,可以将jdbcTemplate装配到Repository中并使用它来访问数据库。

@Repository

public class JdbcSpitterRepository implements SpitterRepository{

   private JdbcOperations jdbcOperations;

   @Inject

   public JdbcSpitterRepository(JdbcOperations jdbcOperations)

   {

  this.jdbcOperations=jdbcOperations;

   }

}

@Inject 标注的构造、成员字段和方法是可注入的

  • @Repository注解表明它会在组件扫描时自动创建。它的构造器上使用了@Inject注解,因此在创建的时候,会自动获得一个JdbcOperations对象。
  • JdbcOperations是一个接口,定义了JdbcTemplate所实现的操作。
  • 通过注入JdbcOperations,而不是具体的JdbcTemplate,是为了保证JdbcSpitterRepositoryJdbcTemplate保持松耦合。
  • 作为另外一种组件扫描和自动装配的方案,我们可以将JdbcSpitterRepository显式声明为Spring中的bean,如下所示:

@Bean

public SpitterRepository spitterRepository(JdbcTemplate jdbcTemplate) {

   return new JdbcSpitterRepository(jdbcTemplate,dataSource);

}

Repository中具备可用的JdbcTemplate后,可以极大的简化程序:

JdbcTemplate 主要提供以下五类方法:
  1. execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  2. update方法:update方法用于执行新增、修改、删除等语句;
  3. batchUpdate方法:batchUpdate方法用于执行批处理相关语句;
  4. query方法及queryForXXX方法: query方法及queryForXXX方法;
  5. call方法:用于执行存储过程、函数相关语句
execute 方法
说明:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句
用法示例:
jdbcTemplate.execute ("CREATE TABLE USER ( user_id integer, name varchar(100))");
update 方法
int update(final String sql )
其中 sql 参数为需要传入的插入 sql 语句。
说明: update 方法用于执行新增、修改、删除等语句

用法示例:

update 方法
int update(String sql , Object[] args , int[] argTypes )
sql : 预处理 sql 语句; args:sql 需要注入的参数; argTypes : 需要注入的 sql 参数的 JDBC 类型。

用法示例:

p update 方法
int update(String sql , PreparedStatementSetter pss )
sql : 预处理 sql 语句; pss : 用于参数填充;

batchUpdate 方法
1.int [] batchUpdate (final String[] sql )
参数是一个 String 数组,存放多条 sql 语句;返回值是 int 数组,即每条 sql 更新影响的行数。
2.int [] batchUpdate (String sql , final BatchPreparedStatementSetter pss )
参数 sql :一条预处理 sql (如果是批量处理预处理 sql ,那么 sql 的格式就是固定的,只填充参数而已);第二个参数就是回调类

说明:批量执行多条sql

查询 query 方法及 queryForXXX 方法
queryForObject (String sql , Class<T> requiredType )
sql : 预处理 sql requiredType :查询单列结果的类型;
参数 requiredType 只能是 String Integer 这种类型,不能是自定义的实体类型,只能返回一个值,不能映射对象
查询一个值(不需要注入参数)
查询 query 方法及 queryForXXX 方法
queryForObject (String sql , Object[] args , Class<T> requiredType )

说明:查询一个值(使用预处理sql,需要注入参数)

查询 query 方法及 queryForXXX 方法
<T> T queryForObject(String sql, RowMapper<T> rowMapper)
说明:查询单行记录,转换成一个对象(固定 sql ,不需要参数)
用法法例:

查询 query 方法及 queryForXXX 方法
<T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
说明:查询单行记录,转换成一个对象(预处理 sql ,需要注入参数)
用法法例:

1<T> T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper);

2<T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args);

查询 query 方法及 queryForXXX 方法
List<Map<String, Object>> queryForList (String sql )
这个方法封装成 map 放入 list 中, key: 列名, value: 列的值
说明:查询数据库中一列多行数据,即查询数据库中单列数据存入一个 list 中,方式如下:(固定 sql ,没参数)
用法法例:
查询 query 方法及 queryForXXX 方法
<T> List<T> queryForList (String sql , Class<T> elementType )
说明:这个方法就是直接将单类型数据存入 List
注意:这个 T 虽然是泛型,但是只支持 Integer.class String.class 这种单数据类型的,自己定义的 Bean 不支持

 

查询 query 方法及 queryForXXX 方法
<T> List<T> queryForList (String sql , Object[] args , Class<T> elementType )
说明:查询数据库中一列多行数据,即查询数据库中单列数据存入一个 list 中,方式如下:(预处理 sql ,需要注入参数)
注意:这个 T 虽然是泛型,但是只支持 Integer.class String.class 这种单数据类型的,自己定义的 Bean 不支持

 

还有如下方式实现:

1<T> List<T> queryForList(String sql, Object[] args, int[] argTypes, Class<T> elementType);        

2<T> List<T> queryForList(String sql, Class<T> elementType, Object... args)

查询 query 方法及 queryForXXX 方法
<T> List<T> query(String sql , RowMapper <T> rowMapper )
说明:查询多条数据(固定 sql ,没有参数)
注意:每条数据映射为 java 对象,放入List中。
查询 query 方法及 queryForXXX 方法
<T> List<T> query(String sql , PreparedStatementSetter pss , RowMapper <T> rowMapper )
p 说明:查询多条数据(预处理sql,需要传入参数)
RowMapper 回调类还有三种方法:

1<T> List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper)

2<T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)

3<T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逐梦.

你的鼓励是我的最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值