惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
量子位
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
B
Blog
U
Unit 42
C
Check Point Blog
I
InfoQ
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
云风的 BLOG
云风的 BLOG
宝玉的分享
宝玉的分享
爱范儿
爱范儿

博客园 - Birdshover

express-partials与express4.x不兼容问题 选择结构(if..else..,switch,try..catch..)的拆分 该省代码的地方要省,反之亦然。 dell笔记本的Broadcom 802.11b/g 无线网卡ubuntu 9.10下安装 四步完成跨平台调用——thrift的开发应用 facebookde 的 NoSQL数据库cassandra的配置与调用(java&&c#) VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题 大道化简,重构的艺术 读自己的书,走自己的路 厨师炒菜与网站反爬虫问题 jre6的webservice使用Php类库nusoap调用的问题 - Birdshover - 博客园 mysql master/slave 使用感受 java开发守护进程 部分NLuke版本源码更新(2009-11-1) 单件模式的陷阱 一个不必要的设计 网站、数据库的衍变之路(六) 网站、数据库的衍变之路(五) ASP.NET Forms验证的安全性问题研究——为什么加密代码需要配置为服务
实现高效易用的java操作mysql包装
Birdshover · 2009-11-26 · via 博客园 - Birdshover

为了简化一些操作,同时为了能兼容其他数据库,因此并没用使用SqlHelper的形式。
这只是个简单模型的开发方式,没用纳入数据连接池等内容。

我看了网上大部分的SqlHelper在类型转换方面都很有问题,而且返回结果使用ArrayList包装了一下。在这里的包装主要是为了避免这两个问题。

首先申明数据库接口,这代表了一个数据库能进行的操作。

package dao;import java.sql.SQLException;public interface Database {
    
int ExecuteNoneQuery(String cmdtext, Parameters parms) throws SQLException;<T> T ExecuteObject(Data2Object<T> convertor, String cmdtext,
            Parameters parms) 
throws SQLException;

    Object ExecuteScalar(String cmdtext, Parameters parms) 

throws SQLException;
    Parameters CreateFixedParms(
int size);
}

实现该接口的MySql包装形式,其实和SqlHelper差不多:

package dao;import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class MySqlDatabase implements Database {
    
private Connection conn;public MySqlDatabase(String connString) throws SQLException {
        conn 
= DriverManager.getConnection(connString);
    }
public int ExecuteNoneQuery(String cmdtext, Parameters parms)
            
throws SQLException {
        PreparedStatement pstmt 
= null;
        
try {
            pstmt 
= conn.prepareStatement(cmdtext);
            prepareCommand(pstmt, parms);
            
return pstmt.executeUpdate();
        } 
catch (Exception ex) {
        } 
finally {
            
if (pstmt != null) {
                pstmt.clearParameters();
                pstmt.close();
            }
            
if (conn != null)
                conn.close();
        }
        
return -1;
    }
public <T> T ExecuteObject(Data2Object<T> convertor, String cmdtext,
            Parameters parms) 
throws SQLException {
        PreparedStatement pstmt 
= null;
        ResultSet rs 
= null;
        
try {
            pstmt 
= conn.prepareStatement(cmdtext);

            prepareCommand(pstmt, parms);
            rs 

= pstmt.executeQuery();return convertor.DataMap(rs);
        } 
catch (Exception ex) {
        } 
finally {
            
if (rs != null)
                rs.close();
            
if (pstmt != null)
                pstmt.close();
            
if (conn != null)
                conn.close();
        }
        
return null;
    }
public Object ExecuteScalar(String cmdtext, Parameters parms)
            
throws SQLException {
        PreparedStatement pstmt 
= null;
        ResultSet rs 
= null;
        
try {
            pstmt 
= conn.prepareStatement(cmdtext);
            prepareCommand(pstmt, parms);

            rs 

= pstmt.executeQuery();
            
if (rs.next()) {
                
return rs.getObject(1);
            } 
else {
                
return null;
            }
        } 
catch (Exception e) {
        } 
finally {
            
if (rs != null)
                rs.close();
            
if (pstmt != null)
                pstmt.close();
            
if (conn != null)
                conn.close();
        }
        
return null;
    }
private void prepareCommand(PreparedStatement pstmt, Parameters parms)
            
throws SQLException {
        
if (parms != null && parms.getLength() > 0) {
            
for (int i = 0; i < parms.getLength(); i++) {
                MySqlParameter parm 
= parms.getParameter(i);
                String value 
= parm.getValue().toString();
                
switch (parm.getType()) {
                
case String:
                    pstmt.setString(i 
+ 1, value);
                    
break;
                
case Int16:
                    pstmt.setShort(i 
+ 1, Short.parseShort(value));
                    
break;
                
case Int32:
                    pstmt.setInt(i 
+ 1, Integer.parseInt(value));
                    
break;
                
case Int64:
                    pstmt.setLong(i 
+ 1, Long.parseLong(value));
                    
break;
                
case DateTime:
                    pstmt.setDate(i 
+ 1, Date.valueOf(value));
                    
break;
                
default:
                    pstmt.setObject(i 
+ 1, value);
                    
break;
                }
            }
        }
    }
static {
        
try {
            Class.forName(
"com.mysql.jdbc.Driver").newInstance();
        } 
catch (Exception ex) {
        }
    }
public Parameters CreateFixedParms(int size) {
        
return new FixedParameters(size);
    }
}

Data2Object<T>接口负责将ResultSet转换为对象。

package dao;import java.sql.ResultSet;
import java.sql.SQLException;public interface Data2Object<T> {
    
public T DataMap(ResultSet rs) throws SQLException;
}

DatabaseManager负责调用

package dao;import java.sql.SQLException;public abstract class DatabaseManager {
    
public static Database getMySqlDatabase() throws SQLException{
        
return new MySqlDatabase("jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=UTF-8");
    }
}

申明数据库枚举类型

package dao;public enum DBType {
    String,
    Int16,
    Int32,
    Int64,
    DateTime,
}

无参数调用的情况:

package bean;import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import dao.Data2Object;
import dao.Database;
import dao.DatabaseManager;
import dao.SqlHelper;public class ListBean {
    
public List<TestBean> Find() throws SQLException{
        String sql 
= "select * from TestTable";
        Database db 
= DatabaseManager.getMySqlDatabase();
        
return db.ExecuteObject(new ListConvertor(), sql, null);
    }
    
    
public class ListConvertor implements Data2Object<List<TestBean>>{
        
public List<TestBean> DataMap(ResultSet rs) throws SQLException  {
            List
<TestBean> tests = new ArrayList<TestBean>();
            
while (rs.next()) {
                TestBean bean 
= new TestBean();
                bean.setId(rs.getInt(
1));
                bean.setName(rs.getString(
2));
                tests.add(bean);
            }
            
return tests;
        }
    }
}


申明参数接口

package dao;public interface Parameters {
    
void Add(MySqlParameter parm);
    
int getLength();
    MySqlParameter getParameter(
int i);
}

实现该接口

package dao;public class MySqlParameter {
    
private DBType type;
    
private int len;
    
public MySqlParameter(DBType type, int len, Object value) {
        
super();
        
this.type = type;
        
this.len = len;
        
this.value = value;
    }
    
/**
     * 
@return the type
     
*/
    
public DBType getType() {
        
return type;
    }
    
/**
     * 
@param type the type to set
     
*/
    
public void setType(DBType type) {
        
this.type = type;
    }
    
/**
     * 
@return the len
     
*/
    
public int getLen() {
        
return len;
    }
    
/**
     * 
@param len the len to set
     
*/
    
public void setLen(int len) {
        
this.len = len;
    }
    
/**
     * 
@return the value
     
*/
    
public Object getValue() {
        
return value;
    }
    
/**
     * 
@param value the value to set
     
*/
    
public void setValue(Object value) {
        
this.value = value;
    }
    
private Object value;
}

包装定长参数数组

package dao;public class FixedParameters implements Parameters {
    
private MySqlParameter[] parms;
    
private int ptr = 0;
    
    
public FixedParameters(int size){
        parms 
= new MySqlParameter[size];
    }
    
public void Add(MySqlParameter parm) {
        parms[ptr] 
= parm;
        ptr
++;
    }
public MySqlParameter[] getBuffer() {
        
return parms;
    }
public int getLength() {
        
return parms.length;
    }
public MySqlParameter getParameter(int i) {
        
return parms[i];
    }

}

添加操作,这里包装地还不够好,没在调用部分把MySql专有方式隔离出去。懒得再写个继承关系了,将就一下把,呵呵

    public int Add(TestBean test) throws SQLException{
        String sql 
= "insert into TestTable (name) values (?);";
        Database db 
= DatabaseManager.getMySqlDatabase();
        Parameters parms 
= db.CreateFixedParms(1);
        parms.Add(
new MySqlParameter(DBType.String,0,test.getName()));
        
return db.ExecuteNoneQuery(sql, parms);
    }