发现很多人泛型不会使用。今天写了一个案例。简单封装一下JDBC。
希望对初学者有点帮助,大牛不喜勿喷。
这里用到了方法泛型,类泛型
映射行接口MRowMapper<T> 要去理解一下。
如有疑问可以加寇:283261828
转载请标明
1.查询任意表,任意参数,返回集合
//查询任意表,任意参数,返回集合
public List<Map<String, Object>> queryForList(String sql, Object... params) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
Connection conn = null;
PreparedStatement stm = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
stm = conn.prepareStatement(sql);
// 设置参数
setParameters(stm, params);
// 通过SQL语句操作对象发送
// executeQuery:执行数据的查询操作(select)
rs = stm.executeQuery();
// 得到结果集的元数据对象
ResultSetMetaData rmd = rs.getMetaData();
int num = rmd.getColumnCount();
// 循环获取结果
while (rs.next()) {
// 用一个map对象来表示查询出来的一条记录
Map<String, Object> rec = new HashMap<String, Object>();
for (int i = 1; i <= num; i++) {
// 根据列的位置得到列的标识(默认情况是列名称,如果取了别名就是指别名)
String columnLabel = rmd.getColumnLabel(i);
rec.put(columnLabel, rs.getObject(columnLabel));
}
result.add(rec);
}
return result;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
// 关闭资源
DBUtil.close(rs, stm, conn);
}
}
2.查询任意表,返回集合对象
public <E> List<E> queryForList(MRowMapper<E> mapper, String sql, Object... params) {
List<E> results = new ArrayList<E>();
Connection conn = null;
PreparedStatement stm = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
stm = conn.prepareStatement(sql);
// 设置参数
setParameters(stm, params);
// 通过SQL语句操作对象发送
// executeQuery:执行数据的查询操作(select)
rs = stm.executeQuery();
//记录当前结果集循环的行号
int rownum = 0;
// 循环获取结果
while (rs.next()) {
rownum++;
results.add(mapper.mappingRow(rs, rownum));
}
return results;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
// 关闭资源
DBUtil.close(rs, stm, conn);
}
}
public interface MRowMapper<T> {
/**
* 每一行数据要映射的对象
*
* @param rs
* 结果集对象
* @param rownum
* 当前结果集映射的行号
* @return
*/
public T mappingRow(ResultSet rs, int rownum) throws SQLException;
}
3.任意参数 查询任意表,返回单个对象
public <E> E queryForObject(MRowMapper<E> mapper, String sql, Object... params) {
Connection conn = null;
PreparedStatement stm = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
stm = conn.prepareStatement(sql);
// 设置参数
setParameters(stm, params);
// 通过SQL语句操作对象发送
// executeQuery:执行数据的查询操作(select)
rs = stm.executeQuery();
//记录当前结果集循环的行号
int rownum = 0;
// 循环获取结果
if (rs.next()) {
rownum++;
return mapper.mappingRow(rs, rownum);
}
return null;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
// 关闭资源
DBUtil.close(rs, stm, conn);
}
}
4.任意参数 更新任意表
public int executeUpdate(String sql, Object... params) {
Connection conn = null;
PreparedStatement stm = null;
try {
conn = DBUtil.getConnection();
// 创建一个SQL语句操作对象
stm = conn.prepareStatement(sql);
setParameters(stm, params);
// executeUpdate:执行数据的更新操作(insert|update|delete)
// 返回执行这个sql语句受影响的行数
return stm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
// 关闭资源
DBUtil.close(null, stm, conn);
}
}
5.setParameters()
private void setParameters(PreparedStatement stm, Object... params)
throws SQLException {
if (params != null) {
for (int i = 0; i < params.length; i++) {
stm.setObject(i + 1, params[i]);
}
}
}
6.简单在main方法中测试的代码
String sql = "select * from emp where deptno = ?";
List<Emp> emps = mj.queryForList(new MRowMapper<Emp>() {
@Override
public Emp mappingRow(ResultSet rs, int rownum) throws SQLException {
Emp e = new Emp();
e.setComm(rs.getFloat("comm"));
e.setDeptno(rs.getInt("deptno"));
e.setEmpno(rs.getInt("empno"));
e.setEname(rs.getString("ename"));
e.setHiredate(rs.getDate("hiredate"));
e.setJob(rs.getString("job"));
e.setMgr(rs.getInt("mgr"));
e.setSal(rs.getFloat("sal"));
return e;
}
}, sql, 20);