Spring框架学习笔记03

1.Spring整合JDBC

(1)spring提供了很多模板整合Dao技术

这里写图片描述

(2)spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术.
JDBCTemplate => JDBC模板对象
与DBUtils中的QueryRunner非常相似.
@Test
public void fun1() throws Exception{
    //0.准备连接池
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8");
    dataSource.setUser("root");
    dataSource.setPassword("root");
    //1.创建jdbc模板对象
    JdbcTemplate jt = new JdbcTemplate(dataSource);
    //2.写sql
    String sql = "insert into t_user values(null,'王小二')";
    jt.update(sql);
}
(3)步骤
1.导包

这里写图片描述
2.准备数据库
这里写图片描述
3.书写DAO

package cn.itcast.a_jdbctemplete;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import cn.itcast.bean.User;

//使用Jdbc模板实现增删改查
public class UserDaoImpl extends JdbcDaoSupport implements UserDao{

    //增加
    public void save(User user) {
        String sql = "insert into t_user values(null,?)";
        super.getJdbcTemplate().update(sql, user.getName());
    }

    //删除
    public void delete(Integer id) {
        String sql = "delete from t_user where id=?";
        super.getJdbcTemplate().update(sql, id);
    }

    //修改
    public void update(User user) {
        String sql = "update t_user set name=? where id=?";
        super.getJdbcTemplate().update(sql,user.getName(),user.getId());
    }

    //根据用户Id进行查询
    public User getById(Integer id) {
        String sql = "select * from t_user where id=?";
        return super.getJdbcTemplate().queryForObject(sql, new RowMapper<User>(){

            public User mapRow(ResultSet rs, int arg1) throws SQLException {
                User u = new User();
                u.setId(rs.getInt("id"));
                u.setName(rs.getString("name"));
                return u;
            }

        }, id);
    }

    //查询用户总数量
    public int getTotal() {
        String sql = "select count(*) from t_user";
        Integer count = super.getJdbcTemplate().queryForObject(sql, Integer.class);
        return count;
    }

    //查询用户集合
    public List<User> getAll() {
        String sql = "select * from t_user";
        List<User> list = super.getJdbcTemplate().query(sql, new RowMapper<User>(){

            public User mapRow(ResultSet rs, int arg1) throws SQLException {
                User u = new User();
                u.setId(rs.getInt("id"));
                u.setName(rs.getString("name"));
                return u;
            }

        });
        return list;
    }

}
4.spring配置
依赖关系

这里写图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">

<!-- 指定spring读取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties"  />

<!-- 1.将连接池放入spring容器 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
    <property name="driverClass" value="${jdbc.driverClass}" ></property>
    <property name="user" value="${jdbc.user}" ></property>
    <property name="password" value="${jdbc.password}" ></property>
</bean>


<!-- 2.将JDBCTemplate放入spring容器 -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
    <property name="dataSource" ref="dataSource" ></property>
</bean>

<!-- 3.将UserDao放入spring容器 -->
<bean name="userDao" class="cn.itcast.a_jdbctemplate.UserDaoImpl" >
    <!-- <property name="jt" ref="jdbcTemplate" ></property> -->
    <property name="dataSource" ref="dataSource" ></property>
</bean>

</beans>
5.测试
package cn.itcast.a_jdbctemplete;

import java.util.List;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.itcast.bean.User;

import com.mchange.v2.c3p0.ComboPooledDataSource;

//演示jdbc模板
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo {

    @Resource(name="userDao")
    private UserDao ud;

    @Test
    public void fun2(){
        User user = new User(null, "李斯");
        ud.save(user);
    }

    @Test
    public void fun3(){
        User user = new User();
        user.setId(12);
        user.setName("黄老九");
        ud.update(user);
    }

    @Test
    public void fun4(){
        ud.delete(10);
    }

    @Test
    public void fun5(){
        User user = ud.getById(6);
        System.out.println(user);
    }

    @Test
    public void fun6(){
        int count = ud.getTotal();
        System.out.println(count);
    }

    @Test
    public void fun7(){
        List<User> list = ud.getAll();
        for (User user : list) {
            System.out.println(user);
        }
    }
}
(4)进阶内容
1.JDBCDaoSupport
public class UserDaoImpl extends JdbcDaoSupport implements UserDao{}

