Spring+JDBC组合开发

搭建和配置Spring与JDBC整合的环境

使用Spring+JDBC集成步骤如下: 
第一步,配置数据源。我们使用DBCP数据库连接池。 
我们首先在Eclipse中新建一个普通的Java Project,名称为springAndJDBC。接着导入所需Jar包到项目中,所需Jar包共有: 
 
然后我们在Sping配置文件中——beans.xml配置数据源,即在beans.xml中加入如下内容:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"
        value="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&amp;characterEncoding=UTF-8" />
    <property name="username" value="root" />
    <property name="password" value="yezi" />
    <!-- 连接池启动时的初始值 -->
    <property name="initialSize" value="1" />
    <!-- 连接池的最大值 -->
    <property name="maxActive" value="500" />
    <!-- 最大空闲值。当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
    <property name="maxIdle" value="2" />
    <!-- 最小空闲值。当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
    <property name="minIdle" value="1" />
</bean>
  • 1

第二步,配置事务。因为我们打算使用Spring给我们提供的容器来管理事务。配置事务时,需要在XML配置文件中引入用于声明事务的tx命名空间,事务的配置方式有两种:注解方式和基于XML配置方式。 
我们首先在Spring配置文件中引入用于声明事务的tx命名空间:

<?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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

</beans>
  • 1

接着我们采用注解方式配置声明式事务,需要在Spring配置文件中添加如下内容:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

以上配置指定了Spring的事务管理器(由于我们打算使用Spring的事务管理功能),这样,我们不再手工控制事务的打开、提交或回滚,而是都交给Spring的事务管理器来管理。 
提示:org.springframework.jdbc.datasource.DataSourceTransactionManager是Spring为我们提供的专门针对数据源的事务管理器。 
由于我们采用注解——@Transactional的方式来配置声明式事务,所以我们还要在Spring配置文件中添加如下内容:

<tx:annotation-driven transaction-manager="txManager" />

以上配置隐式地注册了对注解——@Transactional进行解析的处理器。经过以上两步,Spring与JDBC整合的环境就算搭建好了,Spring配置文件——beans.xml的内容为:

<?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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&amp;characterEncoding=UTF-8" />
        <property name="username" value="root" />
        <property name="password" value="yezi" />
        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="1" />
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="500" />
        <!-- 最大空闲值。当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="2" />
        <!-- 最小空闲值。当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="1" />
    </bean>

    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="txManager" />
</beans>
  • 1

Spring集成的JDBC编码和事务管理

Spring与JDBC整合的环境搭建好之后,我们就要编写JDBC代码了。首先在jdbc数据库中创建一张person表,如下: 

接着在src目录下新建一个cn.itcast.bean包,并在该包下新建一个JavaBean——Person.java,其代码为:

public class Person {
    private Integer id;
    private String name;

    public Person() {}

    public Person(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 1

再接着在src目录下新建一个cn.itcast.service包,并在该包下新建一个接口——PersonService.java,其代码为:

public interface PersonService {
    /**
     * 保存person
     */
    public void save(Person person);

    /**
     * 更新person
     */
    public void update(Person person);

    /**
     * 获取person
     */
    public Person getPerson(Integer personid);

    /**
     * 获取所有person
     */
    public List<Person> getPersons();

    /**
     * 删除指定id的person
     */
    public void delete(Integer personid);
}
  • 1

紧接着在src目录下新建一个cn.itcast.service.impl包,并在该包下新建一个PersonService接口的实现类——PersonServiceBean.java。因为我们要对数据库person表进行增删改查,所以需要通过数据源dataSource进行操作,但是我们最好不要直接通过数据源dataSource进行操作,而是应使用Spring为我们提供的JdbcTemplate类进行JDBC操作,因为这个辅助类封装了比较多的JDBC代码,故PersonServiceBean类的代码应为:

/**
 * 使用JdbcTemplate进行insert/update/delete/select操作
 * @author li ayun
 *
 */
public class PersonServiceBean implements PersonService {
    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void save(Person person) {
        jdbcTemplate.update("insert into person(name) value(?)", new Object[]{person.getName()},
                new int[]{java.sql.Types.VARCHAR});
    }

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

    /**
     * 使用JdbcTemplate获取一条记录
     */
    @Override
    public Person getPerson(Integer personid) {
        return jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personid},
                new int[]{java.sql.Types.INTEGER}, new PeronRowMapper());
    }

