package test;
import com.lmq.annotation.Column;
import com.lmq.annotation.Table;
@Table("teacher")
public class Teacher {
@Column("id")
private int id;
@Column("teacher_name")
private String teacherName;
@Column("number")
private String number;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
<pre name="code" class="java">package com.lmq.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
package com.lmq.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
package com.lmq.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.lmq.annotation.Column;
import com.lmq.annotation.Table;
public class SqlUtil {
/***
* 返回查询sql
* @param obj
* @return
*/
public static String query(Object obj) {
Class<? extends Object> c = obj.getClass();
StringBuffer sb = new StringBuffer();
//通过反射获取tablename
boolean isExitsTable = c.isAnnotationPresent(Table.class);
if(!isExitsTable){
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
String tableName = t.value();
sb = sb.append("select * from ").append(tableName).append(" where ");
//通过反射获取字段
Field[] field = c.getDeclaredFields();
for (Field field2 : field) {
boolean isExitsColumn = field2.isAnnotationPresent(Column.class);
if(!isExitsColumn){
continue;
}
Column column = field2.getAnnotation(Column.class);
//字段名
String columnName = column.value();
//获取字段的值
String fieldName = field2.getName();
fieldName = fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
String getMethodName = "get"+fieldName;
Object fieldValue =null;
try {
Method method = c.getMethod(getMethodName);
fieldValue = method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
//为赋值的字段不做查询条件
if(null == fieldValue||(fieldValue instanceof Integer && (Integer)fieldValue == 0)){
continue;
}
if(fieldValue instanceof String){
if(((String) fieldValue).contains(";")){
sb.append(columnName).append(" in(");
String[] stringArry = ((String) fieldValue).split(";");
for (int i = 0; i < stringArry.length; i++) {
sb.append("'").append(stringArry[i]).append("'").append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
sb.append(" and ");
continue;
}
sb.append(columnName).append("='").append(fieldValue).append("'").append(" and ");
continue;
}
sb.append(columnName).append("=").append(fieldValue).append(" and ");
}
sb.delete(sb.length()-5,sb.length()-1);
return sb.toString();
}
/**
* 返回建表sql
* @param obj
* @return
*/
public static String create(Object obj){
Class<? extends Object> c = obj.getClass();
StringBuffer sb = new StringBuffer();
if(!c.isAnnotationPresent(Table.class)){
return null;
}
Table table = c.getAnnotation(Table.class);
String tableName = table.value();
//表名
sb = sb.append("create table ").append(tableName).append("( ");
//取出字段名
Field[] field = c.getDeclaredFields();
for (Field field2 : field) {
if(!field2.isAnnotationPresent(Column.class)){
continue;
}
Column column = field2.getAnnotation(Column.class);
String columnName = column.value();
Class<?> fieldType = field2.getType();
String typeName = fieldType.getSimpleName();
if(columnName.equals("id")){
sb.append(columnName).append(" int(10) PRIMARY KEY AUTO_INCREMENT,");
continue;
}
if(typeName.equals("String")){
sb.append(columnName).append(" varchar(64) NOT NULL,");
continue;
}
if(typeName.equals("int") || typeName.equals("long")){
sb.append(columnName).append(" bigint(20) NOT NULL,");
continue;
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
return sb.toString();
}
}
通过自定义注解生成自动建表和查询的sql语句