起因
JDBC是每个Java人的必经之路,当然小杜也有过这么一个时期。在读书时,学到连接数据库时,不知道在座的各位看官有没有被cao蛋的resultSet.getString,getInteger....给惹烦呢?当时就在想找工具类把这个绕过,奈何当初有心无力,只能望其空流泪,一遍遍的流泪,一遍遍的写。如今会想起这个梦想。我再次想起了我的初心,于是 淦!
原理
利用类的反射拿到所有属性,然后遍历属性,把属性名填入getObject()其中,OK
可能对您产生的帮助
重温JDBC[捂脸], 反射的基本api
前置配置(可跳过)
回顾下JDBC的基本步骤
- 准备配置参数
/**
* 驱动类路径
*/
private static String driver = "com.mysql.cj.jdbc.Driver";
/**
* 链接字符串
*/
private static String url = "jdbc:mysql://localhost:3306/dee";
/**
* 用户名
*/
private static String user = "root";
/**
* 密码
*/
private static String pass = "123123123";
- 获取连接对象
/**
* 初始化Connection 对象
* @author youao.du@gmail.com
* @time 22:26
* @params
*/
static {
if (conn == null) {
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- sql语句转换PreparedStatement
/**
* 执行参数
* @author youao.du@gmail.com
* @time 23:08
* @params
*/
private static PreparedStatement prepared(String sql, Object... params) {
// 最后返回值
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return pstmt;
}
正式开始
我们要实现的目的是只需传入Sql、参数、和最后返回的结果类型几可拿到List,
可以使用以下API:
Class.getDeclaredFields() 获取该类下的所有属性 注:获取不到父类的
Field.set() 设置此属性的值
Field.setAccessible() 设置此属性状态
/**
* 查询列表
* @author youao.du@gmail.com
* @time 23:04
* @params [sql, className, params]
*/
public static <T> List<T> selectList(String sql, Class<T> className, Object... params) {
// 非空判断
if (StringUtils.isBlank(sql) || className == null) {
return null;
}
printBasicLogger(sql, params);
// sql转换操作
PreparedStatement prepared = prepared(sql, params);
List<T> result = null;
try {
// 执行sql拿到结果
ResultSet resultSet = prepared.executeQuery();
result = new ArrayList<>();
while (resultSet.next()) {
// 判断是不是基本数据类型
if (!isValType(className)) {
T t = className.newInstance();
// 获取所有属性
Field[] fields = className.getDeclaredFields();
// 遍历当前列所有属性
for (Field field : fields) {
// 设置属性值
field.setAccessible(true);
field.set(t, resultSet.getObject(humpToUnderline(field.getName())));
}
result.add(t);
}else {
T t = (T) resultSet.getObject(0);
result.add(t);
}
}
} catch(SQLException e){
e.printStackTrace();
} catch(IllegalAccessException e){
e.printStackTrace();
} catch(InstantiationException e){
e.printStackTrace();
}
return result;
}
至此,文章写到这里。此JDBC我还封装了单表增删改查的基本操作,如果需要可以到我的GitHub自取 github