反射+自定义注解 实现(数据库语句的生成)
2018-03-31 15:43
309 查看
由于在前面写自定义注解的时候,实在不好写demo演示,当然也说了学完一些反射之后,再来写一个demo,那就趁着今天周末有空,写一个 传入Class,自动生成数据库语句的demo吧1.首先看使用吧 String userSql = SqlSentence.create(User.class); //数据库语句创建的调用实例
结果:create table UserTable(id integer primary key autoincrement,userName varchar(8),info text,password varchar(16))2.看User类public class User {@SqlField(length = 8)private String userName; //生成的数据语句是 userName varchar(8)@SqlFieldprivate int password; //生成的数据语句是 password varchar(16) 因为默认长度是16@SqlField(type = "text")private String info; //生成的数据语句是 info textprivate int age; //没有申明@SqlField注解 不生成private String sex; //没有申明@SqlField注解 不生成public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getPassword() {return password;}public void setPassword(int password) {this.password = password;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}3.看自定义注解类SqlField/*** 配置数据库语句字段*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface SqlField {/*** 字段的类型* @return varchar*/String type() default "varchar";/*** 字段的长度* @return 16*/int length() default 16;}4.看SqlSentence类public class SqlSentence {private SqlSentence() { /* cannot be instantiated */ }private final static String VARCHAR = "varchar";/*** @param clz class* @return sqlite sentence*/public static <T> String create(Class<T> clz) {if (clz == null) {return null;}try {Object instance = Class.forName(clz.getName()).newInstance();Class<?> aClass = instance.getClass();Field[] fields = aClass.getDeclaredFields();StringBuilder sb = new StringBuilder();for (Field field : fields) {field.setAccessible(true);if (field.isAnnotationPresent(SqlField.class)) { //判断是否存在此注解SqlField sqlField = field.getAnnotation(SqlField.class); //获取此注解String fieldName = field.getName();String type = sqlField.type();int length = sqlField.length();if (type.contains(VARCHAR)) {sb.append(fieldName).append(" " + VARCHAR + "(").append(length).append("),");} else { //用户自定义类型sb.append(fieldName).append(" ").append(type).append(",");}}}int length = sb.toString().length();if (length > 1) { //使用生成的字符串长度判断是否存在注解sb = sb.deleteCharAt(sb.toString().length() - 1); //删除字符串的最后一个字符return "create table " + clz.getSimpleName() + "Table" + "(id integer primary key autoincrement," + sb + ")";} else {throw new NullPointerException("No @SqlField annotations are configured on a field");}} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return null;}}
好了,一个简单的反射+自定义注解实现生成数据库语句的demo就ok了,如果对Android开发有所了解的人,可以看一看我在Android系列中所写的Sqlite数据库SDK,这是一个完全运用到反射+自定义注解去写的一个小框架,当然如果在Android系列中
没有这篇文章,说明我暂时还木有更新上去。
相关文章推荐
- JAVA自定义注解实现SQL语句自动生成DEMO(2)
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
- 利用反射+特性实现简单的实体映射数据库操作类(还未做自动生成SQL语句部分)
- JAVA自定义注解实现SQL语句自动生成DEMO
- 自定义ORM注解实现生成查询语句
- Afinal数据库模块实现(一)_注释Annotation和反射生成SQL语句
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
- 通过自定义注解反射生成SQL语句
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- 实现基于注解(Annotation)的数据库框架(三)自定义注解(Annotation)
- Eclipse中通过Hibernate Tools插件实现从数据库逆向生成Hibernate带注解的实体类
- 基于 自定义注解 和 aop 实现使用memcache 对数据库的缓存
- Android中的自定义注解(反射实现-运行时注解)
- 通过反射+注解生成sql语句
- 基于注解和反射的Java ORM框架(4)-数据库自动生成Java实体类
- 利用反射+自定义特性实现简单ORM(二),“无SQL”的数据库增删改查
- 自定义tt文本模板实现MySql指数据库中生成实体类
- 2 手写实现SpringMVC,第二节:自定义注解及反射赋值
- 反射+注解或去数据库查询语句
- 自定义注解结合反射实现绑定布局控件点击事件