在大数据开发中,我们很多时候需要从数据库中查询数据,然后建立数据库与对象之间的映射关系。
下面我将以具体的示例讲述如何实现数据库记录与java对象的映射。
import org.apache.commons.beanutils.BeanUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* date:2021-03-06
* desc: 从MySQL数据库中查询数据库的工具类,完成ORM,对象关系映射
* 将java对象和关系型数据库的表中的记录建立起映射关系
*
* 数据库 Java
* 表t_user 类User
* 字段id,name,age 属性 id,name,age
* 记录 对象
* ResultSet(一条条记录) List(一个个对象)
*
*/
public class DatabaseUtils {
/**
*
* @param sql 欲执行的sql查询语句
* @param clazz 返回的数据类型
* @param <T>
* @return
*/
public static <T> List<T> queryList(String sql,Class<T> clazz){
Connection conn = null;
PreparedStatement prep = null;
ResultSet resultSet = null;
List<T> resultList = new ArrayList<T>();
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/bigdata?characterEncoding=utf-8&useSSl=false";
String userName = "root";
String password = "123456";
conn = DriverManager.getConnection(url, userName, password);
prep = conn.prepareStatement(sql);
resultSet = prep.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
while(resultSet.next()){
//创建一个对象,用来封装数据库查询出来的数据
T object = clazz.newInstance();
int columnCount = metaData.getColumnCount();
for(int i = 1;i <= columnCount; i++){
String columnName = metaData.getColumnName(i);
BeanUtils.setProperty(object,columnName,resultSet.getObject(i));
}
resultList.add(object);
}
return resultList;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("从数据库查询数据失败");
} finally {
try {
if(resultSet != null){
resultSet.close();
}
if(prep != null){
prep.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
这里我们使用了泛型来代表通用的数据类型。并且使用了BeanUtils工具包。如果要使用BeanUtils,需要手动添加依赖。
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
最后测试一下。
public class DBTest01 {
public static void main(String[] args) {
String sql = "select * from t_user1";
List<User> users = DatabaseUtils.queryList(sql, User.class);
for (User user : users) {
System.out.println(user);
}
}
}
可以看到输出的结果
和数据库里面的查询结果一样。