实现高效易用的java操作mysql包装

java

为了简化一些操作,同时为了能兼容其他数据库,因此并没用使用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);
    }

以上是 实现高效易用的java操作mysql包装 的全部内容, 来源链接: utcz.com/z/394321.html

回到顶部