针对老项目的jdbc改造

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

猜你喜欢

转载自blog.csdn.net/sinat_30637097/article/details/85111499