Spring之JDBC

jdbc.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssi?useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
initialSize=1
maxActive=500
maxIdle=2
minIdle=1

配置数据源

<?xml version="1.0" encoding="UTF-8"?>
<!--Spring主配置文件 引入模块 数据源配置-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <!--数据源-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <!--初始连接数-->
        <property name="initialSize" value="${initialSize}"/>
        <!--最大连接数-->
        <property name="maxActive" value="${maxActive}"/>
        <!--最大空闲数-->
        <property name="maxIdle" value="${maxIdle}"/>
        <!--最小空闲数-->
        <property name="minIdle" value="${minIdle}"/>
    </bean>

    <!--JDBC数据源事务管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--使用注解配置事务-->
    <tx:annotation-driven transaction-manager="txManager"/>
    <!-- 所有使用Spring JDBC的类需要注入jdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--引入测试模块 使用相对路径-->
    <import resource="org/zln/config/spring/test/spring-config-test.xml"/>
    <!--依赖注入-->
    <import resource="org/zln/config/spring/test2_ioc/spring-config-test2.xml"/>
    <!--面向切面-->
    <import resource="org/zln/config/spring/test3_aop/spring-config-test3.xml"/>
    <!--Spring继承JDBC-->
    <import resource="org/zln/config/spring/test4_spring_jdbc/spring-config-test4.xml"/>
</beans>

Dao

package org.zln.module.test4_spring_jdbc.dao.impl;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.zln.module.test4_spring_jdbc.dao.PersonDao;
import org.zln.module.test4_spring_jdbc.domain.Person;

import javax.annotation.Resource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

/**
 * Created by coolkid on 2015/6/6 0006.
 */
public class PersonDaoImpl implements PersonDao {

    @Resource
    private JdbcTemplate jdbcTemplate;

    @Override
    public void save(Person person) {
        String sql = " INSERT INTO person (name) VALUES (?) ";
        jdbcTemplate.update(sql, new Object[]{person.getName()}, new int[]{Types.VARCHAR});
    }

    @Override
    public void update(Person person) {
        String sql = " UPDATE person SET name = ? WHERE id = ? ";
        jdbcTemplate.update(sql,new Object[]{person.getName(),person.getId()},new int[]{Types.VARCHAR,Types.INTEGER});
    }

    @Override
    public Person getPerson(Integer id) {
        String sql = " SELECT id,name FROM person WHERE id = ? ";
        Person person = new Person();
        jdbcTemplate.queryForObject(sql, new Object[]{id}, new int[]{Types.INTEGER},new RowMapper() {
            @Override
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                person.setId(rs.getInt("id"));
                person.setName(rs.getString("name"));
                return person;
            }
        });
        return person;
    }

    @Override
    public List<Person> getPersonList() {
        String sql = " SELECT id,name FROM person ";
        List<Person> persons = jdbcTemplate.query(sql, new RowMapper() {
            @Override
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Person person = new Person();
                person.setId(rs.getInt("id"));
                person.setName(rs.getString("name"));
                return person;
            }
        });
        return persons;
    }

    @Override
    public void delete(Integer id) {
        String sql = " DELETE FROM person WHERE id = ? ";
        jdbcTemplate.update(sql,new Object[]{id},new int[]{Types.INTEGER});
    }
}

Service

package org.zln.module.test4_spring_jdbc.service.impl;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.zln.module.test4_spring_jdbc.dao.PersonDao;
import org.zln.module.test4_spring_jdbc.domain.Person;
import org.zln.module.test4_spring_jdbc.service.PersonService;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created by coolkid on 2015/6/6 0006.
 */
/*打开事务注解后,默认同一个方法属于同一个事务。否则,每条SQL单独自己一个事务*/
@Transactional(rollbackFor = Exception.class)
public class PersonServiceImpl implements PersonService {

    @Resource(name = "personDaoJdbc")
    private PersonDao personDao;

    @Override
    public void save(Person person) {
        personDao.save(person);
    }

    @Override
    public void update(Person person) {
        personDao.update(person);
    }

    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public Person getPerson(Integer id) {
        return personDao.getPerson(id);
    }

    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public List<Person> getPersonList() {
        return personDao.getPersonList();
    }

