连接数据库这是程序员经常使用的操作了。我之前做了一个简单的连接mysql的类,但是适用性不好,所以萌生做一个数据库连接、操作类。
用了大概一天时间写出了这个类
可以看到有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; } }