详细写出 java通过反射和注解生成增删改查的sql语句的所有方法
时间: 2024-02-05 16:11:45 浏览: 100
Java通过反射和注解生成增删改查的SQL语句主要涉及以下几个方法:
1. 获取实体类对应的数据库表名
2. 获取实体类中的属性名和对应的列名
3. 生成查询语句
4. 生成插入语句
5. 生成更新语句
6. 生成删除语句
下面分别对每个方法进行详细介绍:
1. 获取实体类对应的数据库表名
这个方法比较简单,只需要在实体类上使用一个注解来标识表名即可,例如:
```
@Table(name = "user")
public class User {
// ...
}
```
然后在获取表名的方法中,使用反射获取类上的注解信息即可:
```
public static String getTableName(Class<?> clazz) {
Table table = clazz.getAnnotation(Table.class);
if (table != null) {
return table.name();
}
return null;
}
```
2. 获取实体类中的属性名和对应的列名
同样地,在实体类中使用注解来标识属性对应的列名,例如:
```
@Column(name = "username")
private String username;
```
然后在获取列名的方法中,使用反射获取类中所有的属性,遍历每个属性,获取其注解信息即可:
```
public static Map<String, String> getColumnMap(Class<?> clazz) {
Map<String, String> map = new HashMap<>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
map.put(field.getName(), column.name());
}
}
return map;
}
```
3. 生成查询语句
查询语句比较简单,只需要拼接出 SELECT 和 FROM 子句即可。我们可以在方法中传入一个 Map 类型的参数,用来指定查询条件:
```
public static String generateSelectSql(Class<?> clazz, Map<String, Object> condition) {
String tableName = getTableName(clazz);
Map<String, String> columnMap = getColumnMap(clazz);
StringBuilder sb = new StringBuilder();
sb.append("SELECT ");
for (String columnName : columnMap.values()) {
sb.append(columnName).append(", ");
}
sb.delete(sb.length() - 2, sb.length());
sb.append(" FROM ").append(tableName);
if (condition != null && !condition.isEmpty()) {
sb.append(" WHERE ");
for (Map.Entry<String, Object> entry : condition.entrySet()) {
String fieldName = entry.getKey();
String columnName = columnMap.get(fieldName);
Object value = entry.getValue();
sb.append(columnName).append(" = ");
if (value instanceof String) {
sb.append("'").append(value).append("'");
} else {
sb.append(value);
}
sb.append(" AND ");
}
sb.delete(sb.length() - 5, sb.length());
}
return sb.toString();
}
```
4. 生成插入语句
插入语句需要获取实体类中的属性值,然后将其拼接成一条 SQL 语句。我们可以在方法中传入一个实体类对象,用来指定要插入的数据:
```
public static String generateInsertSql(Object entity) {
Class<?> clazz = entity.getClass();
String tableName = getTableName(clazz);
Map<String, String> columnMap = getColumnMap(clazz);
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO ").append(tableName).append(" (");
for (String columnName : columnMap.values()) {
sb.append(columnName).append(", ");
}
sb.delete(sb.length() - 2, sb.length());
sb.append(") VALUES (");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
field.setAccessible(true);
Object value;
try {
value = field.get(entity);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
if (value instanceof String) {
sb.append("'").append(value).append("'");
} else {
sb.append(value);
}
sb.append(", ");
}
}
sb.delete(sb.length() - 2, sb.length());
sb.append(")");
return sb.toString();
}
```
5. 生成更新语句
更新语句与插入语句类似,只需要将属性和属性值拼接成 SET 子句即可。我们可以在方法中传入一个实体类对象和一个 Map 类型的参数,用来指定更新条件:
```
public static String generateUpdateSql(Object entity, Map<String, Object> condition) {
Class<?> clazz = entity.getClass();
String tableName = getTableName(clazz);
Map<String, String> columnMap = getColumnMap(clazz);
StringBuilder sb = new StringBuilder();
sb.append("UPDATE ").append(tableName).append(" SET ");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
String fieldName = field.getName();
String columnName = columnMap.get(fieldName);
field.setAccessible(true);
Object value;
try {
value = field.get(entity);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
if (value instanceof String) {
sb.append(columnName).append(" = '").append(value).append("', ");
} else {
sb.append(columnName).append(" = ").append(value).append(", ");
}
}
}
sb.delete(sb.length() - 2, sb.length());
if (condition != null && !condition.isEmpty()) {
sb.append(" WHERE ");
for (Map.Entry<String, Object> entry : condition.entrySet()) {
String fieldName = entry.getKey();
String columnName = columnMap.get(fieldName);
Object value = entry.getValue();
sb.append(columnName).append(" = ");
if (value instanceof String) {
sb.append("'").append(value).append("'");
} else {
sb.append(value);
}
sb.append(" AND ");
}
sb.delete(sb.length() - 5, sb.length());
}
return sb.toString();
}
```
6. 生成删除语句
删除语句与查询语句类似,只需要拼接出 DELETE 和 FROM 子句即可。我们可以在方法中传入一个 Map 类型的参数,用来指定删除条件:
```
public static String generateDeleteSql(Class<?> clazz, Map<String, Object> condition) {
String tableName = getTableName(clazz);
Map<String, String> columnMap = getColumnMap(clazz);
StringBuilder sb = new StringBuilder();
sb.append("DELETE FROM ").append(tableName);
if (condition != null && !condition.isEmpty()) {
sb.append(" WHERE ");
for (Map.Entry<String, Object> entry : condition.entrySet()) {
String fieldName = entry.getKey();
String columnName = columnMap.get(fieldName);
Object value = entry.getValue();
sb.append(columnName).append(" = ");
if (value instanceof String) {
sb.append("'").append(value).append("'");
} else {
sb.append(value);
}
sb.append(" AND ");
}
sb.delete(sb.length() - 5, sb.length());
}
return sb.toString();
}
```
以上就是通过反射和注解生成增删改查的 SQL 语句的所有方法。需要注意的是,这里只是简单地介绍了如何使用反射和注解生成 SQL 语句,实际上在实际开发中还需要考虑很多其他的因素,例如 SQL 注入、事务处理等。
阅读全文