Spring JDBC 学习(一) 很好的学习资料

原创 2015年11月19日 13:28:30

JDBC部要求我们掌握其他框架的查询语言,它是基于SQL这种数据访问语言的。JDBC很多便捷的功能是很多框架不能比的,但是JDBC也不是十全十美的,它具有强大的功能、灵活性和其他一些优点,但也有缺点。

    传统的JDBC对数据库的操作,有很多重复的代码,这样给程序员带来了很多额外的工作量,Spring提供了JDBC模板很好的解决了这个问题,由于传统的方法比较简单,在这里不介绍了,直接说模板吧。

使用JDBC模板:
    Spring的JDBC框架能够承担资源管理和异常处理的工作。对于JDBC来说,Spring提供了3个模板类
  • JdbcTemplate:Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问。
  • NamedParameterJdbcTemplate:能够在执行查询时把值绑定到SQL里的命名参数,而不是使用索引参数。
  • SimpleJdbcTemplate:利用Java 5 的特性,比如自动装箱、通用(generic)和可变参数类表来简化JDBC模板的使用。

使用JdbcTemplate来访问数据
    只需要配置DataSource就能够让JdbcTemplate工作,如下配置:
<!-- 配置DBCP数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" scope="singleton">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://192.168.3.226:3306/spring" />
    <property name="username" value="root" />
    <property name="password" value="root" />
    <property name="initialSize" value="5" />
    <property name="maxActive" value="10" />
</bean>

<!-- 配置JDBC模板,spring里最基本的JDBC模板,利用JDBC和简单的索引此参数查询提供对数据库的简单访问 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

现在我们可以把JdbcTemplate装配到DAO,使用它来访问数据库
public class JdbcRantDao{

    //配置JdbcTemplate
    private jdbcTemplate jdbcTemplate;
    public void setJdbcTempalte(JdbcTemplate jdbcTempalte) {
        this.jdbcTempalte = jdbcTempalte;
    }

    //写入Motorist的SQL语句   
    private static final String MOTORIST_INSERT =
        "insert into motorist(id,email,password,firstName,lastName)values(null,?,?,?,?)";
    //获取所有Motorist的SQL语句
    private static final String MOTORIST_SELECT =
        "select id,email,password,firstName,lastName from motorist";
    //获取某一个Motorist的SQL语句
    private static final String MOTORIST_BY_ID_SELECT =    
        MOTORIST_SELECT + " where id=?";
    /**
    * 利用JDBC模板往数据库里添加一行数据
    * @param motorist
    */
    public void saveMotorist(Motorist motorist){
          jdbcTemplate.update(MOTORIST_INSERT, new Object[]               {motorist.getEmail(),motorist.getPassword(),motorist.getFirstName(),motorist.getLastName()});
    }
    /**
    * 利用JDBC模板从数据库中读取一个数据
    * @param id
    * @return
    */
    public Motorist getMotoristById(int id){
        List matches = jdbcTemplate.query(MOTORIST_BY_ID_SELECT,     
            new Object[] {Integer.valueOf(id)},
            new RowMapper(){
                public Object mapRow(ResultSet rs,int rowNum)
                        throws SQLException,DataAccessException{
                    Motorist motorist = new Motorist();
                    motorist.setId(rs.getInt(1));
                    motorist.setEmail(rs.getString(2));
                    motorist.setPassword(rs.getString(3));
                    motorist.setFirstName(rs.getString(4));
                    motorist.setLastName(rs.getString(5));
                    return motorist;
                }
            });
        return matches.size() > 0 ? (Motorist) matches.get(0) : null;
    }
}

使用命名参数:使用了索引参数以为着把参数传递给update()方法时,我们必须注意参数在查询里的次数,并且以正确的次序列出相应的值。为了避免这种情况,我们可以使用命名参数。
<!-- 配置JDBC命名模板 ,能够执行查询时把值绑定到SQL里的命名参数,而不是使用索引参数-->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource" />
</bean>

public void saveMotorist(Motorist motorist){
    Map parameters = new HashMap();
    parameters.put("email", motorist.getEmail());
    parameters.put("password", motorist.getPassword());
    parameters.put("firstName", motorist.getFirstName());
    parameters.put("lastName", motorist.getLastName());
    namedParameterJdbcTemplate.update(MOTORIST_INSERT, parameters);
}


在Java5里简化JDBC:之前传递给update()方法的参数是Object数组,但是使用java5的新特性,可以不必构造Object数组就可以传递参数。
<!-- 配置JDBC简单模板 ,利用java5特性,比如自动装箱、通用和可变参数到表来简化JDBC模板的使用-->
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
    <constructor-arg ref="dataSource" />
</bean>

SimpleJdbcTemplate不仅能支持可变参数来绑定参数值,在映射结果集时还利用了Java 5 对自动装箱的支持。再看一下下列程序里的getMotoristById(),应该注意两件事:
  • id参数必须转化为一个包裹类型(java.lang.Long)才能在Object数组里进行传递。
  • RowMapper的mapRow()方法的返回类型是java.lang.Object。这是因为RowMapper的通用性要求它支持任何类型的对象,所以返回的结果的类型是最通用的类型:Object。
package org.spring.source.jdbc.template;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

public class SimpleJdbcRantDao {
    private SimpleJdbcTemplate simpleJdbcTemplate;
    //写入Motorist的SQL语句
    private static final String MOTORIST_INSERT =
        "insert into motorist(id,email,password,firstName,lastName)values(null,?,?,?,?)";
    //获取所有Motorist的SQL语句
    private static final String MOTORIST_SELECT =
        "select id,email,password,firstName,lastName from motorist";
    //获取某一个Motorist的SQL语句
    private static final String MOTORIST_BY_ID_SELECT =
        MOTORIST_SELECT + " where id=?";
    public void setSimpleJdbcTemplate(SimpleJdbcTemplate simpleJdbcTemplate) {
        this.simpleJdbcTemplate = simpleJdbcTemplate;
    }
    public SimpleJdbcTemplate getSimpleJdbcTemplate() {
        return simpleJdbcTemplate;
    }


    public void saveMotorist(Motorist motorist){
        simpleJdbcTemplate.update(MOTORIST_INSERT, motorist.getEmail(),                                                                             motorist.getPassword(), motorist.getFirstName(), motorist.getLastName());
    }
    public Motorist getMotoristById(int id){
        List<Motorist> matches = getSimpleJdbcTemplate().query(
            MOTORIST_BY_ID_SELECT,
            new ParameterizedRowMapper<Motorist>(){
                public Motorist mapRow(ResultSet rs, int rowNum)
                        throws SQLException {
                    Motorist motorist = new Motorist();
                    motorist.setId(rs.getInt(1));
                    motorist.setEmail(rs.getString(2));
                    motorist.setPassword(rs.getString(3));
                    motorist.setFirstName(rs.getString(4));
                    motorist.setLastName(rs.getString(5));
                    return motorist;
                }
            },
            id   //显示id没有被包裹
            );
        return matches.size() > 0 ? matches.get(0) : null;
    }
}


使用Spring对JDBC的DAO支持类:Spring的JdbcDaoSupport用于编写基于JDBC的DAO类的基类,我们只需让自己的DAO类继承它即可。
package org.spring.source.jdbc.template;

import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import java.sql.ResultSet;

public class JdbcRantDao extends JdbcDaoSupport{
    //写入Motorist的SQL语句
    private static final String MOTORIST_INSERT =
        "insert into motorist(id,email,password,firstName,lastName)values(null,?,?,?,?)";
    //获取所有Motorist的SQL语句
    private static final String MOTORIST_SELECT =
        "select id,email,password,firstName,lastName from motorist";
    //获取某一个Motorist的SQL语句
    private static final String MOTORIST_BY_ID_SELECT =
            MOTORIST_SELECT + " where id=?";
    /**
    * 利用JDBC模板往数据库里添加一行数据
    * @param motorist
    */
    public void saveMotorist(Motorist motorist){
        getJdbcTemplate().update(MOTORIST_INSERT, new Object[]     {motorist.getEmail(),motorist.getPassword(),motorist.getFirstName(),motorist.getLastName()});
    }
    /**
    * 利用JDBC模板从数据库中读取一个数据
    * @param id
    * @return
    */
    public Motorist getMotoristById(int id){
        List matches = getJdbcTemplate().query(MOTORIST_BY_ID_SELECT, 
            new Object[] {Integer.valueOf(id)},
            new RowMapper(){
                public Object mapRow(ResultSet rs,int rowNum)
                        throws SQLException,DataAccessException{
                    Motorist motorist = new Motorist();
                    motorist.setId(rs.getInt(1));
                    motorist.setEmail(rs.getString(2));
                    motorist.setPassword(rs.getString(3));
                    motorist.setFirstName(rs.getString(4));
                    motorist.setLastName(rs.getString(5));
                    return motorist;
                }
            });
        return matches.size() > 0 ? (Motorist) matches.get(0) : null;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

JDBC学习总结

从12月23号开始写博客起,已经过去10多天,早觉得身为程序员有必要写写博客,看着今年暑假一起培训acm的几个队友早就开始写算法相关的博客了,那时候还不以为然,现在才发现自己差的太远。最近这段时间开始...
  • chance2015
  • chance2015
  • 2016年01月03日 23:17
  • 1743

Java JDBC学习实战(一): JDBC的基本操作

一、JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。 下面介绍一些常用的API,来源...
  • zuiwuyuan
  • zuiwuyuan
  • 2014年09月26日 10:47
  • 2800

spring学习总结(十一):spring 对 JDBC 的支持

JdbcTemplate 简介 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架.作为 Spring JDBC 框架的核...
  • yuchao2015
  • yuchao2015
  • 2016年12月25日 17:58
  • 299

Java进阶学习第十七天——JDBC入门学习

JDBC介绍 组成JDBC的类和接口 第一个JDBC程序 JDBC操作详解 1.注册驱动 2.Connection详解 3.Statement详解 4.ResultSet详解 5.释放资源 使用JDB...
  • lutianfeiml
  • lutianfeiml
  • 2016年05月12日 22:40
  • 8254

spring-JDBC模板操作

转载自 http://jinnianshilongnian.iteye.com/blog/1423897   7.2  JDBC模板类 7.2.1  概述   ...
  • fengshenju2018
  • fengshenju2018
  • 2016年01月26日 17:28
  • 1749

SPRING源码学习之路(二)

上一篇,已经对IOC容器的初始化过程有个大体认识,接着看IOC容器的依赖注入。       依赖注入的触发是在用户第一次向容器索要Bean时才触发,当然也可以设置lazy-init让容器提前完成B...
  • jin5203344
  • jin5203344
  • 2017年03月09日 15:13
  • 454

SpringBoot开发详解(四)--JDBC操作数据库

JDBC在Spring Boot中的配置使用JDBC连接数据库: 通过上几篇幅的介绍,我们已经能够构建一个简单的,没有数据库的API接口项目,可是作为一个接口程序,没有数据库就是在耍流氓。那么本文我...
  • qq_31001665
  • qq_31001665
  • 2017年04月16日 18:07
  • 3419

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载。   下载解压后,必须的两个包是s...
  • chenqiushi205
  • chenqiushi205
  • 2016年02月17日 16:09
  • 465

SpringJdbc访问数据库

SpringJdbc (1)SpringJdbc是什么? 是spring框架中的一个模块,对jdbc api做了封装,简化了 jdbc的代码(比如,不用考虑获取连接与关闭连接了) (2)...
  • wangqing84411433
  • wangqing84411433
  • 2017年06月18日 14:30
  • 146

使用Spring JDBC框架连接并操作数据库

在前一篇博文JAVA通过JDBC连接并操作MySQL数据库中,我们知道如何通过JDBC连接并操作数据库,但是请看程序,整个程序连接数据库和关闭数据库占了很大一部分代码量,而且每次我们执行一下数据库操作...
  • wanghuiqi2008
  • wanghuiqi2008
  • 2015年05月29日 20:50
  • 37306
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring JDBC 学习(一) 很好的学习资料
举报原因:
原因补充:

(最多只允许输入30个字)