详细写出 java通过反射和注解生成增删改查的sql语句的所有方法,还需要并使用一个用问号替换参数,如果参数为空则为null的方法
时间: 2024-02-05 11:11:58 浏览: 138
首先,我们需要定义一个注解 `@Table` 来标注表名,以及一个注解 `@Column` 来标注列名。示例代码如下:
```
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String name();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name();
}
```
然后,我们可以定义一个 `SqlGenerator` 类来生成 SQL 语句。该类包含以下方法:
1. `generateInsertSql(Object obj)`:根据传入的对象生成插入语句。
2. `generateUpdateSql(Object obj)`:根据传入的对象生成更新语句。
3. `generateDeleteSql(Class<?> clazz, Object id)`:根据类和 ID 生成删除语句。
4. `generateSelectSql(Class<?> clazz, Object id)`:根据类和 ID 生成查询语句。
示例代码如下:
```
public class SqlGenerator {
public static String generateInsertSql(Object obj) {
Class<?> clazz = obj.getClass();
StringBuilder sb = new StringBuilder("INSERT INTO ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" (");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
sb.append(column.name()).append(", ");
}
}
sb.setLength(sb.length() - 2);
sb.append(") VALUES (");
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
try {
field.setAccessible(true);
Object value = field.get(obj);
sb.append(value == null ? "NULL" : "?").append(", ");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
sb.setLength(sb.length() - 2);
sb.append(")");
return sb.toString();
}
public static String generateUpdateSql(Object obj) {
Class<?> clazz = obj.getClass();
StringBuilder sb = new StringBuilder("UPDATE ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" SET ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
sb.append(column.name()).append(" = ");
try {
field.setAccessible(true);
Object value = field.get(obj);
sb.append(value == null ? "NULL" : "?").append(", ");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
sb.setLength(sb.length() - 2);
sb.append(" WHERE ");
for (Field field : fields) {
Id id = field.getAnnotation(Id.class);
if (id != null) {
Column column = field.getAnnotation(Column.class);
sb.append(column.name()).append(" = ?");
try {
field.setAccessible(true);
Object value = field.get(obj);
sb.append(value == null ? "NULL" : "?");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
public static String generateDeleteSql(Class<?> clazz, Object id) {
StringBuilder sb = new StringBuilder("DELETE FROM ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" WHERE ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Id idAnnotation = field.getAnnotation(Id.class);
if (idAnnotation != null) {
Column column = field.getAnnotation(Column.class);
sb.append(column.name()).append(" = ?");
break;
}
}
return sb.toString();
}
public static String generateSelectSql(Class<?> clazz, Object id) {
StringBuilder sb = new StringBuilder("SELECT * FROM ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" WHERE ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Id idAnnotation = field.getAnnotation(Id.class);
if (idAnnotation != null) {
Column column = field.getAnnotation(Column.class);
sb.append(column.name()).append(" = ?");
break;
}
}
return sb.toString();
}
}
```
其中,`generateInsertSql` 方法根据传入的对象生成插入语句,首先获取对象的类信息,然后获取该类对应的表名,接着获取该类的所有字段,遍历字段并取出带有 `@Column` 注解的字段,将这些字段的名字拼接成 SQL 语句中的列名。接着再次遍历字段,取出带有 `@Column` 注解的字段,并从对象中获取该字段的值,将这些值拼接成 SQL 语句中的参数。如果值为 null,则将其替换为 "NULL"。
`generateUpdateSql` 方法根据传入的对象生成更新语句,与 `generateInsertSql` 方法类似,先获取类信息和表名,然后遍历所有字段,取出带有 `@Column` 注解的字段,将这些字段的名字拼接成 SQL 语句中的 SET 子句。接着再次遍历字段,取出带有 `@Id` 注解的字段,并将其作为 WHERE 子句的一部分。与 `generateInsertSql` 方法类似,如果值为 null,则将其替换为 "NULL"。
`generateDeleteSql` 方法根据传入的类和 ID 生成删除语句,首先获取该类对应的表名,然后遍历该类的所有字段,取出带有 `@Id` 注解的字段,并将其作为 WHERE 子句的一部分。同样地,如果值为 null,则将其替换为 "NULL"。
`generateSelectSql` 方法根据传入的类和 ID 生成查询语句,与 `generateDeleteSql` 方法类似,先获取表名,然后遍历字段,取出带有 `@Id` 注解的字段,并将其作为 WHERE 子句的一部分。同样地,如果值为 null,则将其替换为 "NULL"。
最后,我们需要一个方法来将参数用问号替换,如果参数为空则为 null。示例代码如下:
```
public static Object[] replaceNull(Object... args) {
Object[] newArgs = new Object[args.length];
for (int i = 0; i < args.length; i++) {
newArgs[i] = args[i] == null ? "NULL" : "?";
}
return newArgs;
}
```
该方法接受任意数量的参数,遍历这些参数,如果参数为 null,则将其替换为 "NULL",否则将其替换为 "?"。返回替换后的新参数数组。
完整代码如下:
```
import java.lang.annotation.*;
public class SqlGenerator {
public static String generateInsertSql(Object obj) {
Class<?> clazz = obj.getClass();
StringBuilder sb = new StringBuilder("INSERT INTO ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" (");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
sb.append(column.name()).append(", ");
}
}
sb.setLength(sb.length() - 2);
sb.append(") VALUES (");
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
try {
field.setAccessible(true);
Object value = field.get(obj);
sb.append(value == null ? "NULL" : "?").append(", ");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
sb.setLength(sb.length() - 2);
sb.append(")");
return sb.toString();
}
public static String generateUpdateSql(Object obj) {
Class<?> clazz = obj.getClass();
StringBuilder sb = new StringBuilder("UPDATE ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" SET ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
sb.append(column.name()).append(" = ");
try {
field.setAccessible(true);
Object value = field.get(obj);
sb.append(value == null ? "NULL" : "?").append(", ");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
sb.setLength(sb.length() - 2);
sb.append(" WHERE ");
for (Field field : fields) {
Id id = field.getAnnotation(Id.class);
if (id != null) {
Column column = field.getAnnotation(Column.class);
sb.append(column.name()).append(" = ?");
try {
field.setAccessible(true);
Object value = field.get(obj);
sb.append(value == null ? "NULL" : "?");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
public static String generateDeleteSql(Class<?> clazz, Object id) {
StringBuilder sb = new StringBuilder("DELETE FROM ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" WHERE ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Id idAnnotation = field.getAnnotation(Id.class);
if (idAnnotation != null) {
Column column = field.getAnnotation(Column.class);
sb.append(column.name()).append(" = ?");
break;
}
}
return sb.toString();
}
public static String generateSelectSql(Class<?> clazz, Object id) {
StringBuilder sb = new StringBuilder("SELECT * FROM ");
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name()).append(" WHERE ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Id idAnnotation = field.getAnnotation(Id.class);
if (idAnnotation != null) {
Column column = field.getAnnotation(Column.class);
sb.append(column.name()).append(" = ?");
break;
}
}
return sb.toString();
}
public static Object[] replaceNull(Object... args) {
Object[] newArgs = new Object[args.length];
for (int i = 0; i < args.length; i++) {
newArgs[i] = args[i] == null ? "NULL" : "?";
}
return newArgs;
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String name();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
}
}
```
阅读全文