这里写图片描述

<!-- 3.将userDao放入spring容器管理 -->
<bean name="userDao" class="cn.itcast.a_jdbctemplete.UserDaoImpl">
    <!-- <property name="jt" ref="jdbcTemplete"></property> -->
    <property name="dataSource" ref="dataSource"></property>
</bean>
2.读取外部的Properties配置
#注意加前缀db.properties
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&amp&characterEncoding=utf8
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
<!-- 指定spring读取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties"  />

<!-- 1.将连接池放入spring容器 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
    <property name="driverClass" value="${jdbc.driverClass}" ></property>
    <property name="user" value="${jdbc.user}" ></property>
    <property name="password" value="${jdbc.password}" ></property>
</bean>

2.Spring中AOP事务

(1)事务
1.事务特性:acid
2.事务并发问题
    脏读
    不可重复读
    幻读
3.事务的隔离级别
    1:读未提交
    2:读已提交
    4:可重复读
    8:串行化
(2)spring封装了事务管理代码
1.事务操作
    打开事务
    提交事务
    回滚事务
2.事务操作对象
  a>因为在不同平台,操作事务的代码各不相同.spring提供了一个接口
  b>PlatformTransactionManager 接口
      DataSourceTransactionManager
      HibernateTransitionmanager
      注意:在spring中玩事务管理.最为核心的对象就是TransactionManager对象
  c>spring管理事务的属性介绍
      事务的隔离级别
        1:读未提交
        2:读已提交
        4:可重复读
        8:串行化
      是否只读
        true 只读
        false 可操作
      事务的传播行为

这里写图片描述

(3)spring管理事务方式
1.编码式
    a.将核心事务管理器配置到spring容器
<!-- 事务核心管理器,封装了所有事务操作,依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
    b.配置TransactionTemplate模板
<!-- 事务模板对象 -->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
</bean>
    c.将事务模板注入Service
<!-- 3.service -->
<!-- 将事务模板对象注入到service中 -->
<bean name="accountService" class="cn.itcast.dao.AccountServiceImpl">
    <property name="accountDao" ref="accountDao"></property>
    <property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
    d.在Service中调用模板
    public void transfer(Integer from,Integer to,Double money) {

            //减钱
            accountDao.descreaseMoney(from, money);

            //int a = 1/0;

            //加钱
            accountDao.increaseMoney(to, money);
        }
2.xml配置(aop)
  a.导包
  b.导入新的约束(tx)
    beans: 最基本
    context:读取properties配置
    aop:配置aop
    tx:配置事务通知
  c.配置通知
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!--以方法为 单位,指定方法应用什么事务属性 
            isolation:隔离级别
            propagation:传播行为
            read-only:是否只读
         -->
         <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
         <tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
         <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
         <tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
         <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
         <tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
         <tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
         <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
        <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
    </tx:attributes>
</tx:advice>
  d.配置将通知织入目标
<!-- 配置织入 -->
<aop:config>
    <!-- 配置切点表达式 -->
    <aop:pointcut expression="execution(* cn.itcast.dao.*ServiceImpl.*(..))" id="txpc"/>
    <!-- 配置切面
         通知advice-ref  +  切点pointcut-ref -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txpc"/>
</aop:config>
3.注解配置(aop)
 a.导包
 b.导入新的约束(tx)
 c.开启注解管理事务
<!-- 开启使用注解管理事务 -->
<tx:annotation-driven/>
 d.使用注解
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public class AccountServiceImpl implements AccountService{
    @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
    public void transfer(Integer from,Integer to,Double money) {

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值