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

一、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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring框架提供了很好的支持来与JDBC进行整合。以下是Spring整合JDBC的一般步骤: 1. 添加依赖:在项目的构建文件(如`pom.xml`或`build.gradle`)中,添加Spring JDBC相关的依赖项,包括`spring-jdbc`和适当的数据库驱动程序依赖。 2. 配置数据源:在Spring的配置文件(如XML配置文件或Java配置类)中,配置一个数据源(如`DataSource`)。数据源是一个连接池,它提供了对数据库的连接管理。 3. 配置JdbcTemplate:通过配置一个`JdbcTemplate` bean,将其与数据源关联起来。`JdbcTemplate`是Spring提供的一个简化JDBC操作的工具类。 4. 执行SQL操作:通过使用`JdbcTemplate`的方法,可以执行各种SQL操作,如查询、更新、插入等。`JdbcTemplate`会自动处理数据库连接的获取和释放,以及异常的处理和转换。 下面是一个示例配置文件(XML方式): ```xml <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mydatabase" /> <property name="username" value="root" /> <property name="password" value="password" /> </bean> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> ``` 在上述配置中,使用了MySQL数据库作为示例。你需要根据实际情况修改驱动类名、数据库URL、用户名和密码。 通过在代码中注入`JdbcTemplate` bean,并调用其方法,你可以轻松执行各种SQL操作。 这只是整合JDBC的一个简单示例,实际应用中可能还需要进行事务管理、异常处理等其他配置。你可以根据具体需求,进一步深入学习和调整配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uniquewdl

匆忙的人生,总有你喜欢的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值