当前位置: 首页 > wzjs >正文

网站 设计 电商模板大全免费

网站 设计 电商,模板大全免费,开发一个网站要多少钱,百度一下百度百科编写程序扫描一个包下所有的类,凡是被 Table 注解标注的类都要生成一条建表语句,表名在 Table 注解中指定。被Table 标注的类中的属性被 Column 注解标注,在 Column注解中描述字段的名称和字段的数据类型。 // 包路径声明:Vip类位…

编写程序扫描一个包下所有的类,凡是被 @Table 注解标注的类都要生成一条建表语句,表名在 @Table 注解中指定。被@Table 标注的类中的属性被 @Column 注解标注,在 @Column注解中描述字段的名称和字段的数据类型。

// 包路径声明:Vip类位于a.b子包下,用于测试反射和注解处理
package com.xie.javase.reflect.test.a.b;// 导入自定义注解
import com.xie.javase.reflect.test.anotation.Column;
import com.xie.javase.reflect.test.anotation.Table;@Table("t_vip") // 类级别的Table注解,指定对应数据库表名
public class Vip {@Column(name="id")    // 字段注解,指定数据库列名(使用默认varchar类型)private String id;@Column(name="name")  // 字段注解,指定数据库列名private String name;@Column(name="grade")  // 字段注解,指定数据库列名private String grade;
}// Customer类位于c子包下,用于对比测试(没有使用任何注解)
package com.xie.javase.reflect.test.c;public class Customer {private String cid;    // 没有注解的字段private String name;private int age;private String address;
}// 主测试类位于根包下
package com.xie.javase.reflect.test;// 导入各种依赖
import com.xie.javase.reflect.test.anotation.Column;
import com.xie.javase.reflect.test.anotation.Table;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;public class test {// 类路径根目录(编译后的class文件存放位置)private static String classpathRoot;// 用于拼接SQL语句的StringBuilderprivate static StringBuilder sb = new StringBuilder();public static void main(String[] args) {// 获取当前线程的类加载器,并获取类路径根目录classpathRoot = Thread.currentThread().getContextClassLoader().getResource(".").getPath();// 创建文件对象指向类路径根目录File file = new File(classpathRoot);// 开始递归处理目录/文件generateCreateStatement(file);// 输出最终生成的SQL语句System.out.println(sb);}/*** 递归生成建表SQL语句的核心方法* @param file 当前处理的文件/目录对象*/private static void generateCreateStatement(File file) {// 如果是文件(非目录)if (file.isFile()) {String classFileAbsolutePath = file.getAbsolutePath();// 检查是否是.class文件if (classFileAbsolutePath.endsWith(".class")) {/* 转换文件路径为完整类名:1. 截取从类路径根目录开始的部分(注意-1处理Windows路径问题)2. 移除.class后缀3. 将文件分隔符转换为包分隔符 */String className = classFileAbsolutePath.substring(classpathRoot.length() - 1, classFileAbsolutePath.length() - ".class".length()).replace("\\", ".");try {// 通过反射加载类Class<?> clazz = Class.forName(className);// 检查类是否包含Table注解if (clazz.isAnnotationPresent(Table.class)) {// 获取Table注解实例Table tableAnnotation = clazz.getAnnotation(Table.class);// 获取注解中定义的表名String tableName = tableAnnotation.value();// 开始拼接建表语句sb.append("create table ");sb.append(tableName);sb.append(" (");// 获取类的所有声明字段(包括私有字段)Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 检查字段是否包含Column注解if (field.isAnnotationPresent(Column.class)) {Column columnAnnotation = field.getAnnotation(Column.class);// 获取列名和类型(默认varchar)String columnName = columnAnnotation.name();String columnType = columnAnnotation.type();// 拼接列定义sb.append(columnName).append(" ").append(columnType).append(",");}}// 移除最后一个逗号并闭合语句sb.deleteCharAt(sb.length()-1);sb.append(");\n");}} catch (ClassNotFoundException e) {e.printStackTrace();}}return; // 文件处理完成返回}// 如果是目录,递归处理子文件File[] files = file.listFiles();for (File f : files) {generateCreateStatement(f);}}
}// Table注解定义(包路径:com.xie.javase.reflect.test.anotation)
package com.xie.javase.reflect.test.anotation;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(); // 必填属性,用于指定表名
}// Column注解定义
package com.xie.javase.reflect.test.anotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD) // 限定注解只能用于字段
public @interface Column {String name();         // 必填属性:列名String type() default "varchar"; // 可选属性,默认varchar类型
}// User类位于a子包下,用于测试不同类型字段
package com.xie.javase.reflect.test.a;import com.xie.javase.reflect.test.anotation.Column;
import com.xie.javase.reflect.test.anotation.Table;@Table("t_user") // 指定对应数据库表名
public class User {@Column(name="uid")  // 指定列名(使用默认varchar类型)private String userid;@Column(name="uname")private String username;@Column(name="pwd")private String password;@Column(name="age", type="int") // 显式指定int类型private int age;private String email; // 没有注解的字段不会被处理
}

