zoukankan      html  css  js  c++  java
  • Spring-Lesson3

    spring整合JDBC

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

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

    JDBCTemplate => JDBC模板对象

    与DBUtils中的QueryRunner非常相似.

    //0 准备连接池
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql:///hibernate_32");
    dataSource.setUser("root");
    dataSource.setPassword("root");
    //1 创建JDBC模板对象
    JdbcTemplate jt = new JdbcTemplate();
    jt.setDataSource(dataSource);
    //2 书写sql,并执行
    String sql = "insert into t_user values(null,'rose') ";
    jt.update(sql);

    步骤

    导包

    4+2---->
    spring-beans-4.2.4.RELEASE.jar
    spring-context-4.2.4.RELEASE.jar
    spring-core-4.2.4.RELEASE.jar
    spring-expression-4.2.4.RELEASE.jar
    com.springsource.org.apache.commons.logging-1.1.1.jar
    com.springsource.org.apache.log4j-1.2.15.jar
    spring-aop---->
    spring-aop-4.2.4.RELEASE.jar
    junit4类库/spring-test---->
    spring-test-4.2.4.RELEASE.jar
    c3p0连接池---->
    com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
    JDBC驱动---->
    mysql-connector-java-5.1.7-bin.jar
    spring-jdbc---->
    spring-jdbc-4.2.4.RELEASE.jar
    spring-tx事务---->
    spring-tx-4.2.4.RELEASE.jar

    书写Dao

    增删改查

    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 {
        @Override
        public void save(User u) {
            String sql = "insert into t_user values(null,?) ";
            super.getJdbcTemplate().update(sql, u.getName());
        }
        @Override
        public void delete(Integer id) {
            String sql = "delete from t_user where id = ? ";
            super.getJdbcTemplate().update(sql,id);
        }
        @Override
        public void update(User u) {
            String sql = "update  t_user set name = ? where id=? ";
            super.getJdbcTemplate().update(sql, u.getName(),u.getId());
        }
        @Override
        public User getById(Integer id) {
            String sql = "select * from t_user where id = ? ";
            return super.getJdbcTemplate().queryForObject(sql,new RowMapper<User>(){
                @Override
                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);
            
        }
        @Override
        public int getTotalCount() {
            String sql = "select count(*) from t_user  ";
            Integer count = super.getJdbcTemplate().queryForObject(sql, Integer.class);
            return count;
        }
    
        @Override
        public List<User> getAll() {
            String sql = "select * from t_user  ";
            List<User> list = super.getJdbcTemplate().query(sql, new RowMapper<User>(){
                @Override
                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;
        }
    }

    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>

    测试

    import java.beans.PropertyVetoException;
    
    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 com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import cn.itcast.bean.User;
    
    //演示JDBC模板
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo {
            @Resource(name="userDao")
        private UserDao ud;
        
        @Test
        public void fun1() throws Exception{
            
            //0 准备连接池
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql:///hibernate_32");
            dataSource.setUser("root");
            dataSource.setPassword("root");
            //1 创建JDBC模板对象
            JdbcTemplate jt = new JdbcTemplate();
            jt.setDataSource(dataSource);
            //2 书写sql,并执行
            String sql = "insert into t_user values(null,'rose') ";
            jt.update(sql);
            
        }
        
        @Test
        public void fun2() throws Exception{
            User u = new User();
            u.setName("tom");
            ud.save(u);
        }
        @Test
        public void fun3() throws Exception{
            User u = new User();
            u.setId(2);
            u.setName("jack");
            ud.update(u);
            
        }
        
        @Test
        public void fun4() throws Exception{
            ud.delete(2);
        }
        
        @Test
        public void fun5() throws Exception{
            System.out.println(ud.getTotalCount());
        }
        
        @Test
        public void fun6() throws Exception{
            System.out.println(ud.getById(1));
        }
        
        @Test
        public void fun7() throws Exception{
            System.out.println(ud.getAll());
        }
        
    }

    spring中aop事务

    事务

    事务特性:acid

    原子性(Atomicity)
    一致性(Consistency)
    隔离性(Isolation)
    持久性(Durability)

    事务并发问题

    脏读
    不可重复读
    幻读

    事务的隔离级别

    1 读未提交
    2 读已提交
    4 可重复读
    8 串行化

    spring封装了事务管理代码

    事务操作
    打开事务
    提交事务/回滚事务

    事务操作对象

    因为在不同平台,操作事务的代码各不相同.spring提供了一个接口

    PlatformTransactionManager 接口
    DataSourceTransactionManager
    HibernateTransitionmanager

    注意:在spring中玩事务管理.最为核心的对象就是TransactionManager对象

    spring管理事务的属性介绍

    事务的隔离级别

    1 读未提交
    2 读已提交
    4 可重复读
    8 串行化

    是否只读

    true 只读
    false 可操作

    事务的传播行为

    spring管理事务方式

    编码式

    1.将核心事务管理器配置到spring容器

    <!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
        <property name="dataSource" ref="dataSource" ></property>
    </bean>

    2.配置TransactionTemplate模板

    <!-- 事务模板对象 -->
    <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" >
        <property name="transactionManager" ref="transactionManager" ></property>
    </bean>

    3.将事务模板注入Service

    <bean name="accountService" class="cn.itcast.service.AccountServiceImpl" >
        <property name="ad" ref="accountDao" ></property>
        <property name="tt" ref="transactionTemplate" ></property>
    </bean>  

    4.在Service中调用模板

    @Override
    public void transfer(final Integer from,final Integer to,final Double money) {
                //减钱
                ad.decreaseMoney(from, money);
    //                int i = 1/0;
                //加钱
                ad.increaseMoney(to, money);
    }

    xml配置(aop)

    1.导包

    com.springsource.org.aopalliance-1.0.0.jar
    spring-aspects-4.2.4.RELEASE.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    2.导入新的约束(tx)

    beans: 最基本
    context:读取properties配置
    aop:配置aop
    tx:配置事务通知

    3.配置通知

    <!-- 配置事务通知 -->
    <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>

    4.配置将通知织入目标

    <!-- 配置织入 -->
    <aop:config  >
        <!-- 配置切点表达式 -->
        <aop:pointcut expression="execution(* cn.itcast.service.*ServiceImpl.*(..))" id="txPc"/>
        <!-- 配置切面 : 通知+切点
                 advice-ref:通知的名称
                 pointcut-ref:切点的名称
         -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
    </aop:config>

    注解配置(aop)

    3.开启注解管理事务

    <!-- 开启使用注解管理aop事务  这个配置替代了上面的配置通知,和将通知织入目标的操作 只要去代码中用注解操作即可  -->
    <tx:annotation-driven/>

     4.使用注解

    @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
    public class AccountServiceImpl implements AccountService {
    
        private AccountDao ad ;
        private TransactionTemplate tt;
        
        @Override
        @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
        public void transfer(final Integer from,final Integer to,final Double money) {
                    //减钱
                    ad.decreaseMoney(from, money);
    //                int i = 1/0;
                    //加钱
                    ad.increaseMoney(to, money);
        }
    
        public void setAd(AccountDao ad) {
            this.ad = ad;
        }
    
        public void setTt(TransactionTemplate tt) {
            this.tt = tt;
        }
    }

     

    击石乃有火,不击元无烟!!
  • 相关阅读:
    阿里DatatX mysql8往 Elasticsearch 7 插入时间数据 时区引发的问题
    通俗易懂 k8s (3):kubernetes 服务的注册与发现
    ReplicaSet 和 ReplicationController 的区别
    使用Go module导入本地包
    k8s之statefulset控制器
    终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
    Atitit drmmr outline org stat vb u33.docx Atitit drmmr outline org stat v0 taf.docx Atitit drmmr out
    Atitit all diary index va u33 #alldiary.docx Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary deta
    Atitit path query 路径查询语言 数据检索语言 目录 1.1. List map >> spel 1 1.2. Html数据 》》Css选择符 1 1.3. Json 》map》
    Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  • 原文地址:https://www.cnblogs.com/rain2020/p/12897195.html
Copyright © 2011-2022 走看看