java注解实例-反射生成sql
2016-09-21 15:28
489 查看
定义描述用户表的注解:
package dao; 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 dao; 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(); }
定义映射Bean类User:
package dao; /** * * 用户表,字段包括:用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号: * * @author */ @Table("user") public class User { @Column("id") private int id; @Column("user_name") private String userName; @Column("nick_name") private String nickName; @Column("age") private int age; @Column("city") private String city; @Column("email") private String email; @Column("mobile") private String mobile; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } }
根据参数动态返回查询语句:
package dao; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 根据参数动态返回查询语句 * * @author */ public class ReturnQuery { public static String query(User u1) { StringBuilder str = new StringBuilder(); // 1.获取一个类class Class c = u1.getClass(); // 2.获取Table的名字 boolean exists = c.isAnnotationPresent(Table.class); if (!exists) { return null; } Table t = (Table) c.getAnnotation(Table.class); String tableName = t.value(); str.append("select * from ").append(tableName).append("where 1=1"); // 3.遍历所有的 字段 Field fArray[] = c.getDeclaredFields(); for (Field field : fArray) { // 4.处理每个字段对应的sql // 4.1取到字段名 boolean fExists = field.isAnnotationPresent(Column.class);// 判断是否包含Column类型的注解 if (!fExists) { continue; } Column column = field.getAnnotation(Column.class); String columnName = column.value(); // 4.2取到字段的值 String fieldName = field.getName(); // 获取相应字段的getXXX()方法 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Object fieldValue=null; try { Method getMethod = c.getMethod(getMethodName); fieldValue = getMethod.invoke(u1); } catch (Exception e) { e.printStackTrace(); } //4.3拼接Sql if (fieldValue==null||fieldValue instanceof Integer &&(Integer)fieldValue==0) { continue; } str.append(" and ").append(fieldName); if (fieldValue instanceof String) { if (((String) fieldValue).contains(",")) { String[] values=((String) fieldValue).split(","); str.append(" in ("); for (String s : values) { str.append("'").append(s).append("'").append(","); } str.deleteCharAt(str.length()-1); str.append(")"); }else{ str.append("=").append("'").append(fieldValue).append("' "); } }else { str.append("=").append(fieldValue); } } return str.toString(); } }
测试类:
package dao; public class Test { public static void main(String[] args) { User u1 = new User(); u1.setId(10); // 查询id User u2 = new User(); u2.setUserName("JSFei"); // 模糊查询用户名 u2.setAge(21); User u3 = new User(); u3.setEmail("123@163.com,123@qq.com"); // 查询邮箱有任意一个的用户 String sql1 = ReturnQuery.query(u1); String sql2 = ReturnQuery.query(u2); String sql3 = ReturnQuery.query(u3); System.out.println(sql1); System.out.println(sql2); System.out.println(sql3); } }
输出结果:
...............................................
相关文章推荐
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
- Java注解2--解析注解与注解反射生成SQL语句
- Java注解(四)——注解反射生成SQL语句
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- 实现poi方式生成excel文件和web类根据路径生成java实例的反射技术的springmvc方法的方法
- 注解,泛型,反射的小应用:生成增删改查SQL的语句
- java利用反射进行简单的自动sql生成
- java 动态生成SQL的实例讲解
- 基于注解和反射的Java ORM框架(4)-数据库自动生成Java实体类
- 浅谈java反射和自定义注解的综合应用实例
- Mybatis基于注解形式的sql语句生成实例代码
- JAVA自定义注解实现SQL语句自动生成DEMO
- 通过java反射实现对javabean生成各种sql语句
- java反射获取注解并拼接sql语句
- java 通过注解 生成sql的工具类
- 通过反射+注解生成sql语句
- Java利用自定义注解、反射实现简单BaseDao实例