文章目录
1.结果匹配:根据传入的对象去动态匹配结果
1.1.沿用v1版本项目
1.2.引入jpa的jar包
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
关于jpa的使用,大家参考下面的地址
https://blog.csdn.net/wujiaqi0921/article/details/78789087
1.3.创建Emp对象
package com.gaoxinfu.demo.spring.framework.orm.v2.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @Description:
* @Author: gaoxinfu
* @Date: 2020-09-21 06:46
*/
@Entity
@Table(name = "emp")
@Data
public class Emp {
@Id
private Integer id;//这里注意下,前面定义的Long类型,但是由于
private String name;
private String sex;
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
1.4.创建JdbcDemo.resultSetDealDemo
public static List<Object> resultSetDealDemo(Object resultDTO,String sql){
Class<?> resultClazz=resultDTO.getClass();
try {
Class.forName(com.mysql.jdbc.Driver.class.getName());
Connection connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo-spring-framework-orm","root","root");
/**
* 根据对象获取查询的表名
*/
sql=sql+resultClazz.getAnnotation(Table.class).name();
PreparedStatement preparedStatement= connection.prepareStatement(sql);
ResultSet resultSet=preparedStatement.executeQuery();
Field[] fields=resultClazz.getDeclaredFields();
/**
* 根据fieldName找columnName
*/
Map<String,String> fieldMap=new HashMap<String,String>();
/**
* 根据columnName找fieldName
*/
Map<String,String> columnMap=new HashMap<String,String>();
for (Field field:fields) {
field.setAccessible(Boolean.TRUE);
if (field.isAnnotationPresent(Column.class)){
Column column=field.getAnnotation(Column.class);
fieldMap.put(field.getName(),column.name());
columnMap.put(column.name(),field.getName());
}else{
fieldMap.put(field.getName(),field.getName());
columnMap.put(field.getName(),field.getName());
}
}
/*
while (resultSet.next()){
Emp emp=new Emp();
emp.setId(resultSet.getLong(1));
emp.setName(resultSet.getString(2));
emp.setSex(resultSet.getString(3));
}*/
//数据库列数
int columnCount = resultSet.getMetaData().getColumnCount();
List<Object> resultList = new ArrayList<>();
while (resultSet.next()){
//new newInstance()相当于我们的new Object()对象,比如new Emp()
Object instance= resultClazz.newInstance();
//解析一行数据,一行有列字段,进行循环遍历处理
for (int i=1;i<=columnCount;i++) {
String columnName=resultSet.getMetaData().getColumnName(i);
Field field=resultClazz.getDeclaredField(columnMap.get(columnName));
//有可能私有变量
field.setAccessible(Boolean.TRUE);
field.set(instance,resultSet.getObject(i));
}
resultList.add(instance);
}
return resultList;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return null;
}
1.4.2.动态获取数据库的表名
1.4.2.创建数据库字段和java对象字段的映射关系
1.4.3.对象结果返回放入到新的对象之中:newInstance
1.5.测试案例
@Test
public void resultSetDealDemoTest(){
String sql="select * from ";
JdbcDemo.resultSetDealDemo(new Emp(),sql).forEach(obj->{
System.out.println(obj.toString());
});
}
总结
当然我们也可以针对入参的一些数据,进行动态的ping sql去组装,这里不再一一介绍
针对这种数据库表数据与对象映射的这种操作,我们称之为ORM(Object Relation Mapping )