    @Override
    public void delete(Integer id) {
        personDao.delete(id);
    }
}

配置

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

    <!--开启注解注入-->
    <context:annotation-config/>

    <bean id="personDaoJdbc" class="org.zln.module.test4_spring_jdbc.dao.impl.PersonDaoImpl"/>
    <bean id="personServiceJdbc" class="org.zln.module.test4_spring_jdbc.service.impl.PersonServiceImpl"/>
</beans>

事务传播属性

在默认情况下,也就是对于我们交给Spring进行事务管理的Bean,只是在类上添加了一个 @Transactional 注解,那么每个方法都是单独的一个事务
各自方法中的所有SQL都属于同一个事务。

默认情况下
如果方法在运行过程中发生了运行时异常(unchecked exception),也就是抛出了 RuntimeException ,方法中的更新会被取消。也就是这个事务被回滚
如果方法在运行过程中发生了检查异常(checkded exception),也就是抛出了 Exception(这种方法我们要么继续往上层抛出,要么自己catch),那么方法中的更新不会回滚

如果对于某个方法,即使发生的是检查例外,也需要进行事务的回滚,那么就需要添加注解 @Transactional(rollbackFor=Exception.class) ,这个注解说明,抛出Exception,就要回滚

如果对于某个方法,发生运行期意外,但是不需要事务的回滚,那么需要添加注解 @Transactional(noRollbackFor=RuntimeException.class),这个注解说明,抛出RuntimeException,不需要回滚

对于一些查询类的方法,不会改变数据,这个时候就没必要添加事务,可以添加传播属性取消事务的开启  @Transactional(propagation = Propagation.NOT_SUPPORTED) 

一般我们把事务注解添加在 service(业务) 层,service层调用Dao层。Dao层是真正直接操作数据库的
----------------------------------------------------------------------------------------------------------------------------------

事务常用注解
<tx:annotation-driven transaction-manager="txManager"/> -- 在使用注解配置事务之前,首先要在Spring配置文件中开启处理这些注解的解析器

@Transactional(rollbackFor=Exception.class),checked exception异常回滚(默认不回滚)
@Transactional(noRollbackFor=RuntimeException.class),unckecked exception异常不回滚(默认回滚)
@Transactional(propagation = Propagation.NOT_SUPPORTED) ,不把这个方法添加到事务管理中(默认某个类添加了@Transaction后,每个方法都会单独开启一个事务)

事务传播属性
REQUIRED(默认)    业务方法需要在一个事务中允许,如果方法运行时已经处于某个事务中了,就加入到该事务中,否则自己创建一个新的事务
NOT_SUPPORTED    声明方法不需要事务,如果方法没有管理到一个事务,容器不会为其开启事务,如果方法在事务中被调用,该事务会被挂起。方法调用结束后便恢复执行
REQUIRESNEW        声明业务方法总是为自己开启一个新事务,如果方法运行在一个事务中,那么原事务会被挂起,新事务创建;方法结束后,原事务恢复执行
MANDATORY        声明方法执行运行在一个已经存在的事务中,方法自己不能发起事务,如果调用该方法的时候不存在事务,就会抛出异常
SUPPORTS        如果方法已经在某个事务中执行了,则成为该事务的一部分;如果在事务外执行,则没有事务
NEVER            声明该方法绝对不能在事务范围内执行;否则抛出异常
NESTED            如果存在一个事务,则嵌套在事务中运行,如果没有活动事务,则按RESUIRED属性执行。它使用一个单独的事务,这个事务可以拥有多个回滚点,内部事务的回滚不对
                    外部事务造成影响。它只对DataSourceTransactionManager事务管理器有效

其他设置
@Transactional(readOnly = true)    设置只读属性,默认false,提高效率
timeout            事务的超时时间,默认30秒
isolate            数据库的隔离级别,依赖于底层的数据库,不是Spring实现的。设置不同的个例级别,就是在准确性与并发效率上做一个取舍。一般就是由数据库默认的隔离级别
                大部分数据库的隔离级别是 Read Commited(会出现不可重复读和幻读)
                MySQL的默认隔离级别是 Repeatable Read(出现幻读)

                脏读:一个事务读取另一个事务未提交的数据
                不可重复读:同一个事务中的读取结果不一致,因为后续读取时有其他事务提交新的更新
                幻读:一个事务读取另一个事务提交的insert
