Java注解(2):实现自己的ORM()

  本篇文章为你整理了Java注解(2):实现自己的ORM()的详细内容,包含有 Java注解(2):实现自己的ORM,希望能帮助你了解 Java注解(2):实现自己的ORM。

  搞过Java的码农都知道,在J2EE开发中一个(确切地说,应该是一类)很重要的框架,那就是ORM(Object Relational Mapping,对象关系映射)。它把Java中的类和数据库中的表关联起来,可以像操作对象那样操作数据表,十分方便。给码农们节约了大量的时间去摸鱼。其实它的本质一点都不复杂,而最核心的就是怎么实现对象和表之间的转换。之前对反射和注解有了一点了解,所以就试着来实现咱们自己的缝合怪。

  首先,需要建立一个「表格」:

  

/**

 

   * 类注解,将类注解成数据库表

   * @author xiangwang

  @Target(ElementType.TYPE)

  @Retention(RetentionPolicy.RUNTIME)

  public @interface DBTable {

   String name() default "";

  }

 

  

  

  然后,定义需要的数据库数据类型:

  

/**

 

   * 字段类型枚举

   * @author xiangwang

  public enum Type {

   CHAR,

   STRING,

   BOOLEAN,

   INTEGER,

   LONG,

   FLOAT,

   DOUBLE,

   DATETIME

  
ColumnType columntype() default @ColumnType;

   ExtraInfo extrainfo() default @ExtraInfo;

   Constraints constraints() default @Constraints;

  }

 

  

  

  最后,创建实体类,应用刚才写好的这些注解:

  

/**

 

   * 用户实体类

   * @author xiangwang

  @DBTable(name = "User")

  public class User {

   @TableColumn(

   columntype = @ColumnType(Type.INTEGER),

   extrainfo = @ExtraInfo(name = "id", length = 4),

   constraints = @Constraints(primaryKey = true))

   private String id;

   @TableColumn(

   columntype = @ColumnType(Type.STRING),

   extrainfo = @ExtraInfo(name = "name", length = 32),

   constraints = @Constraints(primaryKey = false, allowNull = false, unique = true))

   private String name;

   @TableColumn(

   columntype = @ColumnType(Type.INTEGER),

   extrainfo = @ExtraInfo(name = "age", length = 4),

   constraints = @Constraints(primaryKey = false))

   private Integer age;

   public String getId() { return id; }

   public void setId(String id) { this.id = id; }

   public String getName() { return name; }

   public void setName(String name) { this.name = name; }

   public Integer getAge() { return age; }

   public void setAge(Integer age) { this.age = age; }

   @Override

   public String toString() {

   return "User [id=" + id + ", name=" + name + ", age=" + age + "]";

  }

 

  

  

  来看看ORM是怎么工作的吧:

  

/**

 

   * 解析类型注解

  private static String getColumnType(ColumnType columntype) {

   String type = "";

   switch (columntype.value()) {

   case CHAR:

   type += "CHAR";

   break;

   case STRING:

   type += "VARCHAR";

   break;

   case BOOLEAN:

   type += "BIT";

   break;

   case INTEGER:

   type += "INT";

   break;

   case LONG:

   type += "BIGINT";

   break;

   case FLOAT:

   type += "FLOAT";

   break;

   case DOUBLE:

   type += "DOUBLE";

   break;

   case DATETIME:

   type += "DATETIME";

   break;

   default:

   type += "VARCHAR";

   break;

   return type;

  
clazz = Class.forName(className);

   DBTable dbTable = clazz.getAnnotation(DBTable.class);

   if (dbTable == null) {// 无DBTable注解

   continue;

   // 转大写

   String tableName = clazz.getSimpleName().toUpperCase();

   StringBuilder sql = new StringBuilder("CREATE TABLE " + tableName + "(");

   for (Field field : clazz.getDeclaredFields()) {

   // 反射得到注解

   Annotation[] anns = field.getDeclaredAnnotations();

   if (anns.length 1) {

   continue;

   String columnInfo = "";

   // 类型判断

   if (anns[0] instanceof TableColumn) {

   TableColumn column = (TableColumn) anns[0];

   String type = getColumnType(column.columntype());

   columnInfo = getExtraInfo(column.extrainfo());

   // 代替(

   columnInfo = columnInfo.replace("(", type + "(");

   columnInfo += getConstraints(column.constraints());

   sql.append("\n " + columnInfo + ",");

   // 删除尾部的逗号

   String tableCreate = sql.substring(0, sql.length() - 1) + "\n);";

   System.out.println(tableCreate);

   } catch (ClassNotFoundException e) {

   e.printStackTrace();

  }

 

  

  

  验证效果的时候到了:

  

public static void main(String[] args) {

 

   Class ? clazz = User.class;

   List String list = new ArrayList ();

   list.add(clazz.getName());

   createTable(list);

  }

 

  

  

  当然,实际的运营于生产环境中的ORM框架可要比这个小玩意复杂多了。但千变万变,原理不变,ORM的核心——反射+ 注解——就是这么玩的。

  

  以上就是Java注解(2):实现自己的ORM()的详细内容,想要了解更多 Java注解(2):实现自己的ORM的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: