JDBC的工具类,加载JDBC未写明
package com.dbbase;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;
/**
* @author lance
* @version v0.0.1
* @describe jdbc工具类
* @since 2018/6/22
**/
public class JdbcUtil<T>
{
/**
* 将结果集转为javabean
*
* @param cls 所要封装的javaBean
* @param rs 结果集
* @return javaBean对象
*/
public T getBeanByResultSet(Class<T> cls, ResultSet rs)
{
Field field = null;
T obj = null;
try
{
// 获取ResultSet列对象
ResultSetMetaData rsmd = rs.getMetaData();
// 获取记录集中的列数
int counts = rsmd.getColumnCount();
String[] columnNames = new String[counts];
// 变量赋值(字段名称全部转换成小写)
for (int i = 0; i < counts; i++)
{
columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();
}
// 变量ResultSet
if (rs.next())
{
T t = cls.newInstance();
// 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++)
{
try
{
// 获取对象字段
field = cls.getDeclaredField(columnNames[i]);
}
catch (Exception ex)
{
ex.printStackTrace();
continue;
}
// 获取bean属性的类型
Class<?> beanType = field.getType();
// 结果集取值
Object value = rs.getObject(columnNames[i]);
if (value != null)
{
// 获取数据库字段的类型
Class<?> dbType = value.getClass();
// 处理日期类型不匹配问题
if (dbType == Timestamp.class && beanType == java.util.Date.class)
{
value = new java.util.Date(((Timestamp) value).getTime());
}
// 处理double类型不匹配问题
if (dbType == java.math.BigDecimal.class && beanType == double.class)
{
value = new Double(value.toString());
}
// 处理int类型不匹配问题
if (dbType == java.math.BigDecimal.class && (beanType == int.class || beanType == Integer.class))
{
value = new Integer(value.toString());
}
if (dbType == java.math.BigDecimal.class && beanType == String.class)
{
value = new Integer(value.toString()) + "";
}
}
field.setAccessible(true);
field.set(t, value);
field.setAccessible(false);
}
obj = t;
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
return obj;
}
/**
* 将结果集转为javabean集合
*
* @param cls 所要封装的javaBean
* @param rs 结果集
* @return javaBean数组
*/
public List<T> getBeanListByResultSet(Class<T> cls, ResultSet rs)
{
List<T> lists = new ArrayList<T>();
try
{
// 取得ResultSet列对象
ResultSetMetaData rsmd = rs.getMetaData();
// 获取记录集中的列数
int counts = rsmd.getColumnCount();
String[] columnNames = new String[counts];
// 变量赋值(字段名称全部转换成小写)
for (int i = 0; i < counts; i++)
{
columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();
}
while (rs.next())
{
T t = cls.newInstance();
// 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++)
{
Field field = null;
// 获取对象字段
field = cls.getDeclaredField(columnNames[i]);
// 获取bean属性的类型
Class<?> beanType = field.getType();
// 结果集取值
Object value = rs.getObject(columnNames[i]);
if (value != null)
{
// 获取数据库字段的类型
Class<?> dbType = value.getClass();
// 处理日期类型不匹配问题
if (dbType == Timestamp.class && beanType == java.util.Date.class)
{
value = new java.util.Date(((Timestamp) value).getTime());
}
// 处理double类型不匹配问题
if (dbType == java.math.BigDecimal.class && beanType == double.class)
{
value = new Double(value.toString());
}
// 处理int类型不匹配问题
if (dbType == java.math.BigDecimal.class && beanType == int.class)
{
value = new Integer(value.toString());
}
}
field.setAccessible(true);
field.set(t, value);
field.setAccessible(false);
}
lists.add(t);
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
return lists;
}
/**
* 将结果集转为Map
*
* @param rs 结果集
* @return Map
*/
protected Map getMapByResultSet(ResultSet rs)
{
Map data = new HashMap();
try
{
// 元数据信息
ResultSetMetaData rsmd = rs.getMetaData();
// 字段数量
int count = rsmd.getColumnCount();
while (rs.next())
{
for (int i = 1; i <= count; i++)
{
data.put(rsmd.getColumnName(i), rs.getObject(i));//获取键名及值
}
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
return data;
}
/**
* 将结果集转为list<Map>
*
* @param rs 结果集
* @return List
*/
protected List convertMapList(ResultSet rs) throws SQLException
{
List datas = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();//获取键名
int columnCount = rsmd.getColumnCount();//获取行的数量
while (rs.next())
{
Map rowData = new HashMap();
for (int i = 1; i <= columnCount; i++)
{
rowData.put(rsmd.getColumnName(i), rs.getObject(i));//获取键名及值
}
datas.add(rowData);
}
return datas;
}
/**
* 将结果集转为list
*
* @param rs 结果集
* @return List
*/
protected List convertList(ResultSet rs) throws SQLException
{
List datas = new ArrayList();
while (rs.next())
{
Object obj = rs.getObject(1);
datas.add(obj);
}
return datas;
}
/**
* 给预编译的sql赋值
*
* @param ps PreparedStatement
* @param args 参数集
* @throws SQLException
*/
protected void setPreparedParams(PreparedStatement ps, String... args) throws SQLException
{
for (int i = 0; i < args.length; i++)
{
int index = 1 + i;
ps.setString(index, args[i]);
}
}
/**
* 给预编译的sql赋值
*
* @param ps PreparedStatement
* @param args 参数数组
* @throws SQLException
*/
protected void setPreparedParams4Array(PreparedStatement ps, Object[] args) throws SQLException
{
if (null != args)
{
for (int i = 0; i < args.length; i++)
{
Object arg = args[i];
doSetValue(ps, i + 1, arg);
}
}
}
/**
* 给PreparedStatement赋值
*
* @param ps
* @param paramIndex
* @param inValue
* @throws SQLException
*/
private void doSetValue(PreparedStatement ps, int paramIndex, Object inValue) throws SQLException
{
if (isStringValue(inValue.getClass()))
{
ps.setString(paramIndex, inValue.toString());
}
else if (isDateValue(inValue.getClass()))
{
ps.setTimestamp(paramIndex, new Timestamp(((java.util.Date) inValue).getTime()));
}
else if (inValue instanceof Calendar)
{
Calendar cal = (Calendar) inValue;
ps.setTimestamp(paramIndex, new Timestamp(cal.getTime().getTime()), cal);
}
else
{
ps.setObject(paramIndex, inValue);
}
}
/**
* 获取jdbc连接
*
* @return connection
*/
public static Connection getConnection()
{
Connection conn = null;
// TODO: connect jdbc
return conn;
}
/**
* 关闭连接
*
* @param conn Connection
* @param ps PreparedStatement
* @param rs ResultSet
*/
public static void releaseConnection(Connection conn, PreparedStatement ps, ResultSet rs)
{
try
{
if (null != rs)
{
rs.close();
}
if (null != ps)
{
ps.close();
}
if (null != conn)
{
conn.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 释放Connection
*
* @param conn
*/
public static void releaseConnection(Connection conn)
{
try
{
if (null != conn)
{
conn.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 释放PreparedStatement
*
* @param ps
*/
public static void releasePreparedStatement(PreparedStatement ps)
{
try
{
if (null != ps)
{
ps.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
/**
* 参数是否为String类型
*
* @param inValueType
* @return
*/
public static boolean isStringValue(Class<?> inValueType)
{
return (CharSequence.class.isAssignableFrom(inValueType) || StringWriter.class.isAssignableFrom(inValueType));
}
/**
* 参数是否为date类型
*
* @param inValueType
* @return
*/
public static boolean isDateValue(Class<?> inValueType)
{
return (java.util.Date.class.isAssignableFrom(inValueType) && !(java.sql.Date.class.isAssignableFrom(inValueType) || Time.class.isAssignableFrom(inValueType) || Timestamp.class.isAssignableFrom(inValueType)));
}
}
一个jdbc的鸡肋~
package com.dbbase;
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author lance
* @version v0.0.1
* @describe jdbc基类
* @since 2018/6/22
**/
public class JdbcBaseDao extends JdbcUtil
{
private static final Logger LOGGER = Logger.getLogger(Thread.currentThread().getStackTrace()[1].getClassName());
/**
* 查询-返回int
*
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @return int
*/
public int queryForInt(String sql, String... args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int backVal = 0;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("queryForInt...", sql, argsInfo);
rs = ps.executeQuery();
rs.next();
backVal = rs.getInt(1);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回int
*
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @return int
*/
public int queryForInt(String sql, Object[] args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int backVal = 0;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("queryForInt[]", sql, argsInfo);
rs = ps.executeQuery();
rs.next();
backVal = rs.getInt(1);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回String
*
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @return string
*/
public String queryForString(String sql, String... args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("queryForString...", sql, argsInfo);
rs = ps.executeQuery();
rs.next();
backVal = rs.getString(1);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回String
*
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @return string
*/
public String queryForString(String sql, Object[] args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("queryForString[]", sql, argsInfo);
rs = ps.executeQuery();
rs.next();
backVal = rs.getString(1);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回Map
*
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @return Map
*/
@SuppressWarnings("unchecked")
public Map queryForMap(String sql, String... args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Map<String, Object> backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("queryForMap...", sql, argsInfo);
rs = ps.executeQuery();
backVal = getMapByResultSet(rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回Map
*
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @return Map
*/
@SuppressWarnings("unchecked")
public Map queryForMap(String sql, Object[] args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Map<String, Object> backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("queryForMap[]", sql, argsInfo);
rs = ps.executeQuery();
backVal = getMapByResultSet(rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回model
*
* @param cls model类
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @param <T> model.class
* @return model
*/
@SuppressWarnings("unchecked")
public <T> T queryForModel(Class<T> cls, String sql, String... args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
T backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("queryForModel...", sql, argsInfo);
rs = ps.executeQuery();
backVal = (T) getBeanByResultSet(cls, rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回model
*
* @param cls model类
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @param <T> model.class
* @return model
*/
@SuppressWarnings("unchecked")
public <T> T queryForModel(Class<T> cls, String sql, Object[] args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
T backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("queryForModel[]", sql, argsInfo);
rs = ps.executeQuery();
backVal = (T) getBeanByResultSet(cls, rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 执行更新
*
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @return 影响的行数
*/
public int executeUpdate(Connection conn, String sql, String... args) throws Exception
{
PreparedStatement ps = null;
int backVal = 0;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("executeUpdate...", sql, argsInfo);
ps.executeUpdate();
backVal = ps.getUpdateCount();
}
catch (Exception e)
{
throw e;
}
finally
{
releasePreparedStatement(ps);
}
return backVal;
}
/**
* 执行更新
*
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @return
*/
public int executeUpdate(Connection conn, String sql, Object[] args) throws Exception
{
PreparedStatement ps = null;
int backVal = 0;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("executeUpdate[]", sql, argsInfo);
ps.executeUpdate();
backVal = ps.getUpdateCount();
}
catch (Exception e)
{
throw e;
}
finally
{
releasePreparedStatement(ps);
}
return backVal;
}
/**
* 查询-返回list<Map>
*
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @return Map
*/
@SuppressWarnings("unchecked")
public List<Map<String, Object>> queryForMapList(String sql, String... args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Map<String, Object>> backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("queryForMapList...", sql, argsInfo);
rs = ps.executeQuery();
backVal = convertMapList(rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回list<Map>
*
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @return Map
*/
@SuppressWarnings("unchecked")
public List<Map<String, Object>> queryForMapList(String sql, Object[] args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Map<String, Object>> backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("queryForMapList[]", sql, argsInfo);
rs = ps.executeQuery();
backVal = convertMapList(rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回list<Map>
*
* @param sql 预编译带?的sql
* @param args 参数集(全 string)
* @return Map
*/
public List queryForList(String sql, String... args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams(ps, args);
sqlLog("queryForList...", sql, argsInfo);
rs = ps.executeQuery();
backVal = convertList(rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* 查询-返回list
*
* @param sql 预编译带?的sql
* @param args 参数集(数组)
* @return Map
*/
@SuppressWarnings("unchecked")
public List queryForList(String sql, Object[] args)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Map<String, Object>> backVal = null;
String argsInfo = (args != null ? Arrays.toString(args) : "");
try
{
conn = getConnection();
ps = conn.prepareStatement(sql);
setPreparedParams4Array(ps, args);
sqlLog("queryForList[]", sql, argsInfo);
rs = ps.executeQuery();
backVal = convertList(rs);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
releaseConnection(conn, ps, rs);
}
return backVal;
}
/**
* sql日志
*
* @param methodName 方法名
* @param sql 语句
* @param args 参数
*/
private void sqlLog(String methodName, String sql, String args)
{
LOGGER.info("methodName:" + methodName + " sql:\n" + sql + "\n args-" + args);
}
}
继承jdbc鸡肋就可以进行数据库业务操作啦
package com.dbbase;
import java.sql.Connection;
/**
* @author lance
* @version v0.0.1
* @since 2018/6/22
**/
public class DemoDao extends JdbcBaseDao
{
/**
* 查询信息
*
* @param strings 参数集
* @return
*/
public DemoSqlResult demoSearch(String... strings) throws Exception
{
StringBuffer sql = new StringBuffer("\n");
sql.append("SELECT \n");
sql.append(" '1' col1, \n");
sql.append(" 2 col2, \n");
sql.append("FROM \n");
sql.append(" dual \n");
return queryForModel(DemoSqlResult.class, sql.toString(), strings);
}
/**
* 带事务的更新
*
* @param conn
*/
public int demoUpdateWithTranscational(Connection conn, String colVal1, String colVal2, String colVal3) throws Exception
{
StringBuffer sql = new StringBuffer("\n");
sql.append("UPDATE table1 \n");
sql.append("SET \n");
sql.append(" col1 = ?, \n");
sql.append(" col2 = ? \n");
sql.append("WHERE \n");
sql.append("col3 = ? \n");
return executeUpdate(conn, sql.toString(), new String[]{colVal1, colVal2, colVal3});
}
/**
* 不带事务的更新
*/
public int demoUpdateWithOutTranscational(String colVal1, String colVal2) throws Exception
{
Connection conn = getConnection();
String sql = "update table2 set col2 = ? where col1 = ?";
releaseConnection(conn);
return executeUpdate(conn, sql, colVal2, colVal1);
}
}
同时需要一个实体类去承接查询出来的结果集
package com.dbbase;
import java.math.BigDecimal;
/**
* @author lance
* @version v0.0.1
* @describe 查询字段的bean对象
* @since 2018/6/22
**/
public class DemoSqlResult
{
/**
* 字段1
*/
private String col1;
/**
* 字段2
*/
private BigDecimal col2;
public String getCol1()
{
return col1;
}
public void setCol1(String col1)
{
this.col1 = col1;
}
public BigDecimal getCol2()
{
return col2;
}
public void setCol2(BigDecimal col2)
{
this.col2 = col2;
}
}
vans