时间: 2024-10-18 03:52:02

Spring之JDBC的相关文章

Spring整合jdbc

首先web.xml文件跟往常一样,加载spring容器和加载org.springframework.web.context.ContextLoaderListener读取applicationContext.xml文件初进行始化. 使用spring整合jdbc工具步骤: 1.使用连接池com.mchange.v2.c3p0.ComboPooledDataSource等工具创建数据源. 2.把数据源交给LazyConnectionDataSourceProxy进行管理 3.把LazyConnect

Spring(十三)Spring整合JDBC

做开发不连接数据库怎么行!Spring整合JDBC过程中,数据源可以直接都在beans.xml里配置,也可以把数据单独放在一个properties文件里,方便维护. 首先放入各种jar包,连接MySQL当然要放数据驱动文件. jar包什么的对照项目截图,切面aspect和cglib在这个工程没用到,jar包可以不添加进来 beans.xml,在头文件加上tx事务相关的引用,其他要注意的在文件的注释里基本都点到了 <?xml version="1.0" encoding="

JAVAEE——spring03:spring整合JDBC和aop事务

一.spring整合JDBC 1.spring提供了很多模板整合Dao技术 2.spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模板对象 与DBUtils中的QueryRunner非常相似. //0 准备连接池 ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Dri

跟着刚哥学习Spring框架--JDBC(六)

Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简化JDBC编程 Spring提供了3个模板类: JdbcTemplate:Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问. NamedParameterJdbcTemplate:能够在执行查询时把值绑定到SQL里的命名参数,而不是使用索引参数. Simpl

Unit06: Spring对JDBC的 整合支持 、 Spring+JDBC Template、Spring异常处理

Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架,让spring来帮我们处理异常. (1)使用简单异常处理器 step1. 配置简单异常处理器. step2. 添加对应的异常处理页面. 注:该方式只适合处理简单异常的处理,如果要对异常做复杂处理,比如 记录日志等,则不合适了. (2)使用@ExceptionHandler注解 step1. 在处理

Spring的JDBC框架

转自: http://www.cnblogs.com/windlaughing/p/3287750.html Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简化JDBC编程 Spring提供了3个模板类: JdbcTemplate:Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问. NamedParameterJdbcTemplat

(转) Spring Boot JDBC 连接数据库

文本将对在Spring Boot构建的Web应用中,基于MYSQL数据库的几种数据库连接方式进行介绍. 包括JDBC.JPA.MyBatis.多数据源和事务. 1 JDBC 连接数据库 1.1 属性配置文件(application.properties) spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 s

spring与jdbc整合详解

先上一段简单示例 public class MyTemplate { private DataSource dataSource; public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void insert(String sql) throws SQLExc

spring 整合JDBC

使用Spring提供的三个JDBC模板类(JdbcTemplate.NamedParameterJdbcTemplate.SimpleJdbcTemplate)操作数据库 一.JdbcTemplate是Spring中最主要的JDBC模板, 利用JDBC和简单的索引參数查询对数据库进行简单訪问 二.NamedParameterJdbcTemplate可以在查询的时候把值绑定到SQL里的命名參数,而不是索引參数 NamedParameterJdbcTemplate内部包括了一个JdbcTemplat

Spring 开发第一步(三)Spring与JDBC

<spring in action 3rd>中的前面4章讲解的是Spring的核心,也就是DI/IOC和AOP .从第5章开始是Spring在企业开发中的各个方面的应用.其实作为笔者从事的企业计算来说,J2EE相关的最常见的内容就是如何持久化了,第5.6章讲的就是这方面的内容. 今天主要学习了Spring与JDBC开发. 一.配置数据源 首先我们需要配置数据源,在设置好context.xml后,我们将JDBC数据源配置到Spring: <jee:jndi-lookup id="