1.需求描述
有兩張表(使用者表和部門表),字段包括使用者ID、使用者名、年齡、郵箱、部門上司和部門人數等字段,現在需要對每個字段或字段的組合條件進行檢索,并列印SQL。
2.代碼示例
(1).表定義
@Table("user")
public class User {
@Column("id")
private int id;
@Column("user_name")
private String userName;
、、、、、
@Column("age")
private int age;
@Column("email")
private String email;
//get和set方法
}
@Table("department")
public class Department {
@Column("id")
private int id;
@Column("name")
private String name;
@Column("leader_name")
private String leader_name;
@Column("amount")
private int amount;
//get和set方法
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
public class App {
public static void main(String[] args) {
//查詢id為10的使用者
User query1 = new User();
query1.setId(10);
//查詢name為lucy的使用者
User query2 = new User();
query2.setUserName("lucy");
query2.setAge(18);
//查詢郵箱為12******[email protected]的使用者
User query3 = new User();
query3.setEmail("12******[email protected],188****[email protected]");
System.out.println(query(query1));
System.out.println(query(query2));
System.out.println(query(query3));
Department department = new Department();
department.setName("技術部");
department.setAmount(10);
System.out.println(query(department));
}
private static String query(Object object) {
StringBuilder sb = new StringBuilder();
//1.擷取到class
Class objectClass = object.getClass();
//2.擷取到table的名字
boolean tableIsExists = objectClass.isAnnotationPresent(Table.class);
if (!tableIsExists) {
return null;
}
Table table = (Table) objectClass.getAnnotation(Table.class);
String tableName = table.value();
sb.append("select * from ").append(tableName).append(" where 1=1");
//3.周遊所有字段,處理每個字段對應的sql
Field[] fields = objectClass.getDeclaredFields();
for (Field field : fields) {
//4.1拿到字段名
boolean fieldIsExists = field.isAnnotationPresent(Column.class);
if (!fieldIsExists) {
continue;
}
//4.2拿到字段的值
String filedName = field.getName();
String getMethodName = "get" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1);
Object fieldValue = null;
try {
Method getMethod = objectClass.getMethod(getMethodName);
fieldValue = getMethod.invoke(object, null);
} catch (Exception e) {
e.printStackTrace();
}
//4.3拼裝sql
if (fieldValue == null || (fieldValue instanceof Integer && (Integer) fieldValue == 0)) {
continue;
}
sb.append(" and ").append(filedName);
if (fieldValue instanceof String) {
if (((String) fieldValue).contains(",")) {
String[] values = ((String) fieldValue).split(",");
sb.append(" in(");
for (String v : values) {
sb.append("'").append(v).append("'").append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
} else {
sb.append("=").append("'").append(fieldValue).append("'");
}
} else if (fieldValue instanceof Integer) {
sb.append("=").append(fieldValue);
}
}
return sb.toString();
}
}
select * from user where 1=1 and id=10
select * from user where 1=1 and userName='lucy' and age=18
select * from user where 1=1 and email in('12******[email protected]','188****[email protected]')
select * from department where 1=1 and name='技術部' and amount=10