连接数据库这是程序员经常使用的操作了。我之前做了一个简单的连接mysql的类,但是适用性不好,所以萌生做一个数据库连接、操作类。

用了大概一天时间写出了这个类

image

可以看到有2个构造函数,一个接收数据库类型(mysql、oracle、sqlserver),数据库地址,数据库名称。另一个构造函数可以多一个指定端口的参数。构造函数通过调用private的url(int) 方法组装数据库连接URL字符串。

还提供了:

connect(String,String) 接收用户名和密码 然后加载数据库驱动 连接数据库

getDataBaseURL() 返回数据库连接URL

getConn() 在连接成功后调用此方法返回Connection对象

query(String) 接收完整的sql语句进行查询操作,然后ResultSet结果集

update(String) 接收完整的sql语句进行增删改操作,返回受影响的行数

insertUpdate(String,String[],String[]) 接收数据表名称,参数列表,参数值列表。并使用PreparedStatement进行插入数据操作

changeUpdate(String,String[],String[],String[],String[]),String) 接收数据表名称,set参数列表,set参数值列表,where参数列表,where参数值列表,where逻辑(and或者or,无法混合判断)。并使用PreparedStatement进行修改数据操作

deleteUpdate(String,String[],String[],String) 接收数据表名称,where参数列表,where参数值列表,where逻辑(and或者or,无法混合判断,那样造成的复杂性相比方法提供的易用性得不偿失)。并使用PreparedStatement进行删除数据操作

 

我测试使用的数据库版本:

mysql:5.1.73

oracle: 12c

sqlserver: 2014

jdk版本:1.7

用到的jar:http://pan.baidu.com/s/1mgR8HBE

如果是不同的jdk版本,比如jdk1.5无法使用我使用的sqlserver Jar包

 

下面贴代码:

package com.k.demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 
 * @author 周广
 * @time 2016/2/22
 * @see 为方便连接数据库而封装的一个类 有2个不同的构造函数
 *         主要方法是connect()连接数据库
 *         getConn() 返回Connection对象
 *      query(String) 接受完整的sql语句字符串,返回ResultSet结果集 
 *      update(String) 接受完整的sql语句字符串,返回一个受影响的数据行数 
 *      另外还有插入、修改、删除这三个封装方法,使用方法请看方法注释
 */
public class SqlConnect {

    // 定义数据库驱动
    private String driver;

    // 定义数据库连接字符串,数据需要给远程登录权限
    private final String dataBaseURL;

    // 定义一个指定数据库类型的字符串
    private String dataBaseType;

    // 定义一个指定数据库地址的字符串
    private String dataBaseAddress;

    // 定义一个指定数据库名的字符串
    private String dataBaseName;

    // 定义一个指定数据库端口的字符串
    private String dataBasePort;

    // 定义一个数据库连接对象引用
    private Connection conn;

    /**
     * @see 构造函数接收初始化参数并调用方法合成数据库URL
     * @param dataBaseType
     *            数据库类型:mysql oracle sqlserver
     * @param dataBaseAddress
     *            数据库地址
     * @param dataBaseName
     *            数据库名称
     */
    public SqlConnect(String dataBaseType, String dataBaseAddress,
            String dataBaseName) {
        this.dataBaseType = dataBaseType;
        this.dataBaseAddress = dataBaseAddress;
        this.dataBaseName = dataBaseName;
        this.dataBaseURL = url(0); // 传入0代表让url组装方法使用默认端口
    }

    /**
     * 
     * @see 这个构造函数用于数据库端口不是默认端口的情况
     * @param dataBaseType
     *            数据库类型:mysql oracle sqlserver
     * @param dataBaseAddress
     *            数据库地址
     * @param dataBaseName
     *            数据库名称
     * @param dataBasePort
     *            数据库端口
     */
    public SqlConnect(String dataBaseType, String dataBaseAddress,
            String dataBaseName, String dataBasePort) {
        this.dataBaseType = dataBaseType;
        this.dataBaseAddress = dataBaseAddress;
        this.dataBaseName = dataBaseName;
        this.dataBasePort = dataBasePort;
        this.dataBaseURL = url(1);// 传入1代表让url组装方法使用外部传入的端口
    }

    
    /**
     * 
     * @return 返回数据库连接URL
     */
    public String getDataBaseURL() {
        return dataBaseURL;
    }

