Spring第三天主要 讲解spring整合JDBC操作

来源:互联网 发布:护手霜 知乎 编辑:程序博客网 时间:2024/06/06 02:05

一、spring 整合JDBC

前言:spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术。
JDBCTemplate jdbc模版 该对象与JDBCUtils 中的QueryRunner十分相似
2.导包:
1)导包4+2
spring-test
spring-aop
spring-jdbc
spring-tx
junit4类库
c3p0连接池jdbc驱动
spring-test
2)主配置文件

            <!-- 将连接池交给spring容器管理 -->                    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">                        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"></property>                        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>                        <property name="user" value="root"></property>                        <property name="password" value="wdl03707552882"></property>                    </bean>                    <!-- 将JDBCTemplate交给spring容器进行管理 -->                    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">                        <property name="dataSource" ref="dataSource"></property>                    </bean>                    <!-- 将userDao放入spring容器 -->                    <bean name="userDao" class="com.spring.test.daoimpl.UserDao">                        <property name="jt" ref="jdbcTemplate"></property>                    </bean>
3)准备数据库测试
    @RunWith(SpringJUnit4ClassRunner.class)            @ContextConfiguration("classpath:applicationContext.xml")            public class Demo {                @Resource(name = "userDao")                private UserDao ud;                @Test                public void fun1() throws PropertyVetoException {                    User u = new User();                    u.setId(2);                    u.setName("weidianlun");                    ud.update(u);                }            }
3)准备jdbc实现增删改查
public class UserDao implements com.spring.test.dao.UserDao {                    private JdbcTemplate jt;                    public void setJt(JdbcTemplate jt) {                        this.jt = jt;                    }                    @Override                    public void save(User c) {                        // TODO Auto-generated method stub                        String sql = "insert into t_user value(null,?)";                        jt.update(sql, c.getName());                    }                    @Override                    public void delete(Integer id) {                        // TODO Auto-generated method stub                        String sql = "delete from t_user where id=?";                        jt.update(sql, id);                    }                    @Override                    public User getById(Integer id) {                        // TODO Auto-generated method stub                        String sql = "select * from t_user where id=?";                        return jt.queryForObject(sql, new RowMapper<User>() {                            @Override                            public User mapRow(ResultSet rs, int arg1) throws SQLException {                                // TODO Auto-generated method stub                                User u = new User();                                u.setId(rs.getInt("id"));                                u.setName(rs.getString("name"));                                return u;                            }                        }, id);                    }                    @Override                    public void update(User u) {                        // TODO Auto-generated method stub                        String sql = "update t_user set name=? where id=?";                        jt.update(sql, u.getName(), u.getId());                    }                    @Override                    public int getTotalCount() {                        // TODO Auto-generated method stub                        String sql = "select count(*) from t_user";                        Integer count = jt.queryForObject(sql, Integer.class);                        return count;                    }                    @Override                    public List<User> getAll() {                        // TODO Auto-generated method stub                        String sql = "select * from t_user";                        List<User> list = jt.query(sql, new RowMapper<User>() {                            @Override                            public User mapRow(ResultSet arg0, int arg1) throws SQLException {                                // TODO Auto-generated method stub                                User u = new User();                                u.setId(arg0.getInt("id"));                                u.setName(arg0.getString("name"));                                return u;                            }                        });                        return list;                    }                }
扩展知识点。如果我们用该类继承了JdbcDaoSupport类。 那么我们就不用再该类下书写          public class UserDao extends JdbcDaoSupport implements UserDao              private  JdbcTemeplate  jt;        settTemplate(){        }
在配置文件中也不用讲JdbcTemplate注入到该类的bean的属性中。    此时我们需要将该类的bean属性加上DataSource 属性

二、如何使用外部配置文件作为存储信息
1)使用Propertis来存储连接信息
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/spring
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=1234
2)在配置文件中引入

    <!-- 指定spring读取db.propertis配置 -->    <context:property-placeholder location="classpath:db.properties" />    <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>

三、spring事务的管理
事务:
事务特性:
事务并发问题
脏读
不可重复读
幻读(虚读)
事务兵法问题的解决方法
1.读未提交
2.读已提交
3.可重复读
4。串行化
spring封装了事务管理代码(事务操作)
1.打开事务的代码
con.autoCommit(true)//默认
2.提交事务的代码
session.commit();
3.回滚事务
rollback()
事务操作对象
(一)
因为在不同平台中操作失误代码各不相同。spring提供了一个接口
PlatformTransactionManager 接口 。针对不同平台 该接口提供不同的实现类
1.jdbc平台 提供JdbcTranactionManager
2.hibearnte平台:提供HibernatTransactionManager
注意:在spring中进行事务管理 最核心的就是TransactionManager接口。

spring管理事务的属性介绍

