您的位置:首页 > 数据库

反射+注解 封装增删改查sql语句

2016-06-13 09:22 260 查看

1.反射是什么?

反射就是通过class对象获取类的字段,方法等信息。

2.反射的常用方法:

1)Class classzz=Person.class;//第一种,如果不需要赋值采用这种

2)Person p = new Person();//第二种,如果需要给字段赋值最好采用这种

Class classzz = p.getClass();

3)Class classzz = Class.forName("com.wy.test.Person");//第三种,知道包名采用这种

3.应用场景:自动生成sql语句

public class BeanUtil {

//查询语句的生成
public static String getSelectSql(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<? extends Object> classzz=obj.getClass();//通过反射获取这个类
String tableName=classzz.getSimpleName();//这个类的类名 就是表名
StringBuffer sbsql=new StringBuffer();//创建一个拼接语句
sbsql.append(" Select * From "+tableName+" ");
sbsql.append(" Where 1=1 ");
Field[] fields=classzz.getDeclaredFields();//获取类的字段的集合
for(Field f:fields){//遍历字段
//拼接获取字段的方法名 例如:getName
String methodName="get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
//获取方法对象
Method m = classzz.getDeclaredMethod(methodName);
//创建一个Object对象来接收通过get方法获取到的字段值
Object o = null;
o =m.invoke(obj);//invoke方法来获取字段的值
if(o!=null){//判断字段的值是否为空,当不为空的时候
if(o instanceof String){//判断字段值是否为String类型(String类型要加单引号)name='李四'
sbsql.append(" And "+f.getName()+"='"+o+"' ");
}else{
sbsql.append(" And "+f.getName()+"="+o+" ");
}
}
}
return sbsql.toString();//最后返回拼接完成的sql语句
}

}

4.什么是注解?怎么应用?

        1)反射的时候读取它的一些标记特性,比如:主键,不是字段等标记

2)应用:先定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NonField {

}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {

}

然后在字段上面进行注解

@PrimaryKey
private int userId;
private String name;
private int age;
@NonField
private Job job;

5.实例(注解+反射+字符串拼接=生成增加操作sql语句)

//增加修改sql语句生成
public static String getUpdate(Object obj) throws IllegalArgumentException, IllegalAccessException{
Class<? extends Object> classzz = obj.getClass();//反射来获取类
//拼接修改操作sql语句
String sql1="Update "+classzz.getSimpleName()+" Set ";
String sql2=" ";
String sql3=" Where ";
Field[] fields = classzz.getDeclaredFields();//获取字段集合
for(Field f:fields){//遍历字段
f.setAccessible(true);//设置可以访问private属性
Object value=f.get(obj);//获取字段值
if(f.isAnnotationPresent(PrimaryKey.class)){//如果这个字段有主键PrimaryKey注解标记
if(value instanceof String){//如果这个字段值是String类型,则加单引号
sql3 +=f.getName()+"='"+value+"' ";
}else{
sql3 +=f.getName()+"="+value+" ";//不是String就不加
}
}else if(!f.isAnnotationPresent(NonField.class)){//如果没有注解NonField标记(不是字段)的字段
if(value instanceof String){//如果这个字段值是String类型,加单引号
sql2 +=f.getName()+"='"+value+"', ";//Set后面是   字段名=修改后的值,
}else{
sql2 +=f.getName()+"="+value+", ";
}
}
}
sql2=sql2.substring(0,sql2.length()-1);//最后一个字段没有(逗号,)
String sql=sql1+sql2+sql3;//拼接3段字符串为最终修改操作sql语句
return sql;//返回这个修改操作sql语句
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: