Spring-JDBC

4 篇文章 0 订阅
1 篇文章 0 订阅

Spring-JDBC
数据库是个大话题,我们来好好理一下。就拿连mysql为例。

JDBC

用java连接数据库,大多数人都知道JDBC,这是对java连接各种数据库的驱动的统称。Mysql用的是MySQL-jdbc,是jdbc的成员之一。

JDBC的连接方式是比较原始的,一般是指定驱动,获取连接,用这个连接创建查询语句,进行查询,关闭连接 这样几个步骤。网上例子一搜一大把,我就不写了。
http://www.cnblogs.com/newcaoguo/p/5801134.html

JDBC里的sql默认是自动提交的,即每次执行的查询都是立马查询,如果需要事务处理则要代码中显示的声明事务的开启和提交。

DataSource

因为jdbc各种数据库连接方式有些混乱,在更换数据库的时候代码修改痛苦。所以Sun公司提出了DataSource这样一个统一的数据接口。注意这是个接口,他适用于各种数据库的源。比较有名的两个实现是dbcp2的BasicDataSource和c3p0的ComboPooledDataSource,他们对原生的jdbc实现了封装,实现了连接池的功能,减少了连接代价。当然他们的功能不止于此,还可以设置连接的各种属性。

一般的步骤就是新建DataSource对应的接口类,然后设置连接信息属性;dataSource. getConnection获取一个连接,然后后面的和jdbc获取连接后的类似。

Spring-JDBC

有了spring我们可以将DataSource这个接口类定义成bean来使用,显然方便多了。但是对于连接获取和释放,仍然是烦人的代码重复。所以spring针对这类问题,为我们提供了更好的解决方案:JdbcTemplate类,这是spring框架中的一个类。他完成了对DataSource的封装,内部通过aop已经帮我们封装好了数据库的连接和释放的操作。
以c3p0为例,我们只需要这样配置JdbcTemplate:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
      p:driverClass="com.mysql.jdbc.Driver"
      p:jdbcUrl="jdbc:mysql://localhost/smart"
      p:user="root"
      p:password=""/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

将此jdbctemplate注入到dao类中,即可用其进行数据库操作,且不用写数据库连接,释放的代码。直接进行查询即可。JdbcTemplate有query、updata、execute等方法的封装,这里不详细介绍,用到的去查一下即可操作非常简单。

JdbcTemplate的注意事项是,在进行查询的时候,仍然是和Jdbc一样自动提交的,而对于每次查询都会开启连接并在执行完这一句查询后立马释放连接,所以如果代码中连续的查询操作,其实是多次连接和多次释放进行查询的,并不是一次连接。
例如:

jdbcTemplate.query("select * from t_user where user_id=?",new Object[]{1},
new RowCallbackHandler() {
    public void processRow(ResultSet resultSet) throws SQLException {
        System.out.println(resultSet.getInt("password"));
    }
}
);
jdbcTemplate.query("select * from t_user where user_id=?",new Object[]{2},
        new RowCallbackHandler() {
            public void processRow(ResultSet resultSet) throws SQLException {
                System.out.println(resultSet.getInt("password"));
            }
        }
);

这里有两句query语句,从日志中看到:
2次连接
第一次查询完成后,立即释放了连接,第二次重新获取连接,这会带来效率问题。这种情况下,将执行部分放到事务中,则可以放到一个连接中:
1次连接

Spring-JDBC事务处理

事务可以通过template这个类开启,即编程语言中开启事务。类似于原生jdbc的事务开启,也可以通过配置文件进行显示的事务开启,又叫声明式事务处理。前者就不说了很简单,后者则是非常重要的,也是spring用途最广的功能(没有之一)。
在配置文件中添加aop/tx的命名空间然后追加事务管理器这个bean

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/>
<aop:config>
    <aop:pointcut id="serviceMethod" expression="(execution(* top.microfrank.dao.*(..)))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

Aop中指定对哪些方法(产生事务)生效,tx中指定事务管理器和进一步的方法名过滤。
更简单的配置:

<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/>
<context:component-scan base-package="top.microfrank.dao"/>
<tx:annotation-driven transaction-manager="transactionManager"/>

这三行代替上面的,需要在对应的方法上面加@Transaction注解。

小结:本文简要讲了原生jdbc和c3p0等连接池进行数据库查询的步骤,并分析了其中的不足,引出了简化版的JdbcTemplate,分析原理后,发现多查询中仍有的不足,通过事务的方式可以解决。顺带引出了一个重要的话题:声明式事务处理,并简要讲述了配置方式。
于是学会了spring-jdbc的用法,虽然配置写起来略显麻烦,但是会加快之后的开发进度,且自动连接和释放,以及声明式事务处理,会更大程度上避免程序出现问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值