项目需要实现一个动态分流功能,需要获取各种数据表的配置信息,最终决定将配置信息写入Mysql中,做周期性同步,然后再从中读取配置进行分流。因业务不是很复杂,就不引入市面上主流的ORM框架了,故自行编写工具类做了个简易实现,也趁此复习了一下ORM,泛型,反射等(基础知识还是不过关啊…)
话不多说直接上代码吧:
/**
* @param sql sql语句
* @param clazz 对象所对应的类
* @param underScoreCaseToCamel 根据代码中对象属性是驼峰与否写入true|false
* @return 查询对象结果集合
*/
public static <T> List<T> query(String sql, Class<T> clazz, boolean underScoreCaseToCamel) {
//TODO 0.关闭资源 try-with-resource
//TODO 2.建立连接
//TODO 3.创建db操作对象
//TODO 4.执行sql
try (
Connection connection = DriverManager.getConnection(MYSQL_URL, USER, PASSWORD);
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
) {
//TODO 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//TODO 5.处理结果集
ResultSetMetaData metaData = resultSet.getMetaData();
List<T> resultList = new ArrayList<>();
while (resultSet.next()) {
//反射创建对象
T obj = clazz.newInstance();
//注意jdbc下标从1开始
for (int pos = 1; pos < metaData.getColumnCount(); pos++) {
String propertyName = metaData.getColumnName(pos);
if (underScoreCaseToCamel) {
//工具类简易转换字段风格
propertyName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, propertyName);
}
//bean工具类简易对象属性赋值
BeanUtils.setProperty(obj, propertyName, resultSet.getObject(pos));
}
resultList.add(obj);
}
return resultList;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("执行sql查询出错!");
}
}
使用的工具类:
<!--在https://mvnrepository.com/中均可找到-->
apache-commons-beanutils
google-guava
正如标题所言,以上只是本人项目过程中临时写出来的工具类,功能等实现尚不完整(只是提供了一个简单的查询功能,条件查询与聚合等操作并不支持=,=),但已满足个人业务需要,以后有时间会将此好好完善的,请大佬轻喷(逃