    /**
     * 使用JdbcTemplate获取多条记录
     */
    @Override
    public List<Person> getPersons() {
        return jdbcTemplate.query("select * from person", new PeronRowMapper());
    }

    @Override
    public void delete(Integer personid) {
        jdbcTemplate.update("delete from person where id=?", new Object[]{personid},
                new int[]{java.sql.Types.INTEGER});
    }

}

接下来还要在cn.itcast.service.impl包下新建一个类——PeronRowMapper.java,其代码为:

public class PeronRowMapper implements RowMapper<Person> {

    @Override
    public Person mapRow(ResultSet rs, int index) throws SQLException {
        Person person = new Person(rs.getString("name"));
        person.setId(rs.getInt("id"));
        return person;
    }

}
  • 1

有人可能会问,为何mapRow()方法内部一开始不调用一下rs.next()方法?答案是外部调用mapRow()方法时,已经执行了诸如if(rs.next()) { ... } 这样的代码。 
然后我们要将PersonServiceBean交给Spring进行管理,即需要在Spring配置文件中添加如下内容:

<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
    <property name="dataSource" ref="dataSource" />
</bean>

最后,我们就要在src目录下新建一个junit.test包,并在该包下新建一个单元测试类——PersonServiceTest.java,对我们编写的业务bean的JDBC代码进行测试。

public class PersonServiceTest {
    private static PersonService personService;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        try {
            ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
            personService = (PersonService) cxt.getBean("personService");
        } catch (Exception e) { // 若出错,则打印在控制台上
            e.printStackTrace();
        }
    }

    @Test
    public void save() {
        personService.save(new Person("李阿昀"));
    }

    @Test
    public void getPerson() {
        Person person = personService.getPerson(1);
        System.out.println(person.getName());
    }

    @Test
    public void update() {
        Person person = personService.getPerson(1);
        person.setName("李子");
        personService.update(person);
    }

    @Test
    public void delete() {
        personService.delete(1);
    }

    @Test
    public void save_5() {
        for (int i = 1; i <= 5; i++) {
            personService.save(new Person("李阿昀" + i));
        }
    }

    @Test
    public void getBeans() {
        for (Person person : personService.getPersons()) {
            System.out.println(person.getName());
        }
    }
}
  • 1

分别测试以上方法,都顺利通过,大发! 
从PersonServiceBean类的代码中我们可以看出该PersonServiceBean并没有受Spring的事务管理,因为我们没有为PersonServiceBean标注@Transactional注解,若要是不定义这个@Transactional注解,那么像save()方法中的每条sql语句都会在各自的事务中进行执行。若save()方法中有2条语句,例如:

public void save(Person person) {
    jdbcTemplate.update("insert into person(name) value(?)", new Object[]{person.getName()},
            new int[]{java.sql.Types.VARCHAR});     

    jdbcTemplate.update("insert into person(name) value(?)", new Object[]{person.getName()},
            new int[]{java.sql.Types.VARCHAR});
}
  • 1

这样,2条语句都会在各自的事务中执行,他们是无法保证在同一个事务中执行的,从而会出现一些问题。因此为了保证多条语句在同一个事务中执行,我们应该使用Spring容器给我们提供的声明式事务,即在该PersonServiceBean加上@Transactional注解。这样,该PersonServiceBean的所有业务方法在方法执行前打开事务,方法执行后关闭事务。 
使用属性占位符方式配置数据源 
在使用Spring+JDBC组合开发过程中,有人喜欢把数据库连接等信息放在一个属性文件中,接着使用属性占位符方式将属性文件中的内容引用进来。 
现在类路径底下新建一个属性文件——jdbc.properties,其内容为: 

