0
点赞
收藏
分享

微信扫一扫

基于Spring JDBC我们来搭建自己的ORM框架-demo-spring-framework-orm-v2

伽马星系 2022-07-13 阅读 38


文章目录

  • ​​1.结果匹配:根据传入的对象去动态匹配结果​​
  • ​​1.1.沿用v1版本项目​​
  • ​​1.2.引入jpa的jar包​​
  • ​​1.3.创建Emp对象​​
  • ​​1.4.创建JdbcDemo.resultSetDealDemo​​
  • ​​1.4.2.动态获取数据库的表名​​
  • ​​1.4.2.创建数据库字段和java对象字段的映射关系​​
  • ​​1.4.3.对象结果返回放入到新的对象之中:newInstance​​
  • ​​1.5.测试案例​​
  • ​​总结​​

1.结果匹配:根据传入的对象去动态匹配结果

1.1.沿用v1版本项目

1.2.引入jpa的jar包

<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>

关于jpa的使用,大家参考下面的地址

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.动态获取数据库的表名

基于Spring JDBC我们来搭建自己的ORM框架-demo-spring-framework-orm-v2_java

1.4.2.创建数据库字段和java对象字段的映射关系

基于Spring JDBC我们来搭建自己的ORM框架-demo-spring-framework-orm-v2_sql_02

1.4.3.对象结果返回放入到新的对象之中:newInstance

基于Spring JDBC我们来搭建自己的ORM框架-demo-spring-framework-orm-v2_java_03

1.5.测试案例

@Test
public void resultSetDealDemoTest(){
String sql="select * from ";
JdbcDemo.resultSetDealDemo(new Emp(),sql).forEach(obj->{
System.out.println(obj.toString());
});
}

基于Spring JDBC我们来搭建自己的ORM框架-demo-spring-framework-orm-v2_字段_04

总结

当然我们也可以针对入参的一些数据,进行动态的ping sql去组装,这里不再一一介绍

针对这种数据库表数据与对象映射的这种操作,我们称之为ORM(Object Relation Mapping )


举报

相关推荐

0 条评论