简介
JDBC查询返回ResultSet结果集,调用方法,传入要映射的对象的Class对象,利用反射获取该对象声明的全部属性,然后通过结果集获取列名,与对象的属性进行匹配然后赋值。
(目前未实现泛型,只是简单的进行了结果处理,代码也存在不合理的地方)
实现
Book.java
public class Book {
private int id;
private String bookname;
private String bookauthor;
private double bookprice;
private Date booktime;
private String bookpublish;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookname='" + bookname + '\'' +
", bookauthor='" + bookauthor + '\'' +
", bookprice=" + bookprice +
", booktime=" + booktime +
", bookpublish='" + bookpublish + '\'' +
'}';
}
}
JDBCUtil.java
static Connection conn = null;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bookdb?useUnicode=true&characterEncoding=UTF8", "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* CRUD 实现增删查改
*
* @param sql
* @param param
* @return
*/
public static Object CRUD(String sql, Class clazz, List<Object> param) {
PreparedStatement pst = null;
Object object = null;
try {
pst = conn.prepareStatement(sql);
for (int i = 1; i <= param.size(); i++) {
pst.setObject(i, param.get(i - 1));
}
String operate = sql.trim().substring(0, 6);
if (operate.equalsIgnoreCase("select")) {
object = pst.executeQuery();
} else {
object = pst.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
ResultSet rs = (ResultSet) object;
Object result = null;
try {
result = getBeans(rs, clazz);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 映射结果集到JavaBean
*
* @param resultSet
* @param clazz
* @return
* @throws Exception
*/
public static Object getBeans(ResultSet resultSet, Class clazz) throws Exception {
//获取要封装的javabean声明的属性
Field[] fields = clazz.getDeclaredFields();
//获取ResultSetMetaData(包含ResultSet中列的名称和类型的信息)
ResultSetMetaData metaData = resultSet.getMetaData();
//光标移到最后
resultSet.last();
//获取结果数据条数
int rows = resultSet.getRow();
//光标移到第一条数据前
resultSet.beforeFirst();
//获取查询结果列数
int columnCount = metaData.getColumnCount();
if (rows > 1) {
List<Object> list = new ArrayList<>();
//遍历ResultSet
while (resultSet.next()) {
//调用无参构造实例化对象
Object object = clazz.newInstance();
for (int j = 1; j <= columnCount; j++) {
//获取列名
String columnName = metaData.getColumnName(j);
//匹配JavaBean的属性,然后赋值
for (Field field : fields) {
field.setAccessible(true);
if (field.getName().equalsIgnoreCase(columnName)) {
field.set(object, resultSet.getObject(columnName));
}
}
}
list.add(object);
}
return list;
} else {
Object object = clazz.newInstance();
//遍历ResultSet
while (resultSet.next()) {
for (int j = 1; j <= columnCount; j++) {
String columnName = metaData.getColumnName(j);
for (Field field : fields) {
field.setAccessible(true);
if (field.getName().equalsIgnoreCase(columnName)) {
field.set(object, resultSet.getObject(columnName));
}
}
}
}
return object;
}
}
}
Test.java
//测试查询1
List<Book> list = (List<Book>) CRUD("select * from book where id in (?,?)", Book.class, Arrays.asList(new Object[]{1004, 1005}));
System.out.println(list);
//测试查询2
Book book = (Book) CRUD("select * from book where id = ?", Book.class, Arrays.asList(new Object[]{1001}));
System.out.println(book);
结果
[Book{id=1004, bookname='水浒传', bookauthor='施耐庵', bookprice=65.0, booktime=2017-03-04, bookpublish='机械工程出版社'}, Book{id=1005, bookname='红楼梦', bookauthor='曹雪芹', bookprice=57.0, booktime=2014-09-15, bookpublish='华东师范出版社'}]
Book{id=1001, bookname='西游记', bookauthor='吴承恩', bookprice=50.23, booktime=2020-06-17, bookpublish='北京大学出版社'}