完成以下工具函数的代码编写 功能需求: 1. 传入数据对象列表,生成对应的数据库insert语句。 2. 生成数据库语句的可以应用于数据库MySQL 5.7 版本。 3. 生成对应的单元测试案例。 4. 代码要求详尽的注释. 5. 每行insert语句独立成行。 6. 只处理被@Column 或 @Id 注解的字段,其他字段跳过不处理 代码要求: 1. 程序实现基于java语言,jdk版本要求为1.8. 2. 入参为List集合,集合内的内容为基于JPA规范的实体类对象,数据库字段与数据库名基于注解在实体类上注释。 3. 不需要考虑数据库表间物理外键的场景。 4. List集合中存储的可能是代表不同表结构的实体对象,需要一起输出,List中每项生成一条独立的sql语句。
时间: 2024-03-06 12:46:13 浏览: 16
以下是代码实现及注释:
```java
import java.lang.reflect.Field;
import java.util.List;
/**
* 工具函数类,用于生成数据库 insert 语句和单元测试案例
*/
public class DBUtil {
/**
* 生成数据库 insert 语句,每行 insert 语句独立成行
*
* @param dataList 数据对象列表
* @return 生成的 insert 语句
*/
public static String generateInsertSQL(List<?> dataList) {
if (dataList == null || dataList.isEmpty()) {
return null;
}
StringBuilder sb = new StringBuilder();
for (Object data : dataList) {
// 获取实体类对应的表名
String tableName = getTableName(data.getClass());
if (tableName == null) {
continue;
}
// 获取实体类所有的字段
Field[] fields = data.getClass().getDeclaredFields();
if (fields == null || fields.length == 0) {
continue;
}
StringBuilder columns = new StringBuilder();
StringBuilder values = new StringBuilder();
for (Field field : fields) {
// 如果字段没有 @Column 或 @Id 注解,则跳过不处理
if (!field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Id.class)) {
continue;
}
// 获取字段名
String columnName = getColumnName(field);
if (columnName == null) {
continue;
}
// 获取字段值
Object fieldValue = getFieldValue(data, field);
if (fieldValue == null) {
continue;
}
// 拼接字段名和字段值
columns.append(columnName).append(",");
values.append("'").append(fieldValue.toString()).append("',");
}
// 去掉最后一个逗号
if (columns.length() > 0) {
columns.deleteCharAt(columns.length() - 1);
}
if (values.length() > 0) {
values.deleteCharAt(values.length() - 1);
}
// 拼接 insert 语句
sb.append("INSERT INTO ").append(tableName).append(" (").append(columns).append(") VALUES (").append(values).append(");\n");
}
return sb.toString();
}
/**
* 生成对应的单元测试案例
*
* @param dataList 数据对象列表
* @return 生成的单元测试案例代码
*/
public static String generateUnitTest(List<?> dataList) {
if (dataList == null || dataList.isEmpty()) {
return null;
}
StringBuilder sb = new StringBuilder();
for (Object data : dataList) {
// 获取实体类名
String className = data.getClass().getSimpleName();
// 拼接测试方法名
String methodName = "testInsert" + className;
// 拼接测试代码
sb.append("@Test\n");
sb.append("public void ").append(methodName).append("() {\n");
sb.append("\t").append(className).append(" data = new ").append(className).append("();\n");
// 获取实体类所有的字段
Field[] fields = data.getClass().getDeclaredFields();
if (fields == null || fields.length == 0) {
continue;
}
for (Field field : fields) {
// 如果字段没有 @Column 或 @Id 注解,则跳过不处理
if (!field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Id.class)) {
continue;
}
// 获取字段名
String columnName = getColumnName(field);
if (columnName == null) {
continue;
}
// 获取字段值
Object fieldValue = getFieldValue(data, field);
if (fieldValue == null) {
continue;
}
// 拼接设置字段值的代码
sb.append("\tdata.set").append(columnName.substring(0, 1).toUpperCase()).append(columnName.substring(1)).append("(").append(fieldValue).append(");\n");
}
// 拼接断言代码
sb.append("\t").append("assertEquals(\"").append(generateInsertSQL(List.of(data)).trim()).append("\", data.toInsertSQL());\n");
sb.append("}\n\n");
}
return sb.toString();
}
/**
* 获取实体类对应的表名
*
* @param clazz 实体类
* @return 表名
*/
private static String getTableName(Class<?> clazz) {
Table table = clazz.getAnnotation(Table.class);
if (table == null) {
return null;
}
return table.name();
}
/**
* 获取字段名
*
* @param field 字段
* @return 字段名
*/
private static String getColumnName(Field field) {
Column column = field.getAnnotation(Column.class);
if (column == null) {
Id id = field.getAnnotation(Id.class);
if (id == null) {
return null;
}
return "id";
}
return column.name();
}
/**
* 获取字段值
*
* @param data 数据对象
* @param field 字段
* @return 字段值
*/
private static Object getFieldValue(Object data, Field field) {
try {
field.setAccessible(true);
return field.get(data);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
/**
* 实体类注解
*/
@Table(name = "user")
class User {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "age")
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
/**
* 生成 insert 语句
*
* @return insert 语句
*/
public String toInsertSQL() {
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO user (id,name,age) VALUES (");
sb.append("'").append(id).append("',");
sb.append("'").append(name).append("',");
sb.append("'").append(age).append("');");
return sb.toString();
}
}
```