Spring:声明式事务管理和JDBCTemplate

<?xml version="1.0" encoding="UTF-8"?>
<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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">


    <!-- 自动扫描与装配bean -->
    <context:component-scan base-package="cn.itcast.spring.p_jdbc"></context:component-scan>


    <!-- 加载外部的配置文件 -->
    <context:property-placeholder location="classpath:cn/itcast/spring/p_jdbc/jdbc.properties"/>


    <!-- 一、配置数据库连接池 ComboPooledDataSource -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 基本的连接信息 -->
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
        <property name="driverClass" value="${driverClass}"></property>
        <property name="user" value="${username}"></property>
        <property name="password" value="${password}"></property>
        <!-- 一些管理的配置 -->
        <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize" value="3"></property>
        <!--连接池中保留的最小连接数。Default: 3 -->
        <property name="minPoolSize" value="3"></property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize" value="5"></property>
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement" value="3"></property>
        <!--最大空闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime" value="1800"></property>
    </bean>
    
    
    
    <!-- 二、配置JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
     </bean>
     
     
     
     <!-- 三、配置声明式事务管理 -->
     
     
     <!-- 声明“事务管理器” -->
     <bean id="dsTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"></property>
     </bean>
     
     <!-- ==== 基于注解的方式配置事务 ==== -->
     <tx:annotation-driven transaction-manager="dsTransactionManager"/>
     
     
     
     <!-- ==== 基于XML的方式配置事务 ==== -->

    <!-- 声明“通知”:
        对于以save或update或delete开头的方法,使用正常的事务,其他的方法都使用只读的事务
        read-only:表示事务是否是只读的,默认为false。
     <tx:advice id="transactionManager" transaction-manager="dsTransactionManager">
         <tx:attributes>
             <tx:method name="save*" read-only="false"/>
             <tx:method name="update*"/>
             <tx:method name="delete*"/>
             <tx:method name="*" read-only="true"/>
         </tx:attributes>
     </tx:advice>
    -->
     <!-- 声明“切面”
     <aop:config>
         <aop:advisor advice-ref="transactionManager" pointcut="execution(* cn.itcast.spring.p_jdbc.*Dao.*(..))"/>
     </aop:config>
     -->

</beans>



@Repository
@Transactional(readOnly = true)
public class UserDao {

    @Resource
    private JdbcTemplate jdbcTemplate;

    /**
     * 保存
     *
     * @param user
     */
    @Transactional(readOnly = false)
    public void save(final User user) {
        // jdbcTemplate.execute(new ConnectionCallback() {
        // public Object doInConnection(Connection conn) throws SQLException, DataAccessException {
        // String sql = "insert into t_user(name, age) values (?, ?)";
        // PreparedStatement ps = conn.prepareStatement(sql);
        // ps.setString(1, user.getName()); // 第1个参数的索引是1
        // ps.setInt(2, user.getAge());
        // ps.execute();
        // ps.close();
        // return null;
        // }
        // });

        String sql = "insert into t_user(name, age) values (?, ?)";
        jdbcTemplate.update(sql, new Object[] { user.getName(), user.getAge() });

        delete(1);
    }

    /**
     * 删除
     *
     * @param id
     */
    public void delete(Integer id) {
        String sql = "delete from t_user where id=?";
        jdbcTemplate.update(sql, new Object[] { id });
    }

    /**
     * 更新
     *
     * @param user
     */
    public void update(User user) {
        String sql = "update t_user set name=?, age=? where id=?";
        jdbcTemplate.update(sql, new Object[] { user.getName(), user.getAge(), user.getId() });
    }

    /**
     * 根据id查询一个数据
     *
     * @param id
     * @return
     */
    public User getById(final Integer id) {
        String sql = "select name,age from t_user where id=?";
        return (User) jdbcTemplate.queryForObject(sql, new Object[] { id }, new RowMapper() {
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                String name = rs.getString(1);
                int age = rs.getInt(2);
                return new User(id, name, age);
            }
        });
    }

    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void testGet(int id) {
        User user = getById(id);
        System.out.println(user);

        user = getById(id);
        System.out.println(user);
    }

    /**
     * 查询总数量
     *
     * @return
     */
    public int getCount() {
        String sql = "select count(*) from t_user";
        return jdbcTemplate.queryForInt(sql);
    }

    /**
     * 查询所有
     *
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<User> findAll() {
        String sql = "select id,name,age from t_user";
        return jdbcTemplate.query(sql, new RowMapper() {
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                int id = rs.getInt(1);
                String name = rs.getString(2);
                int age = rs.getInt(3);
                return new User(id, name, age);
            }
        });
    }

    /**
     * 查询所有(分页)
     *
     * @param firstResult
     * @param maxResult
     * @return
     */
    public QueryResult findAll(int firstResult, int maxResult) {
        int count = jdbcTemplate.queryForInt("select count(*) from t_user");
        List list = jdbcTemplate.query(//
                "select id,name,age from t_user limit ?,?", //
                new Object[] { firstResult, maxResult }, //
                new RowMapper() {
                    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                        int id = rs.getInt(1);
                        String name = rs.getString(2);
                        int age = rs.getInt(3);
                        return new User(id, name, age);
                    }
                });
        return new QueryResult(count, list);
    }
}

public class QueryResult {
    private int count;
    private List list;

    public QueryResult(int count, List list) {
        this.count = count;
        this.list = list;
    }
。。。
}


你可能感兴趣的:(Spring:声明式事务管理和JDBCTemplate)