反射+注解 封装增删改查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 {
}
然后在字段上面进行注解
@PrimaryKeyprivate 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语句
}
相关文章推荐
- 抓取锁的sql语句-第七次修改
- 数据库技术介绍
- 学习资料 数据库设计的三大范式
- mysql的从另外一张表update多个字段
- Mysql优化——Sql优化
- informix字符集设置
- mysql把字符串转化为整数
- Mysql 索引
- VB链接远程Oracle代码
- mysql中查询字段为null或者不为null
- 数据库查询练习1
- 【MyBatis学习07】动态sql
- 项目团队数据库版本管理及发布探索
- MySql-5.7.13-win64的安装及配置
- Ubuntu14.04下安装redis
- Redis学习笔记二
- 动态SQL与模糊查询
- redis的持久化
- SHEEL脚本redis开机启动
- MySQL 5.5/5.6复制