菜鸟写的JDBC封装,望前辈指出不足地方!
先介绍一下功能: 1.数据库连接地址从配置文件中获取
2.支持命名参数设置(如: select * from t_user where f_userName = :username)
3.批量插入、更新 使用同一个connncetion
使用:
public class StockSend {
Log LOG = LogFactory.getLog(StockSend.class);
WarningEnvironment env = new WarningEnvironment();
SaveRemind send = new SaveRemind();
MySqlUtil mySqlUtil = new MySqlUtil(env.db_stock_warning, env.DB_STOCK_USER, env.DB_STOCK_PASSWORD);
public List<StockSendUser> sendAllUser(){
List<StockSendUser> stockSends = new ArrayList<StockSendUser>();
String sql = "select * from db_stock_warning.t_warning_task where f_send_state = 0";
stockSends = mySqlUtil.queryForList(sql, callBack);
return stockSends;
}
MysqlQueryCallBack callBack = new MysqlQueryCallBack() {//查询对象封装回调接口
@Override
public Object next(ResultSet rs) throws Exception {
StockSendUser stock = new StockSendUser();
stock.setUin(rs.getString("f_uin"));
stock.setStock_code(rs.getString("f_stock_code"));
stock.setStock_name(rs.getString("f_stock_name"));
stock.setPrice(rs.getDouble("f_price"));
stock.setStock_higher(rs.getDouble("f_stock_higher"));
stock.setStock_less(rs.getDouble("f_stock_less"));
return stock;
}
};
public void updateStockSend(StockSendUser stock){
String sql="update from db_stock_warning.t_warning_task set f_send_state = 1 where f_uin= ? and f_date= ? and f_stock_code=? and f_price = ? ";
mySqlUtil.insertOrUpdate(sql, parameter, stock);
}
MysqlParameterCallBack parameter = new MysqlParameterCallBack() {//参数设置回调接口
@Override
public void setParameter(PreparedStatement ps, Object o) throws Exception {
StockSendUser stock = (StockSendUser)o;
int i=1;
ps.setString(i++, stock.getUin());
ps.setString(i++, stock.getDate());
ps.setString(i++, stock.getStock_code());
ps.setDouble(i++, stock.getPrice());
}
};
核心类:
package com.tenpay.fund.util.pub.JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* jdbc连接 处理类
* @author W_xieqi
*
*/
public class MySqlUtil {
private final String mysql_url;
private final String user ;
private final String password ;
private Log log = LogFactory.getLog(MySqlUtil.class);
public MySqlUtil(String mysql_url,String user,String password ) {
this.mysql_url= mysql_url;
this.user = user;
this.password = password;
}
//获得连接
public Connection getConnection() {
// 建立连接
Connection con = null;
try {
if (con == null || con.isClosed()) {
Class.forName("com.mysql.jdbc.Driver");//这里应该也应该放到配置文件中
con = DriverManager.getConnection(mysql_url, user,
password);
}
} catch (Exception e) {
log.error("re create connection error", e);
}
return con;
}
/**
* 关闭连接方法
*/
public void closeConnection(Connection con){
try {
//连接不为空,并且连接未关闭
if(con !=null && !con.isClosed()){
con.close();
}
} catch (SQLException e) {
log.error("close connection error", e);
}
}
/**
* 关闭PreparedStatement
*/
public void closePreparedStatement(PreparedStatement ps){
try {
if(ps != null && !ps.isClosed()){
ps.close();
}
} catch (SQLException e) {
log.error("close PreparedStatement excption",e);
}
}
/**
* 关闭PreparedStatement
*/
public void closeNamedParameterStatement(NamedParameterStatement ps){
try {
if(ps != null ){
ps.close();
}
} catch (SQLException e) {
log.error("closeNamedParameterStatement excption",e);
}
}
/**
* 关闭PreparedStatement
*/
public void closeResultSet(ResultSet rs){
try {
if(rs != null && !rs.isClosed()){
rs.close();
}
} catch (SQLException e) {
log.error("close ResultSet excption",e);
}
}
/**
* 插入和更新操作
* @param sql 带参数
* @param callBack 回调设参数
* @return 影响的行数
*/
public int insertOrUpdate(String sql,MysqlParameterCallBack parameter,Object o){
return update(sql,parameter,o,null);
}
/**
* 插入和更新(批量操作 connncetion 关闭由调用者关闭)
* @param sql 执行的sql语句
* @param parameter 参数中?
* @param o
* @param noClose 封装代码中不 关闭连接(一次连接多次操作)
* @return
*/
public int insertOrUpdate(String sql,MysqlParameterCallBack parameter,Object o,Connection noCloseCon){
return update(sql,parameter,o,noCloseCon);
}
/**
* 插入和更新(批量操作 connncetion 关闭由调用者关闭)
* @param sql 执行的sql语句
* @param parameter 命名参数设置
* @param o 参数值获取对象
* @param noCloseCon 调用者自己获取的连接
* @return
*/
public int insertOrUpdate(String sql,MysqlNameParameterCallBack parameter,Object o,Connection noCloseCon){
return updateByNameParameter(sql, parameter, o, noCloseCon);
}
/**
* 插入和更新
* @param sql 执行的sql语句
* @param parameter 命名参数设置
* @param o 参数值获取对象
* @return
*/
public int insertOrUpdate(String sql,MysqlNameParameterCallBack parameter,Object o){
return updateByNameParameter(sql, parameter, o, null);
}
/**
* 执行更新和插入操作
* @param sql 执行的sql语句
* @param parameter 参数
* @param o 参数值获取对象
* @param noCloseCon 不关闭连接(这里主要用在批量操作,一次连接,多次update/insert)
* @return
*/
private int updateByNameParameter(String sql,MysqlNameParameterCallBack parameter,Object o,Connection noCloseCon){
int count = 0 ;
Connection con = null;
if(noCloseCon == null)//如果调用者传了connncetion
con = getConnection();
else
con = noCloseCon;
NamedParameterStatement nps = null;
try {
nps = new NamedParameterStatement(con, sql);
parameter.setParameter(nps, o);
count = nps.executeUpdate();
} catch (Exception e) {
log.error("命名参数错误",e);
}finally{
closeNamedParameterStatement(nps);
if(noCloseCon == null){
closeConnection(con);
}
}
return count;
}
private int update(String sql,MysqlParameterCallBack parameter,Object o,Connection noCloseCon){
int count = 0 ;
Connection con = null;
if(noCloseCon == null)//如果调用者传了connncetion
con = getConnection();
else
con = noCloseCon;
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql);
if(parameter != null && o != null){
parameter.setParameter(ps,o);
}
count = ps.executeUpdate();
} catch (Exception e) {
log.error("close PreparedStatement excption",e);
}finally{
closePreparedStatement(ps);
if(noCloseCon == null){
closeConnection(con);
}
}
return count;
}
/**
* 插入和更新操作
* @param sql 不带参数
* @return 影响的行数
*/
public int insertOrUpdate(String sql){
return update(sql,null,null,null);
}
private List query(String sql,MysqlParameterCallBack parameter,MysqlQueryCallBack query,Object o){
List list = new ArrayList();
Connection con = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = con.prepareStatement(sql);
if(parameter != null && o != null){
parameter.setParameter(ps,o);
}
rs = ps.executeQuery();
while(rs.next()){
list.add(query.next(rs));
}
} catch (Exception e) {
log.error("select exception ",e);
}finally{
closeResultSet(rs);
closePreparedStatement(ps);
closeConnection(con);
}
return list;
}
/**
* 查询 带参数
* @param sql
* @param parameter
* @param query
* @return 结果集
*/
public List queryForList(String sql,MysqlParameterCallBack parameter,MysqlQueryCallBack query,Object o){
return query(sql, parameter, query,o);
}
/**
* 查询不 带参数
* @param sql
* @param parameter
* @param query
* @return 结果集
*/
public List queryForList(String sql,MysqlQueryCallBack query){
return query(sql, null, query,null);
}
}
附件中有详细代码,多多指点.!
下面是批量插入代码,通过命名参数赋值。
public int update(StockInfoEntity stockInfo,Connection con){
String sql ="update db_stock.db_stock_info set " +
"f_stock_name=:stockName,f_pinyin=:pinyin,f_stock_type_id=:stockTypeId " +
"where f_stock_code=:stockCode and f_exchange=:exchange";
return mySqlUtil.insertOrUpdate(sql,parameter,stockInfo,con);
}
public void insert(StockInfoEntity stockInfo,Connection con){
String sql = "insert db_stock.db_stock_info(f_exchange,f_stock_code,f_stock_name,f_pinyin,f_stock_type_id)" +
"value(:exchange,:stockCode,:stockName,:pinyin,:stockTypeId)";
mySqlUtil.insertOrUpdate(sql,parameter,stockInfo,con);
}
MysqlNameParameterCallBack parameter = new MysqlNameParameterCallBack() {
public void setParameter(NamedParameterStatement ps, Object o)
throws Exception {
StockInfoEntity stockInfo = (StockInfoEntity)o;
ps.setString("exchange", stockInfo.getExchange());
ps.setString("stockCode", stockInfo.getStock_code());
ps.setString("stockName", stockInfo.getStock_name());
ps.setString("pinyin", stockInfo.getPinyin());
ps.setInt("stockTypeId", stockInfo.getStock_type_id());
}
};
分享到:
相关推荐
实现完全的对jdbc对象的封装,只需调用则可对数据库进行CRUD操作
JDBC的封装,(含预编译,结果集等),执行DML有参、执行DML无参、执行DQL无参及有参
JDBC封装的工具类,将所有共同的代码提取过来,形成工具类
游戏服务器 数据库连接池 jdbc 简单封装
本资源是对JDBC的封装,方便在项目中使用,其中BaseDao.java是对JDBC操作的封装,使用时让自己的Dao类继承即可,然后调用其中的executeQuery和executeOthe分别执行DQL和DML操作。dbinfo.properties属性文件存储基本...
NULL 博文链接:https://vincent1003.iteye.com/blog/943618
现在的数据层的开发,大多会使用...但是在一些极端的场景下往往原生的jdbc方式操作数据库更灵活,性能更高。由于部分场景下MyBatis或JPA之类无法满足我的需求,所以我打算自己封装一套查数据库的工具类。 文章地址: ...
自己封装好的,基于commons的DBBase,DBCP的数据库工具。支持线程池,支持直接对象化操作。即无需任何映射,只要是java标准类,属性带标准set、get,属性名称与查询结果集中字段名称相同,就可以直接查询出对象链表...
jdbc 封装例子 jdbc 封装例子 jdbc 封装例子 jdbc 封装例子
关于Java Web的Servlet+JDBC(封装)+JSP的登录(送给入门的你)
jdbc封装工具类,此类事封装成list,Object>>格式,可直接把转换为jsonArray格式传输数据。
jdbc封装处理类 jdbc封装处理类
Java JDBC封装类,带增删改查例子,支持oracle,MySql,hsqldb 等,支持事务,返回数据格式 支持二维数组,MAP格式,以及javabean对象。有利于初学者DbDemo.java为demo,Connect为jdbc封装类,可以作为项目共通类使用。
深入JDBC高级封装,包括jdbc核心机制以及ormaping框架hibernate ,ejb
文档脉络清楚的详述了实现JDBC封装所需要进行的步骤。
jdbc封装(实现对实体的增删改查[分页]),辅助学习Hibernate 包含三个文件夹,分别是: code-access实现 是用access实现的,本意是access方便,就一个文件,方便部署。但access有好多不支持,就写成这样.主要是可参考Dao...
java增删改查JDBC封装类(泛型封装),这个是高度封装化的,增删改查,直接用到我的项目中去的。
简单的jdbc封装,添加了详细的注视内容。更容易理解。
一个完整的JDBC封装类,帮助我们更快的编程