1)事务的隔离级别
2)是否只读
3)事务传播行为
3-1)决定业务方法之间调用,事务应该如何处理。
PROPAGATION_REQUIRED:支持当前事务,如果不存在就创建一个(默认)
PROPAGATION_SUPPORTS支持当前事务。如果不存在就不使用事务
PROPGATION_HANDATARY支持当前事务,如果不存在,抛出异常

            PROPAGATION_REQUIRES_NEW如果有事物存在,刮起当前事务,创建一个新事务            PROPGATION_NOT_SUPPORTED以非事务方式云心,如果有事物存在,挂起当前事务            PROPAGATION_NEVER以非事务方式运行,如果有事物存在则抛出异常            PROPAGATION)NESTED如果当前事物存在,则嵌套事务执行        spring管理事务的方式            11111111111111.编码式来管理事务。                1)将事务管理器配置到
    <!-- 配置事务管理器 封装了所有事务操作,依赖于连接池。 -->                        <bean name="transactionManager"                            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">                            <property name="dataSource" ref="dataSource"></property>                        </bean>                        <!-- 配置事务模版对象 依赖于事务管理器 -->                        <bean name="transactionTemplate"                            class="org.springframework.transaction.support.TransactionTemplate">                            <property name="transactionManager" ref="transactionManager"></property>                        </bean>
2)进行测试                    public class AccountServiceImpl implements AccountService {                        private AccountDao dao;                        private TransactionTemplate td;                        public void setTd(TransactionTemplate td) {                            this.td = td;                        }                        public void setDao(AccountDao dao) {                            this.dao = dao;                        }                        @Override                        public void transfer(final Integer from, final Integer to, double money) {                            // TODO Auto-generated method stub                            td.execute(new TransactionCallbackWithoutResult() {                                @Override                                protected void doInTransactionWithoutResult(TransactionStatus arg0) {                                    // TODO Auto-generated method stub                                    // 1.减钱                                    dao.decreasemoney(from, money);                                    //int i = 10 / 0;                                    // 2.加钱                                    dao.increaseMoney(to, money);                                }                            });                    //基本步骤如下:                            // 1.打开事务                            // 2.调用doInTransactionWithountResult方法                            // 3.提交事务                        }                    222222.xml配置(aop)                            //1.导包4+2  aop   aspect  aop联盟,  weavingzh织入包。                            //2.导入新的约束<tx:>                            //3.配置通知:                                <!-- 配置事务通知 -->                                <tx:advice transaction-manager="transactionManager" id="txadvice">                                    <tx:attributes>                                        <!-- 其中isolation的属性就是隔离级别设置为可重复读 propagation设置为REQUIRED read-only设置为false -->                                        <!-- 以方法为单位 ,指定方法应用什么事务属性, isolatioin:隔离级别 propagation:传播行为 read-only:是否只读 -->                                        <tx:method name="transfer" isolation="REPEATABLE_READ"                                            propagation="REQUIRED" read-only="false" />                                    </tx:attributes>                                </tx:advice>                            ///4.配置织入<!-- 配置织入 -->                                <aop:config>                                    ////4.1配置切点                                    <aop:pointcut                                        expression="execution(* com.spring.transaction.*serviceimpl.AccountServiceImpl.*(..))"                                        id="txpc" />                                    /////4.2配置切面<!-- 配置切面 通知+切点   advice-ref="通知名称" point-ref="切点名称"-->                                            <aop:advisor advice-ref="txadvice" pointcut-ref="txpc" />                                </aop:config>                                <!--事务核心管理器,封装了所有的事务操作,依赖于连接池 -->                                        <bean name="transactionManager"                                            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">                                            <property name="dataSource" ref="dataSource"></property>                                        </bean>                                <!-- 配置事务模版对象 -->                                        <bean name="transactionTemplate"                                            class="org.springframework.transaction.support.TransactionTemplate">                                            <property name="transactionManager" ref="transactionManager"></property>                                        </bean>                             333333333注解配置(aop)                        ///3.1.导包                        ///3.2.导入新的约束                        ///3.3开启注解管理事务                                <!-- 开启使用注解管理aop -->                                <tx:annotation-driven />                        ///3.4开始使用注解                            @Override                                @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, readOnly = false)                                public void transfer(final Integer from, final Integer to, double money) {                                    // TODO Auto-generated method stub                                    td.execute(new TransactionCallbackWithoutResult() {                                        @Override                                        protected void doInTransactionWithoutResult(TransactionStatus arg0) {                                            // TODO Auto-generated method stub                                            // 1.减钱                                            dao.decreasemoney(from, money);                                             int i = 10 / 0;                                            // 2.加钱                                            dao.increaseMoney(to, money);                                        }                                    });                            ////3.5注意一点我们可以将注解加到类名称上边这时候  该类下的所有服务方法都会生效,如果想要个别方法不适用类上边的属性                            我们可以就可以在具体方法下加上相应的注解即可。
0 0
原创粉丝点击