在使用JDBC时,会重复的写很多重复的代码,例如

                Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql="insert into t_user(username,brithday) values(?,?)";
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql); } catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}

这部分代码在数据库操作方法中都会有。因此我们可以把这部分不变的内容提取出来,作为一个公用的方法。

例如,我们的增,删,改操作可以这样写

/**
* 增,删,改方法
* @param sql
* @param args sql参数
* @return
*/
public int update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
return ps.executeUpdate();
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}

最麻烦的就是返回一个对象的操作了。因为我不知道要返回的对象是什么,所以在往对象里设值的时候就不确定了。因此我们可以在这个类里面定义一个抽象的方法,具体怎么实现,它的子类知道。

因此我们的这个类就可以这样设计了

package com.zzg.jdbc.base;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.zzg.jdbc.exception.DaoException;
import com.zzg.jdbc.util.JdbcUtils; public abstract class BaseDao { /**
* 增,删,改方法
* @param sql
* @param args sql参数
* @return
*/
public int update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
return ps.executeUpdate();
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
} /**
* 返回一个对象
* @param <T>
* @param sql
* @param args
* @return
*/
public <T> T find(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
rs = ps.executeQuery();
T t = null;
if (rs.next()) {
t = rowMapper(rs);
}
return t;
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
} /**
* 返回一个List
* @param <T>
* @param sql
* @param args
* @return
*/
public <T> List<T> list(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
rs = ps.executeQuery();
T t = null;
List<T> list = new ArrayList<T>();
while (rs.next()) {
t = rowMapper(rs);
list.add(t);
}
return list;
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
} abstract protected <T> T rowMapper(ResultSet rs) throws SQLException; }

在使用时我们的类只需要继承上面那个类就可以了。

package com.zzg.jdbc.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List; import com.zzg.jdbc.base.BaseDao;
import com.zzg.jdbc.dao.UserDao;
import com.zzg.jdbc.domain.User; public class UserDaoImpl extends BaseDao implements UserDao { @Override
public User findUser(int id) {
String sql = "select *from t_user where id=?";
Object[] args = new Object[] { id };
User user = super.find(sql, args);
return user;
} @Override
public List<User> listUser(String username) {
String sql = "select *from t_user where username=?";
Object[] args = new Object[] { username };
List<User> list = super.list(sql, args);
for (User u : list) {
System.out.println(u.getId());
}
return list;
} @Override
protected Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setBrithday(rs.getDate("brithday"));
return user;
} }

附加分页的方法:

/**
* 分页
* @param tableName
* @param PK
* @param methodPageNum
* @param methodNumPerPage
* @param conditions
* @param <T>
* @return
* @throws SQLException
*/
public <T> List<T> getPageListResultSet(String tableName,String PK,int methodPageNum,int methodNumPerPage,Map<String,String> conditions) throws SQLException{
int pageNum = methodPageNum==0?DEFAULT_PAGE_NUM:methodPageNum;
int numPerPage = methodNumPerPage==0?DEFAULT_NUM_PER_PAGE:methodNumPerPage;
List<T> list = null;
DataSetOp dataSetOp = null;
try {
dataSetOp = new DataSetOp();
String PAGE_SQL_PREFIX = " SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY t1.ID DESC) AS ROW_NUM, t1.* FROM ";
String PAGE_SQL_END = " ) TT WHERE TT.ROW_NUM >? AND TT.ROW_NUM <= ? ";
if(StringUtil.isNotBlank(PK)){
PAGE_SQL_PREFIX = PAGE_SQL_PREFIX.replace("ID",PK);
}
StringBuffer sql = new StringBuffer(PAGE_SQL_PREFIX);
sql.append(tableName).append(" t1 WHERE 1=1 ");
//设置条件
if(conditions!=null && conditions.size()>0){
Set<String> key = conditions.keySet();
for (Iterator it = key.iterator(); it.hasNext();) {
String column = (String) it.next();
//System.out.println(conditions.get(s));
StringBuffer cd = new StringBuffer(" and t1.");
cd.append(column).append("='").append(conditions.get(column)).append("' ");
sql.append(cd);
}
}
sql.append(PAGE_SQL_END);
System.out.println(sql);
PreparedStatement ps = dataSetOp.getConnection().prepareStatement(sql.toString());
ps.setInt(1, (pageNum - 1) * numPerPage);
ps.setInt(2, pageNum*numPerPage);
ResultSet rs = ps.executeQuery();
T t = null;
list = new ArrayList<T>();
while (rs.next()) {
t = rowMapper(rs);
list.add(t);
}
} catch (DataException e) {
e.printStackTrace();
}finally{
if(dataSetOp != null) dataSetOp.close();
}
return list;
}