接着,我们就要将Spring的配置文件修改为:

<?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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

    <context:property-placeholder location="classpath:jdbc.properties" /> <!-- classpath: 明确指明jdbc.properties文件是在类路径底下的 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="${jdbc.initialSize}" />
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="${jdbc.maxActive}" />
        <!-- 最大空闲值。当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        <!-- 最小空闲值。当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="${jdbc.minIdle}" />
    </bean>

    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="txManager" />

    <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

此时再来测试PersonServiceTest类中的各个方法,仍然都会顺利通过。如须查看源码,可点击Spring+JDBC组合开发进行下载。

时间: 2024-10-29 12:37:43

Spring+JDBC组合开发的相关文章

深入探索spring技术内幕(八): Spring +JDBC组合开发和事务控制

一. 配置数据源 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/> <property name="

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

Spring+JDBC Template应用步骤

1.应用步骤介绍 基于SpringMVC和JDBC技术开发的主要步骤如下 创建工程,搭建SpringMVC和JDBC技术环境 基于JdbcTemplate实现DAO组件 编写和配置SpringMVC的主要组件,例如Controller,HandlerMapping,ViewResolver等 编写JSP视图组件,利用标签和表达式显示模型数据 测试程序 2.如何搭建SpringMVC和JDBC技术环境? 创建一个Web工程 添加JDBC相关技术环境 引入数据库驱动包 引入dbcp连接池开发包 添加

Spring JDBC详解

<Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.概述 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1)core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedP

Spring JDBC入门

Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作. 操作JDBC时Spring可以帮我们做这些事情: 定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接 我们仅需要关注: 声明SQL语句,处理每一次得到的结果 一个较为简单的例子与讲解 JdbcTemplate类 JdbcTemplate是core包的核心类.它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用.它还可以帮助我们避免一些常见的错误,比如忘记关闭数据库连接.JdbcTe

Spring的数据库开发

                            Spring JDBC框架操作mysql数据库 Spring中的JDBC为我们省去连接和关闭数据库的代码,我们着重关注对数据库的操作.Spring框架在数据库开发中的应用主要使用的是JDBCTemplate类,该类作为Spring对JDBC支持的核心,提供了所有对数据库操作功能的支持.我们将使用JDBCTemplate类完成对mysql数据库的增.删.改.查等操作. Spring框架提供JDBC支持主要由4个包组成,分别是core(核心包)

Spring DAO vs Spring ORM vs Spring JDBC

Pat 的疑惑 最近关注于 Spring 提供的数据访问技术,对于 Spring 相关的这几个项目有何不同我不是太明白: Spring-DAO (http://docs.spring.io/spring/docs/2.0.8/reference/dao.html) Spring-ORM (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/orm.html) Spring-JDBC (http://doc

Spring JDBC 访问数据库

Spring JDBC是Spring所提供的持久层技术,它以一种更直接.更简单的方式使用JDBC API.在Spring JDBC里,用户仅需要做那些必不可杀的事儿,而将资源获取.Statement创建.异常处理.资源释放等繁杂的工作交给Spring. 虽然ORM的框架已经很成熟,但是JDBC灵活直接的特性依旧让它有自己的用武之地. 本节的主要内容:使用JdbcTemplate模板类进行CRUD数据操作.BLOB和CLOB类型数据的操作,支持命名参数绑定NamedParameterJdbcTem

Spring Data JPA开发手册——1.介绍

<Spring Data JPA开发手册--1.介绍> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 我发现网上几乎没有讲述Spring Data JPA原理的文章,很多Guide一上来就是如何配置,接着就是几大段代码,没有一篇文章能把Spring Data JPA原理及构成说清楚的.所以,我写了这个系列的文章. 用Java Persistence API库创建持久层是很繁琐的,也很耗时,而且需要大量的样板代码.我们可以通过以下步骤消除一些样板代