通过反射+注解生成sql语句
2016-06-13 09:31
295 查看
通过反射+注解生成sql语句
先写注解
设置主键的注解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 Primarykey {//主键的注解 } //不属于类中字段的注解(有些表之间有关联的,在类中有字段但是在数据库查询语句中不需要该字段的) 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 NonField { }
然后写方法
代码块
public class BeanUtil {//方法类 //获取查询语句 public static String selectsql(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Class<? extends Object> c=obj.getClass();//通过反射获取类 String tableName = c.getSimpleName();//获取类名(数据库表名) StringBuffer sbsql=new StringBuffer();//拼接sql语句 sbsql.append(" select * from "+tableName+" where 1=1 "); Field[] fields = c.getDeclaredFields();//获取类中的字段 for(Field f : fields){ String methodName="get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);//拼接字符串 Method m = c.getDeclaredMethod(methodName);//通过拼接的字符串获取方法 Object o=m.invoke(obj);//通过方法得到值 if(o instanceof String){//判断值是否属于字符串类型(oracle的sql语句中string类型需要加''号) sbsql.append("and "+methodName+"='"+o+"' "); }else{ sbsql.append("and "+methodName+"="+o+" "); } } return sbsql.toString(); } //获取添加语句 public static String insertsql(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Class<? extends Object> c=obj.getClass(); String tableName = c.getSimpleName(); StringBuffer sbsql=new StringBuffer(); sbsql.append(" insert into "+tableName+" ( "); Field[] fields = c.getDeclaredFields(); for(Field f : fields){ String str=f.getName(); sbsql.append(str+","); } sbsql.deleteCharAt(sbsql.length()-1);//去掉生成的字符串最后一个多余的【,】号 sbsql.append(") values("); for(Field f : fields){ String methodName="get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1); Method m = c.getDeclaredMethod(methodName); Object o=m.invoke(obj); if(o instanceof String ){ sbsql.append("'"+o+"',"); }else{ sbsql.append(o+","); } } sbsql.deleteCharAt(sbsql.length()-1);//去掉生成的字符串最后一个多余的【,】号 sbsql.append(") "); return sbsql.toString(); } //获取更新语句 public static String updatesql(Object obj) throws IllegalArgumentException, IllegalAccessException{ Class<? extends Object> c = obj.getClass(); String tableName = c.getSimpleName(); String sbsql=" update "+tableName; String sql1=" where "; String sql2=" set "; Field[] fields = c.getDeclaredFields(); for(Field f:fields){ f.setAccessible(true); if(f.isAnnotationPresent(Primarykey.class)){ Object o=f.get(obj); if(o instanceof String){ sql1+=f.getName()+"='"+o+"' "; }else{ sql1+=f.getName()+"="+o+" "; } }else if(!f.isAnnotationPresent(NonField.class)){ Object o=f.get(obj); if(o instanceof String){ sql2+=f.getName()+"='"+o+"', "; }else{ sql2+=f.getName()+"="+o+", "; } } } sql2=sql2.substring(0,sql2.length()-2); sbsql=sbsql+sql2+sql1; return sbsql; } //获取删除语句 public static String deletesql(Object obj) throws IllegalArgumentException, IllegalAccessException{ Class<? extends Object> c = obj.getClass(); String tableName = c.getSimpleName(); String sql=" delete from "+tableName; String sql2=" where "; Field[] fields= c.getDeclaredFields(); for(Field f:fields){ f.setAccessible(true); if(f.isAnnotationPresent(Primarykey.class)){ Object o = f.get(obj); if(o instanceof String ){ sql2+=f.getName()+"='"+o+"' "; }else{ sql2+=f.getName()+"="+o+" "; } } } sql=sql+sql2; return sql; } }
相关文章推荐
- Mysql----学习笔记
- 反射+注解 封装增删改查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的持久化