spring 中的Jdbctemplate

1,139 阅读3分钟

简介

jdbctemplate就像dbutils的小工具,方便操作数据,可以进行事务管理。jbdctemplate的优势是spring中可以进行注解方式完成事务处理。dbutils就像是外来包。

数据的库的基本操作

  1. 加载驱动类
  2. 通过url、用户名、密码获得connect
  3. 获取state对象,进行sql操作
  4. 如果是update(),返回处理的条目。如果是query() 需要处理resultSet对象获取结果。
    以上是没有采用jdbc工具的时候操作。采用数据库的一些包可以封装数据。

资源池的概念

  1. 资源池是为了管理conncet资源
  2. 用的比较好的数据为c3p0,设置方式可以通过setxxx(),或者配置文件。javax.sql的具有资源池的接口DataSource。jar包可以根据需要自己实现。

jbdcTempate实现修改

添加、修改、删除。都是类似的操作。

        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
        String  sql="insert into Person value(?,?)";
        int i=jdbcTemplate.update(sql,3);
        int i=jdbcTemplate.update(sql,"zhangbin",2);

查询

查询的时候需要提供处理函数。

返回一个对象

        String  sql="select name from Person where id=1";
        String i= jdbcTemplate.queryForObject(sql,String.class);

返回一个自定义对象

<T> T queryForObject(String var1, RowMapper<T> var2)//操作接口
public interface RowMapper<T> {         //处理result的接口
    T mapRow(ResultSet var1, int var2) throws SQLException;
}
以上两个函数是现象自定义对象接口

    //查询操作
       String  sql="select * from Person where id=1";
        Person person= jdbcTemplate.queryForObject(sql, new MapObject());
        
    //具体的接口实现
class  MapObject implements RowMapper<Person> {
    @Override
    public Person mapRow(ResultSet resultSet, int i) throws SQLException {
        Person person =new Person();

        int id=resultSet.getInt("id");
        String  name=resultSet.getString("name");
        person.setId(id);
        person.setName(name);

        return person;
    }
}

返回list

接口的实现部分包含了 int i;与自定义的对象接口相同。

//        String  sql="select *  from  Person ";
//        List<Person>  i=jdbcTemplate.query(sql, new MapObject());

template的ioc

可以将DataSource、jdbcTemplate对象放入ioc的配置文件中。

   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="jdbcUrl" value="jdbc:mysql:///mysql1"> </property>
      <property name="user" value="root"> </property>
      <property name="password" value="123"> </property>
      <property name="driverClass" value="com.mysql.jdbc.Driver"> </property>


   </bean>

   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      <property name="dataSource"  ref="dataSource"/>
   </bean>

事务操作

事务特点

  1. 一致性
  2. 原子性
  3. 隔离性
  4. 永久性


多线程操作特点

  1. 不可重复读
  2. 脏读
  3. 幻读

事务处理隔离

  1. 串行
  2. 读未提交
  3. 重复读复图
  4. 读提交

jdbctempate jar包

在原来的数据包中增加几个包

//jdbcTemplate的操作数据库包
spring-jdbc-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar

//c3p0数据库
c3p0-0.9.2.1.jar
mchange-commons-java-0.2.3.4.jar

约束

约束如下:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd">

xml设置如下

对事务处理的实现,针对不同的底层有不同的实现,对于jbdctempate的底层实现类DataSourceTransactionManager。

    //实现事务管理
    <bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
   </bean>

 //增强事务处理 
   <tx:advice id="txadvice" transaction-manager="transaction">
      <tx:attributes>
         <tx:method name="tran*" propagation="REQUIRED"/>
      </tx:attributes>
   </tx:advice>

//设置切面
   <aop:config>
      <aop:pointcut id="cut1" expression="execution(* com.zhao.day3.service.PersonService.*(..))" />
      <!--<aop:advisor advice-ref="txadvice" pointcut-ref="cut1"/>-->

      <aop:advisor advice-ref="txadvice" pointcut-ref="cut1"/>
      
   </aop:config>

注解方式: