Spring:JdbcTemplate使用指南

Spring:JdbcTemplate使用指南

前言:

本文指在介绍Spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转控制的使用方法和JDBC的基本概念。目标是使读者能够对JdbcTemplate快速地掌握和使用。

准备:

1. Spring的基本概念

Spring框架核心的思想就是建立一个Java对象的大工厂,用户只要给工厂一个指令,工厂就能将用户需要的对象根据配置文件组装好返还给用户。用户需要做的许多工作则可以写成简单的配置文件。

2. 丑陋的JDBC代码




Connection con= null;

PreparedStatement pStmt=null;

ResultSet rs = null;

try{

con = ods.getConnection();

String sql = "select * from admin";

pStmt=con.prepareStatement(sql);

rs=pStmt.executeQuery();

while(rs.next())

{ }

}

catch(Exception ex) {

try{

con.rollback();

}catch(SQLException sqlex){

sqlex.printStackTrace(System.out);

}

ex.printStackTrace();

}finally{

try{

rs.close();

pStmt.close();

con.close();

}catch(Exception
e){e.printStackTrace();}

}


以上是常见的JDBC代码,简单的select语句也需要冗长的出错处理,并且每个函数都不断地重复同样的代码。

3. JdbcTemplate的作用

JdbcTemplate正是为了减少上述繁琐的代码而设计出来的。它是对JDBC的一种封装,抽象我们常用的一些方法。Simple and Stupid就是它的目标。下面是完成了刚才JDBC代码同样功能的JdbcTemplate的代码:




String sql = "select * from admin";

jdbcTemplate.query(sql,new RowCallbackHandler()
{

public void processRow(ResultSet rs) throws
SQLException {

}

} );


环境搭建:

1. 数据库的配置

本文使用Oracle数据库,新建表admin:




create table admin (
ID number(10) primary key,
NAME varchar2(64),
PASSWORD varchar2(64)
)


2. Spring配置

JdbcTemplate的使用需要有DataSource的支持,所以在配置文件中,我们首先要配置一个OracleDataSource,然后在将这个DataSource配置到JdbcTemplate里。接着将JdbcTemplate配置进DAO层,最后将DAO配置进Model层。简要的关系如下:




模型层
: User





数据访问层:UserDAO





JdbcTemplate





OracleDataSource


<
!--[if !vml]-->




"http://www.springframework.org/dtd/spring-beans.dtd">

jdbc:oracle:thin:root/123@localhost:1521/XE

class="org.springframework.jdbc.core.JdbcTemplate">

3. 环境配置,
如图:


使用方法:

1. 查找

多行查询:




class UserRowMapper implements RowMapper
{

public Object mapRow(ResultSet rs,int index)
throws SQLException

{

User u = new User();

u.setId(rs.getString("ID"));

u.setName(rs.getString("Name"));

u.setPassword(rs.getString("Password"));

return u;

}

}

public List select(String where)

{

List list;

String sql = "select * from admin
"+where;

list = jdbcTemplate.query(sql,new
RowMapperResultReader(new UserRowMapper()));

return list;

}


List最终返回的是满足条件的User队列。

单行查询:




public User selectById(String id){

String sql = "select * from admin where
id=?";

final User u = new User();

final Object[] params = new Object[]
{id};

jdbcTemplate.query(sql, params, new
RowCallbackHandler(){

public void processRow(ResultSet rs) throws
SQLException {

u.setId(rs.getString("ID"));

u.setName(rs.getString("NAME"));

u.setPassword(rs.getString("PASSWORD"));

}

});

return u;

}


2. 插入




public void insert(User u)

{

String sql = "insert into admin (ID,NAME,PASSWORD)
values (admin_id_seq.nextval,?,?)";

Object[] params = new Object[] {

u.getName(),

u.getPassword() };

jdbcTemplate.update(sql,params);

}


admin_id_seq.nextval为Oracle设置好的序列,问号“?”被params里的数据依次替代,最终执行sql。

3. 修改

非常简单:




public void update(String how)

{

jdbcTemplate.update(how);

}


源代码:

User.class:




package Model;

import java.util.List;

import DAO.UserDAO;

public class User {

private String name;

private String id;

private String password;

private UserDAO dao;

public User()

{

}

public User(String name, String
password)

{

this.name = name;

this.password = password;

}

public void setDao(UserDAO dao)

{

this.dao = dao;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password)
{

this.password = password;

}

public void getInfo(String id)

{

List list = dao.select("where id="+id);

User u = (User) list.get(0);

this.id=id;

this.name = u.getName();

this.password = u.getPassword();

}

public void insert()

{

dao.insert(this);

}

public void update(String how)

{

dao.update(how);

}

public void update()

{

dao.update("update admin set name='"+name+"',
password='"+password+"' where id="+id);

}

public List selectWithTemp(String
where)

{

return dao.select(where);

}

public void selectWithTemp()

{

dao.selectWithTemp();

}

public User selectById(String id)

{

return dao.selectById(id);

}

public void insertUsers(List users)

{

dao.insertUsers(users);

}

}


UserDAO.class :




package DAO;

import java.util.List;

import Model.User;

public interface UserDAO {

public void select();

public void test();

public void selectWithTemp();

public List select(String where);

public void update(String how);

public void insert(User u);

public User selectById(String id);

public int[] insertUsers(final List
users);

}



UserDAOImp.class:




package DAO.Imp;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import
org.springframework.jdbc.core.BatchPreparedStatementSetter;

import
org.springframework.jdbc.core.JdbcTemplate;

import
org.springframework.jdbc.core.RowCallbackHandler;

import
org.springframework.jdbc.core.RowMapper;

import
org.springframework.jdbc.core.RowMapperResultReader;

import DAO.UserDAO;

import Model.User;

public class UserDAOImp implements
UserDAO{

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate
jdbcTemplate)

{

this.jdbcTemplate = jdbcTemplate;

}

class UserRowMapper implements
RowMapper

{

public Object mapRow(ResultSet rs,int index)
throws SQLException

{

User u = new User();

u.setId(rs.getString("ID"));

u.setName(rs.getString("Name"));

u.setPassword(rs.getString("Password"));

return u;

}

}

public void selectWithTemp()

{

String sql = "select * from admin";

jdbcTemplate.query(sql,new RowCallbackHandler()
{

public void processRow(ResultSet rs) throws
SQLException {

System.out.println("ID: "+rs.getString("ID")+"
Name: "+rs.getString("name"));

}

} );

}

public List select(String where)

{

List list;

String sql = "select * from admin
"+where;

list = jdbcTemplate.query(sql,new
RowMapperResultReader(new UserRowMapper()));

return list;

}

public User selectById(String id)

{

String sql = "select * from admin where
id=?";

final User u = new User();

final Object[] params = new Object[]
{id};

jdbcTemplate.query(sql,params, new
RowCallbackHandler(){

public void processRow(ResultSet rs) throws
SQLException {

u.setId(rs.getString("ID"));

u.setName(rs.getString("NAME"));

u.setPassword(rs.getString("PASSWORD"));

}

});

return u;

}

public void update(String how)

{

String sql = how;

jdbcTemplate.update(sql);

}

public void insert(User u)

{

String sql = "insert into admin (ID,NAME,PASSWORD)
values (admin_id_seq.nextval,?,?)";

Object[] params = new Object[] {

u.getName(),

u.getPassword()};

jdbcTemplate.update(sql,params);

}

}


UserAction.class:




//测试类

public class UserAction {

public static void main(String[] args)

{

Resource resource=new
ClassPathResource("beans.xml");

BeanFactory factory = new
XmlBeanFactory(resource);

User user = (User)
factory.getBean("user");

user.selectWithTemp();

}

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring:JdbcTemplate使用指南的更多相关文章

  1. Spring JdbcTemplate框架搭建及其增删改查使用指南

    Spring JdbcTemplate框架搭建及其增删改查使用指南 前言: 本文指在介绍spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转控制的使用方法和JDBC的基 ...

  2. Spring JDBCTemplate配置使用

    一.开发环境 Windows 10 IntelliJ IDEA 2016.1 旗舰版 JDK1.8 二.项目和数据库结构 项目结构: 数据库(MySQL 5.5.39): /* Navicat MyS ...

  3. Spring boot参考指南

    介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details 带目录浏览地址:http://ww ...

  4. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  5. 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性

    2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...

  6. [转]Spring JdbcTemplate 查询分页

    原文:http://blog.csdn.net/xiaofanku/article/details/4280128 现在进行的项目由于数据库的遗留原因(设计的不堪入目)不能用hibernate.所以用 ...

  7. spring jdbcTemplate query

    1. spring jdbcTemplate query需要实现mapRow方法 package com.cdv.apolloagent.jdbc.dao.impl; import java.sql. ...

  8. Spring JdbcTemplate 的使用与学习(转)

    紧接上一篇 (JdbcTemplate是线程安全的,因此可以配置一个简单的JdbcTemplate实例,将这个共享的实例注入到多个DAO类中.辅助的文档) Spring DAO支持 http://ww ...

  9. Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用--转载

    原文地址: http://blog.csdn.net/will_awoke/article/details/12617383 一直用ORM,今天用JdbcTemplate再次抑郁了一次. 首先看下这个 ...

随机推荐

  1. java 邮件(2)

    /**  * 方法描述:发送带附件的邮件  *   * @throws UnsupportedEncodingException  */  public static boolean sendEmai ...

  2. 成为高级Java工程师,你必须要看的技术书籍

    学习的最好途径就是看书 "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的 ...

  3. Webpack探索【12】--- externals详解

    本文主要讲externals相关内容. https://segmentfault.com/a/1190000012113011

  4. 洛谷2483 k短路([SDOI2010]魔法猪学院)

    题目请戳这里 一句话题意: 给你一张n个节点,m条单向边的图,求1到n第k短的路. emmm,纪念第一个黑题(我是真的菜啊!!) 这题目还是很难的,本蒟蒻只会被洛谷卡掉的A(所以就愉快地特判了),首先 ...

  5. keras:Exception: Error when checking model target

    问题: 用keras的functional API搭建多输入多输出模型时,报错某个输出层对应的类标数组大小与模型中不一致. 解决办法:升级keras到最新版(doge脸)keras迭代太快了啊摔,总有 ...

  6. testng testcase失败重试

    简单介绍 需求场景:测试移动端应用,常会因为点击失效.网络延迟大等原因导致测试脚本失败.这时,需要自动重新运行失败的脚本,直到脚本成功通过或者到达限定重试次数. 解决方案:实现testng的IRetr ...

  7. 负载均衡,会话保持,session同步(转)

    一,什么负载均衡一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西.但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量.在这种情况 ...

  8. 电话聊天狂人 【STL】

    7-2 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...

  9. Ubuntu编译Android使用的FFmpeg

    本文介绍在Ubuntu平台编译FFmpeg库,用于Android使用.前提需要配置好NDK的环境.可以参考之前的文章Android NDK环境搭建. 下载FFmpeg 在官网下载FFmpeg源码,ht ...

  10. POJ 2348 Euclid Game (模拟题)

    Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7942   Accepted: 3227 Des ...