使用模板方法模式简化JDBC操作的更多相关文章

  1. 使用JdbcTemplate简化JDBC操作 实现数据库操作

    使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...

  2. 使用Spring简化JDBC操作数据库

    Spring的开发初衷是为了减轻企业级开发的复杂度,其对数据库访问的支持亦如此,使用Spring访问数据库能带来以下好处: 1.1     简化代码 使用原生的JDBC访问数据库,一般总是要执行以下步 ...

  3. 使用Spring的jdbcTemplate进一步简化JDBC操作

    先看applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <b ...

  4. headfirst设计模式(9)—模板方法模式

    前言 这一章的模板方法模式,个人感觉它是一个简单,并且实用的设计模式,先说说它的定义: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下, ...

  5. Spring 对JDBC操作的支持

    1.Spring 对JDBC操作的支持 Spring对jdbc技术提供了很好的支持,体现在: 1.Spring对c3p0连接池的支持很完善 2.Spring对jdbc提供了jdbcTemplate,来 ...

  6. Spring JDBC Framework详解——批量JDBC操作、ORM映射

    转自:https://blog.csdn.net/yuyulover/article/details/5826948 一.spring JDBC 概述 Spring 提供了一个强有力的模板类JdbcT ...

  7. C#学习笔记-模板方法模式

    题目:同学摘抄老师给的试卷并给出自己的对应的答案. 实现: static void Main(string[] args) { Console.WriteLine("学生甲抄的试卷:&quo ...

  8. Java Dao模式通过JDBC连接数据库的操作

    Java程序访问数据库: 1.获取数据库厂商提供的驱动(jdbc接口的实现类) 如ojdbc14.jar——Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin ...

  9. 使用Spring JDBCTemplate简化JDBC的操作

    使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...

随机推荐

  1. [Grunt] External Config

    Let's combine uglifying, watching, and config stuff into one Grunt file to make it more of a standar ...

  2. Android通过反射打造能够存储不论什么对象的万能SharedPreferences

    我们通常使用SharedPreferences存储一些须要保存在本地.但又不至于存储在数据库里的一些数据.一般我们用它来存储一些username,password等数据是很方便的,那么假设我们想要存储 ...

  3. Android:Volley源代码解析

    简单实例 Volley是一个封装HttpUrlConnection和HttpClient的网络通信框架,集AsyncHttpClient和Universal-Image-Loader的长处于了一身.既 ...

  4. KineticJS教程(8)

    KineticJS教程(8) 作者: ysm  8.动画 动画就是一帧帧的画面按照时间间隔显示出来,Kinetic给我们提供了一个舞台对象的onFrame方法,用这个方法可以绑定一个动画方法,我们要显 ...

  5. 显示游戏FPS帧率的几种计算方式

    FPSDisplay.cs using UnityEngine; using System.Collections; public class FPSDisplay : MonoBehaviour { ...

  6. ACM 刷题错误总结 持续更新并持续回想中o(╯□╰)o

    一.段错误/RE 1.& 变量取地址 2.数组越界 3.爆栈, 非常可能是死循环,ruturn的边界没有处理好,或者是递归的内容里有死循环的部分. 4.线段树 逢写必错,都是build(i*2 ...

  7. Burning widget

    This is a widget that we can see in Nero, K3B, or other CD/DVD burning software. #!/usr/bin/python # ...

  8. flip 翻转效果 css3实现

    1.实现代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...

  9. [odroid-pc] ubuntu12.04 64bit Android4.0.3 源码编译报错及解决的方法

    第一个错误:         host Executable: cmu2nuance (out/host/linux-x86/obj/EXECUTABLES/cmu2nuance_intermedia ...

  10. HTML-IE6复制BUG

    在IE6下使用浮动可能会出现文字重复的情况. 在IE6下,浮动层之间有注释文字的话,之前那个浮动层的内容文字就有可能遭遇一个“隐形”的复制,但是代码里查看文字可并没有多出来. 看个例子: XML/HT ...