spring JDBC

来源:互联网 发布:java 字符串 == 编辑:程序博客网 时间:2024/06/08 16:34

在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等。 Spring JDBC 框架可以负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。
JdbcTemplate :是Spring自带的一个类可以执行SQL查询,更新语句,调用存储过程,执行迭代结果集和提取返回参数值等的操作。jdbcTemplate类的实例是线程安全的。
下面是jdbcTemplate操作数据库的一个例子 :

数据源

CREATE TABLE IF NOT EXISTS `student` (  `sno` int(11) NOT NULL,  `name` varchar(255) DEFAULT NULL,  `sex` varchar(255) DEFAULT NULL,  PRIMARY KEY (`sno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `student` (`sno`, `name`, `sex`) VALUES    (1, 'tom', 'boy'),    (2, 'jack', 'boy'),    (3, 'linda', 'girl'),    (4, 'rose', 'girl');

导入jar包

spring jdbc 使用到的jar包有:

  • mysql-connector-java.jar
  • org.springframework.transaction.RELEASE.jar
  • spring-jdbc-4.0.5.RELEASE.jar

创建数据库DAO类

package com.spring.dao;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;public class StudentDao {private JdbcTemplate jdbcTemplate;//数据源private DataSource dataSource;public void getAllStudent(){    String sql = "select * from student";    List<Map<String,Object>> results = jdbcTemplate.queryForList(sql);    Iterator<Map<String,Object>> iterator = results.iterator();    while(iterator.hasNext())    {        Map<String,Object> student = iterator.next();        Set<String> keys = student.keySet();        Iterator<String> iterator2 = keys.iterator();        while(iterator2.hasNext())        {            Object o =student.get((String)iterator2.next()) ;            System.out.print(o.toString()+"  ");        }        System.out.println("");    }}public DataSource getDataSource() {    return dataSource;}public void setDataSource(DataSource dataSource) {    this.dataSource = dataSource;    //为jdbcTemplate配置数据源    this.jdbcTemplate = new JdbcTemplate(dataSource);}}

在xml中配置数据源和注册StudentDao

<?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"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop.xsd"        >    <!-- 配置数据源 -->    <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/test?useUnicode=true&amp;characterEncoding=utf-8"/>        <property name="username" value="root"/>        <property name="password" value="root"/>    </bean>    <bean id="dao" class="com.spring.dao.StudentDao">        <property name="dataSource" ref="dataSource"/>    </bean></beans>

测试类

package com.spring.test;import com.spring.dao.StudentDao;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {    @Test    public void Test() throws Exception {        ClassPathXmlApplicationContext context =        new ClassPathXmlApplicationContext("applicationContext.xml");       StudentDao dao = (StudentDao) context.getBean("dao");       dao.getAllStudent();       context.close();    }}

测试结果

1  tom  boy  2  jack  boy  3  linda  girl  4  rose  girl  

DriverMangerDataSource

这个类本质上也只是一个数据库连接类而已,不过是被封装了起来,构造方法 :

   public DriverManagerDataSource() {    }    public DriverManagerDataSource(String url) {        this.setUrl(url);    }    public DriverManagerDataSource(        String url, String username, String password) {        this.setUrl(url);        this.setUsername(username);        this.setPassword(password);    }

JdbcTemplate 类

jdbcTemplate 有三个构造函数,可以指定dataSource,也可以不指定 。如果使用无参的构造方法,可以像例子那样在配置数据源的时候初始化。

    public JdbcTemplate() {    }    public JdbcTemplate(DataSource dataSource) {        this.setDataSource(dataSource);        this.afterPropertiesSet();    }    public JdbcTemplate(DataSource dataSource, boolean lazyInit) {        this.setDataSource(dataSource);        this.setLazyInit(lazyInit);        this.afterPropertiesSet();    }

jdbcTemplate 封装了很多操作数据库的方法,可以直接调用,也可以重写后使用。个人觉得jdbcTemplate 常用的方法应该有以下几个:

execute

public void execute(final String sql) throws DataAccessException {...}

直接执行sql语句,没有返回值。

query

 public <T> T query(final String sql, final ResultSetExtractor<T> rse)  throws DataAccessException {...}

这个方法有很多重载的方法,根据不同的参数执行不同的方法,返回的结果也不一样。

queryForObject

 public <T> T queryForObject(String sql, Class<T> requiredType) t hrows DataAccessException {... } ``` 以对象的形式返回查询结果### queryForList```java public List<Map<String, Object>> queryForList(String sql)  throws DataAccessException {... }<div class="se-preview-section-delimiter"></div>

以list形式返回查询结果

update

   public int update(String sql, Object... args) throws DataAccessException {.. }

更新数据

0 0