Spring框架学习笔记03

来源:互联网 发布:软件工程项目有哪些 编辑:程序博客网 时间:2024/05/22 00:55

1.Spring整合JDBC

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

这里写图片描述

(2)spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术.

JDBCTemplate => JDBC模板对象与DBUtils中的QueryRunner非常相似.
@Testpublic 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.propertiesjdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&amp&characterEncoding=utf8jdbc.driverClass=com.mysql.jdbc.Driverjdbc.user=rootjdbc.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.事务特性:acid2.事务并发问题    脏读    不可重复读    幻读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) {

这里写图片描述

原创粉丝点击