关键点说明:

  1. 代码结构:
  • 使用自定义注解@Table和@Column标记需要处理的类和字段
  • 主程序通过递归扫描class文件+反射机制解析注解
  • 自动生成建表SQL语句
  1. 路径处理细节:
  • 使用classpathRoot.length() - 1处理Windows系统路径问题
  • 路径转换时使用replace("\\", ".")确保包名正确性
  1. 反射处理:
  • 使用Class.forName()动态加载类
  • 通过isAnnotationPresent判断注解存在性
  • getAnnotation获取注解实例读取配置值
  1. SQL生成:
  • 使用StringBuilder高效拼接字符串
  • 处理最后一个逗号的删除逻辑
  • 支持字段类型指定(默认varchar)
  1. 扩展性:
  • 通过添加新注解属性可以轻松扩展功能(如字段长度约束)
  • 递归文件处理机制自动扫描整个类路径

这个实现展示了注解处理器+反射机制的典型应用,可以自动将Java实体类转换为数据库建表语句,非常适合作为ORM框架的基础组件。

http://www.dtcms.com/wzjs/575897.html

相关文章:

  • 网站建设黄页软件如何做网站的悬浮窗口
  • 国外服装购物网站大全游戏开发工程师需要学什么
  • 普通的宣传网站用什么做wordpress免费中文完整版主题下载
  • 模板网站做外贸好不好设计师喜欢的几个网站
  • 如何制作网站建设大型商城购物平台开发
  • 网站建设需求说明书用php做的网站源代码
  • 网站模板抄袭中国移动官方网站
  • 社区信息建设网站有哪些网站可以做全屏代码
  • 58做网站wordpress 定时任务
  • 本地搭建网站怎么在电脑上做网站
  • 做网站需要用服务器吗东莞百度seo电话
  • 深圳网站建设 猴王网络做网站店铺图片用什么软件
  • 企业网站备案需要多久美食网站建设策划方案
  • 龙岗营销网站建设公司哪家好wordpress 商会 模版
  • 做网站需要雇什么人怎么开网页游戏平台
  • ceo是什么职位什么工作网站换空间 seo
  • 广州企业网站建设公司高端网站定制策划
  • 东山网站制作Wordpress简约卡片
  • 网站建设网络推广seo山东圣大建设集团网站
  • 深圳做网站哪家公司测名网
  • 基于阿里云的网站开发列举五种常用的网站推广方法
  • 专业的建设机械网站上海网站建设 润
  • 推广型网站制作公司长域名转换短域名
  • 网站seo优化排名张家口远大建设集团网站
  • 在哪里做企业网站黑龙江省垦区建设协会网站
  • 网站如何seo推广网站代运营多少钱一个月
  • 网站模板怎么改百度人气榜排名
  • 双浩建设网站宜家家居官网网上商城
  • 哪个网站做加盟网站建设技术李京文
  • ih5做自适应网站四川建设考试培训网