JDBC实用知识--2

DBHelp类

什么是DBHelp类

  • DBHelp类是使用JDBC的工具类,在java提供的类中有大量类似的工具类,那么我们也可以自己编写工具类来解决使用中遇到的问题。并且可以帮助我们更加深刻的理解java源代码中编写的机制。

为什么使用DBHelp类

  • 我们知道每次使用JDBC实现java和数据库的连接时,需要使用JDBC加载数据路驱动、获取数据库连接、执行insert update delete 以及select语句才能实现对数据库的“增删改查”。所以就造成了代码的大量的重复,使用非常不方便。那么我们就可以写一个DBHelp类来解决这个问题,实现代码的通用性。一次编写处处可用。

如何实现DBHelp的编写

  • 我们需要使用泛型的知识来实现代码的通用。

DBHelp类代码

  • 把加载数据库驱动、数据库连接和执行“增删改查”语句分别用独立的方法来写,代码更加精炼。
  • insert、update、delete都是调用executeUpdate()方法所以可以写成一个方法,只需要调用时传入不同的sql语句即可实现
  • 执行select语句在接收查询结果集resultSet之后,对结果进行封装时,因为具体对象不同,所以我们要在类的外部来进行封装,用一个接口来实现。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DbHelp {

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql:///db_22";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";

    /**
     * 获取数据库连接
     * 
     * @return
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 执行INSERT UPDATE DELETE语句
     */
    public static void executeUpdate(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement stat = null;
        try {
            conn = getConnection();
            stat = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                stat.setObject(i + 1, params[i]);
            }
            stat.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(stat, conn);
        }
    }

    /**
     * 查询数据库,结果为单个对象
     */
    public static  T queryForObject(String sql, RowMapper rowMapper, Object... params) {

        Connection conn = null;
        PreparedStatement stat = null;
        ResultSet rs = null;

        T result = null;

        try {
            conn = getConnection();
            stat = conn.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {
                stat.setObject(i + 1, params[i]);
            }

            rs = stat.executeQuery();

            if (rs.next()) {
                result = rowMapper.mapRow(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rs, stat, conn);
        }

        return result;
    }

    /**
     * 查询数据库,结果为集合
     */
    public static  List queryForList(String sql, RowMapper rowMapper, Object... params) {

        Connection conn = null;
        PreparedStatement stat = null;
        ResultSet rs = null;

        List result = new ArrayList();

        try {
            conn = getConnection();
            stat = conn.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {
                stat.setObject(i + 1, params[i]);
            }

            rs = stat.executeQuery();

            while (rs.next()) {
                T obj = rowMapper.mapRow(rs);
                result.add(obj);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rs, stat, conn);
        }

        return result;
    }

    public static void close(ResultSet rs, Statement stat, Connection conn) {
        try {
            if (rs != null && !rs.isClosed()) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(stat, conn);
        }
    }

    public static void close(Statement stat, Connection conn) {
        try {
            if (stat != null && !stat.isClosed()) {
                stat.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null && !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}

RowMapper接口

  • 用RowMapper的具体实现类就能完成对不同的对象进行不同的封装的效果
import java.sql.ResultSet;
import java.sql.SQLException;

public interface RowMapper {

    T mapRow(ResultSet rs) throws SQLException;
    
}

以Account类来举例

  • 在Account类中封装了name address tel id 等属性,在实现RowMapper的时候需要对这几个属性进行封装
    public class AccountRowMapper implements RowMapper {

        @Override
        public Account maprow(ResultSet rs) throws SQLException {
            Account account = new Account();
            account.setName(rs.getString("name"));
            account.setAddress(rs.getString("address"));
            account.setTel(rs.getString("tel"));
            account.setId(rs.getInt("id"));
            return account;
        } 
    }

调用DBHelp的方法代码

只需两行代码即可完成查找所有选项的目的

    public List queryForList(){
        String sql = "select *from T_account";
         return DBHelp.FindAll(sql, new AccountRowMapper());
        

实现增加删除修改的时候也是如此,以增加为例

public void save(Account account){
        
        String sql = "insert into t_account(name,address,tel) values(?,?,?)";
        DBHelp.ExecuteUpdate(sql, account.getName(), account.getAddress(),account.getTel());
    }

你可能感兴趣的:(JDBC实用知识--2)