使用模板方法模式简化JDBC操作
在使用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操作的更多相关文章
- 使用JdbcTemplate简化JDBC操作 实现数据库操作
使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...
- 使用Spring简化JDBC操作数据库
Spring的开发初衷是为了减轻企业级开发的复杂度,其对数据库访问的支持亦如此,使用Spring访问数据库能带来以下好处: 1.1 简化代码 使用原生的JDBC访问数据库,一般总是要执行以下步 ...
- 使用Spring的jdbcTemplate进一步简化JDBC操作
先看applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <b ...
- headfirst设计模式(9)—模板方法模式
前言 这一章的模板方法模式,个人感觉它是一个简单,并且实用的设计模式,先说说它的定义: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下, ...
- Spring 对JDBC操作的支持
1.Spring 对JDBC操作的支持 Spring对jdbc技术提供了很好的支持,体现在: 1.Spring对c3p0连接池的支持很完善 2.Spring对jdbc提供了jdbcTemplate,来 ...
- Spring JDBC Framework详解——批量JDBC操作、ORM映射
转自:https://blog.csdn.net/yuyulover/article/details/5826948 一.spring JDBC 概述 Spring 提供了一个强有力的模板类JdbcT ...
- C#学习笔记-模板方法模式
题目:同学摘抄老师给的试卷并给出自己的对应的答案. 实现: static void Main(string[] args) { Console.WriteLine("学生甲抄的试卷:&quo ...
- Java Dao模式通过JDBC连接数据库的操作
Java程序访问数据库: 1.获取数据库厂商提供的驱动(jdbc接口的实现类) 如ojdbc14.jar——Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin ...
- 使用Spring JDBCTemplate简化JDBC的操作
使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...
随机推荐
- [Grunt] External Config
Let's combine uglifying, watching, and config stuff into one Grunt file to make it more of a standar ...
- Android通过反射打造能够存储不论什么对象的万能SharedPreferences
我们通常使用SharedPreferences存储一些须要保存在本地.但又不至于存储在数据库里的一些数据.一般我们用它来存储一些username,password等数据是很方便的,那么假设我们想要存储 ...
- Android:Volley源代码解析
简单实例 Volley是一个封装HttpUrlConnection和HttpClient的网络通信框架,集AsyncHttpClient和Universal-Image-Loader的长处于了一身.既 ...
- KineticJS教程(8)
KineticJS教程(8) 作者: ysm 8.动画 动画就是一帧帧的画面按照时间间隔显示出来,Kinetic给我们提供了一个舞台对象的onFrame方法,用这个方法可以绑定一个动画方法,我们要显 ...
- 显示游戏FPS帧率的几种计算方式
FPSDisplay.cs using UnityEngine; using System.Collections; public class FPSDisplay : MonoBehaviour { ...
- ACM 刷题错误总结 持续更新并持续回想中o(╯□╰)o
一.段错误/RE 1.& 变量取地址 2.数组越界 3.爆栈, 非常可能是死循环,ruturn的边界没有处理好,或者是递归的内容里有死循环的部分. 4.线段树 逢写必错,都是build(i*2 ...
- Burning widget
This is a widget that we can see in Nero, K3B, or other CD/DVD burning software. #!/usr/bin/python # ...
- flip 翻转效果 css3实现
1.实现代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...
- [odroid-pc] ubuntu12.04 64bit Android4.0.3 源码编译报错及解决的方法
第一个错误: host Executable: cmu2nuance (out/host/linux-x86/obj/EXECUTABLES/cmu2nuance_intermedia ...
- HTML-IE6复制BUG
在IE6下使用浮动可能会出现文字重复的情况. 在IE6下,浮动层之间有注释文字的话,之前那个浮动层的内容文字就有可能遭遇一个“隐形”的复制,但是代码里查看文字可并没有多出来. 看个例子: XML/HT ...