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> T queryForObject(String sql, RowMapper<T> 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 <T> List<T> queryForList(String sql, RowMapper<T> rowMapper, Object... params) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
List<T> result = new ArrayList<T>();
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> {
T mapRow(ResultSet rs) throws SQLException;
}
以Account类来举例
- 在Account类中封装了name address tel id 等属性,在实现RowMapper的时候需要对这几个属性进行封装
public class AccountRowMapper implements RowMapper <Account>{
@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<Account> 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());
}
网友评论