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


    为了简化一些操作,同时为了能兼容其他数据库,因此并没用使用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);
        }
  • 相关阅读:
    kali linux DDos攻击
    js基础接替上回的作用域
    js基础的知识函数和作用域
    写作是最好的思考
    eclipse 常用操作(转载)
    网页中用jquery validate 验证表单输入项
    eclipse5.5添加反编译插件
    velocity 实现td 中月份的多选框
    LinckedhashMap原理
    api服务端接口安全
  • 原文地址:https://www.cnblogs.com/birdshover/p/1611586.html
Copyright © 2020-2023  润新知