    /**
     * 
     * @param username
     *            连接数据库的用户名
     * @param password
     *            连接数据库的密码
     * @throws ClassNotFoundException
     *             加载数据库驱动失败时抛出异常
     * @throws SQLException
     *             连接数据库失败时抛出异常
     * @see 本方法用于加载数据库及连接数据库
     */
    public void connect(String username, String password)
            throws ClassNotFoundException, SQLException {
        try {
            Class.forName(driver);
            System.out.println("Database driver loaded successfully...");
            try {
                conn = DriverManager.getConnection(dataBaseURL, username,
                        password);
                if (!conn.isClosed()) {
                    System.out.println("Database connection is successful...");
                }
            } catch (SQLException e) {
                throw new SQLException();
            }
        } catch (ClassNotFoundException e1) {
            throw new ClassNotFoundException("Database driven load failure...");
        }
    }

    /**
     * 
     * @return 数据库连接成功后,可调用此方法返回Connection对象
     */
    public Connection getConn() {
        return conn;
    }

    /**
     * @see
     * @param sql
     *            接受一个完整的sql查询语句
     * @return 返回一个数据集
     * @throws SQLException
     *             查询数据库失败的时候抛出异常
     */
    public ResultSet query(String sql) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
        } catch (SQLException e) {
            throw new SQLException();
        }
        return rs;
    }

    /**
     * @param 接收一个sql语句进行数据库增删改操作
     * @return 返回受影响的数据行数,返回0代表失败。
     * @throws SQLException
     *             数据库操作失败的时候抛出异常
     */
    public int update(String sql) throws SQLException {
        PreparedStatement ps = null;
        int code = 0;
        try {
            ps = conn.prepareStatement(sql);
            // 当执行数据库操作长时间不成功时,会在这阻塞
            code = ps.executeUpdate();
        } catch (SQLException e) {
            throw new SQLException();
        }
        return code;
    }

    /**
     * 
     * @param table
     *            需要插入数据的表名
     * @param params
     *            参数数组
     * @param values
     *            数据数组
     * @return 返回修改数据的行数 如果返回0表示未改变数据表,如果返回-1表示传入的参数有误
     * @throws SQLException
     *             如果插入操作失败抛出异常
     */
    public int insertUpdate(String table, String params[], String values[])
            throws SQLException {
        StringBuilder param = new StringBuilder();
        StringBuilder value = new StringBuilder();
        int code = 0;
        if (table.length() > 0 && params.length > 0 && values.length > 0
                && params.length == values.length) {
            for (int i = 0; i < params.length; i++) {
                int j = params.length - 1;
                if (i != j) {
                    param.append(params[i] + ",");
                    value.append("?,");
                } else {
                    param.append(params[i]);
                    value.append("?");
                }
            }
        } else {
            System.err.println("SQL Parameters not compatible...");
            return -1;
        }

        String sql = "insert into " + table + "(" + param.toString() + ")"
                + " values(" + value.toString() + ")";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            for (int i = 1; i <= values.length; i++) {
                ps.setString(i, values[i - 1]);
            }
            code = ps.executeUpdate();
        } catch (SQLException e) {
            throw new SQLException();
        }
        return code;
    }

    /**
     * @see 这是一个用于执行修改操作的方法,参数太多。用起来可能不太好用。
     * @param table
     *            传入需要进行修改的数据表名称
     * @param sets
     *            传入需要改变的数据表字段名称 比如:set name=?, password=? sets就包含了name和password
     *            可有多个但必须与setValues对应
     * @param setValues
     *            传入对应name和password的值,也就是name=? 这个?
     * @param wheres
     *            传入where的参数,比如:where name=? and password=? 这个name和password
     *            可有多个但必须与whereValues对应
     * @param whereValues
     *            传入where参数的值 name='周广' 就是这个'周广'
* @param whereLogic 接受and或or 不做混合判断 *
@return 返回受到影响的行数 如果返回0表示未改变数据表,如果返回-1表示传入的参数有误 * @throws SQLException * 执行修改行为失败后抛出异常 */ public int changeUpdate(String table, String sets[], String setValues[], String wheres[], String whereValues[], String whereLogic) throws SQLException { StringBuilder set = new StringBuilder(); StringBuilder where = new StringBuilder(); if (table.length() != 0 && sets.length > 0 && setValues.length > 0 && wheres.length > 0 && whereValues.length > 0 && (sets.length == setValues.length) && (wheres.length == whereValues.length)) { if (sets.length > 1) { for (int i = 0; i < sets.length; i++) { int j = sets.length - 1; if (i != j) { set.append(sets[i] + "=?,"); } else { set.append(sets[i] + "=?"); } } } else { set.append(sets[0] + "=?"); } if (wheres.length > 1) { for (int i = 0; i < wheres.length; i++) { if (wheres.length > 1) { int j = wheres.length - 1; if (i != j) { where.append(wheres[i] + "=? "+whereLogic+" "); } else { where.append(wheres[i] + "=?"); } } else { where.append(wheres[i] + "=?"); } } } else { where.append(wheres[0] + "=?"); } } else { System.err.println("Please check the incoming parameters..."); return -1; } String sql = "update " + table + " set " + set.toString() + " where " + where.toString(); int code = 0; try { PreparedStatement ps = conn.prepareStatement(sql); int count = 1; for (int i = 0; i < setValues.length; i++) { ps.setString(count, setValues[i]); count++; } for (int i = 0; i < whereValues.length; i++) { ps.setString(count, whereValues[i]); count++; } code = ps.executeUpdate(); } catch (SQLException e) { throw new SQLException(); } return code; } /** * @see 这是一个用于删除数据表信息的方法 * @param table * 进行操作的数据表名称 * @param wheres * 传入where的参数,比如:where name=? and password=? 这个name和password * 可有多个但必须与whereValues对应 * @param whereValues * 传入where参数的值 name='周广' 就是这个'周广'
* @param whereLogic 接受and或or 不做混合判断 *
@return 返回受到影响的行数 如果返回0表示未改变数据表,如果返回-1表示传入的参数有误 * @throws SQLException * 删除操作执行失败后抛出异常 */ public int delete(String table, String wheres[], String whereValues[], String whereLogic) throws SQLException { StringBuilder where = new StringBuilder(); if (table.length() > 0 && wheres.length > 0 && whereValues.length > 0 && (wheres.length == whereValues.length)) { if (wheres.length > 1) { for (int i = 0; i < wheres.length; i++) { int j = wheres.length - 1; if (i != j) { where.append(wheres[i] + "=? "+whereLogic+" "); } else { where.append(wheres[i] + "=?"); } } } else { where.append(wheres[0] + "=?"); } } else { System.err.println("Please check the parameters..."); return -1; } String sql = "delete from " + table + " where " + where.toString(); int code = 0; try { PreparedStatement ps = conn.prepareStatement(sql); int count = 1; for (int i = 0; i < whereValues.length; i++) { ps.setString(count, whereValues[i]); count++; } code = ps.executeUpdate(); } catch (SQLException e) { throw new SQLException(); } return code; } /** * @param code * 接收一个状态码 是0则数据库连接端口为默认端口,是1则说明构造函数已经设置好端口 * @return 返回拼装好的数据库连接url * @see 判断需要连接的数据库类型然后拼装数据库连接rul */ private String url(int code) { if (dataBaseType.equals("mysql")) { if (code == 0) this.dataBasePort = "3306";
       this.driver = "com.mysql.jdbc.Driver";
return "jdbc:mysql://" + dataBaseAddress + ":" + dataBasePort + "/" + dataBaseName; } else if (dataBaseType.equals("oracle")) { if (code == 0) this.dataBasePort = "1521"; this.driver = "oracle.jdbc.driver.OracleDriver"; return "jdbc:oracle:thin:@" + dataBaseAddress + ":" + dataBasePort + ":" + dataBaseName; } else if (dataBaseType.equals("sqlserver")) { if (code == 0) this.dataBasePort = "1433"; this.driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; return "jdbc:sqlserver://" + dataBaseAddress + ":" + dataBasePort + ";DatabaseName=" + dataBaseName; } return null; } }
posted on 2016-02-23 14:34  譬如朝露,去日良多  阅读(463)  评论(2编辑  收藏  举报