本文主要介绍如何使用Java运行时级别的注解配合反射来搭建框架,以下是构建sql表的简单例子,阐明了搭建运行时框架的方法
1.定义两个运行时注解,分别作用于类和字段表示表名和列名
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String name();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name();
}
2.定义存储列的模型NameAndType
public class NameAndType {
private String name;
private String type;
public NameAndType()
{
}
public NameAndType(String type, String name)
{
this.type = type;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
3.定义javabea 和数据库之间的关系映射
@Table(name="BeanTable")
public class Bean {
@Column(name="field") //注解@Colomn 具体实现接下来会讲
int field;
@Column(name="description")
String description;
}
4.通过反射定义工具类,定义动态获取表名,获取列相关信息和组装SQL
public class Utils {
private static String getTableName(Class<?> clazz)
{
String name = null;
if(clazz.isAnnotationPresent(Table.class))
{
Table table = clazz.getAnnotation(Table.class);
name = table.name();
}
return name;
}
private static List<NameAndType> getColumns(Class<?> clazz)
{
List<NameAndType> list = new ArrayList<>();
Field[] fields = clazz.getDeclaredFields();
if(fields != null)
{
for(Field field : fields)
{
if(field.isAnnotationPresent(Column.class))
{
Column column = field.getAnnotation(Column.class);
String name = column.name();
String type = null;
if(int.class.isAssignableFrom(field.getType()))
{
type = "integer";
}
else if(String.class.isAssignableFrom(field.getType()))
{
type = "text";
}
else
{
throw new RuntimeException("unsupport type :" + field.getType().getSimpleName());
}
list.add(new NameAndType(type, name));
}
}
}
return list;
}
public static String createTable(Class<?> bean) {
String tableName = getTableName(bean);
List<NameAndType> columns = getColumns(bean);
if (tableName != null && !tableName.equals("") && !columns.isEmpty()) {
StringBuilder createTableSql = new StringBuilder("create table ");
//加表名
createTableSql.append(tableName);
createTableSql.append("(");
//加表中字段
for (int i = 0; i < columns.size(); i++) {
NameAndType column = columns.get(i);
createTableSql.append(column.getName());
createTableSql.append(" ");
createTableSql.append(column.getType());
// 追加下一个字段定义前需要添加逗号
if (i != columns.size() - 1) {
createTableSql.append(",");
}
}
createTableSql.append(")");
return createTableSql.toString();
}
return null;
}
}
public class Test {
public static void main(String[] args)
{
System.out.println(Utils.createTable(Bean.class));
}
}
---运行结果如下:
create table BeanTable(field integer,description text)
分享到:
相关推荐
mybatis逆向工程 自定义添加注解以及注释、mapper,对框架前期搭建相当实用
使用@SpringBootTest来搭建测试环境,使用@AutoConfigueMockMVC类实现Mock http操作 热部署和热加载 热部署代表的是:我们不需要重启服务器,能够将新war包替换旧的war包。 热加载代表的是:我们不需要...
2、@RequestMapping注解的使用 3、Controller方法返回值 4、SpringMVC中异常处理 5、图片上传处理 6、Json数据交互 7、SpringMVC实现RESTful 8、拦截器 2.Spring入门 2.1.Springmvc是什么 3.3.jdbc编程步骤: 1、...
采用 AOP + 自定义注解 + Redis 实现限制IP接口访问次数 采用 Nacos 作为服务发现和配置中心,轻松完成项目的配置的维护 采用 Sentinel 流量控制框架,通过配置再也不怕网站被爆破 支持Markdown 编辑器 采用 Elastic...
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来...
这个框架是在学习Spring的时候,为了积累学习成果,自己搭建的,一般的系统开发也可以直接使用,包括一个系统开发的基础功能。 以下是当时自己开发时的日志,大致可以说明框架里已有功能 1.0.5 从web项目迁移成maven...
代码会在后续陆续更新公共组件统一配置中心RPCDubbo环境下基本请求级的缓存 (未同步代码)分布式调用链追踪自定义RPC框架:netty+consul简单RPC框架-业务线程池简易RPC框架-私有协议栈简易RPC框架-心跳与重连机制...
Java开发基于微服务架构的前后端分离的博客系统...采用 AOP + 自定义注解 + Redis 实现限制IP接口访问次数 采用 Sentinel 流量控制框架,通过配置再也不怕网站被爆破 页面交互使用 Vue2.x,极大的提高了开发效率。
自定义注解只会简单使用 学习: java代理实现get,set方法动态获取值 编写前端vue页面总体框架,编写后台代码交互 代码编写遇到的问题 问题: Vue使用问题 只有一个根路径 解决方案: 确保下只 - 不懂运行,...
2、自定义@Table @Column等注解,支持列的别名。 3、支持自定义查询条件,支持分页查询。 4、独立jar,通过maven依赖,代码可扩展性强。 5、采用mybatis3,跨表复杂查询支持自定义sql。 6、代码简化,可作为基础支撑...
自定义注解只会简单使用 学习: java代理实现get,set方法动态获取值 编写前端vue页面总体框架,编写后台代码交互 代码编写遇到的问题 问题: Vue使用问题 只有一个根路径 解决方案: 确保下只有一个根路径 ...
环境搭建和RestFul风格接口配置Log4j2,实现不同环境日志打印。配置系统全局异常映射处理。定时任务和异步任务的使用方式。多个拦截器配置和使用场景。引入JdbcTemplate,和多数据源配置。集成Druid连接池,配置监控...
17.1.3 自定义尺寸固定线程池的使用 375 17.1.4 单任务线程池的使用 377 17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用自定义参数的线程池 381 17.2 有返回值的线程调用 ...
对主流开发框架的无配置集成 项目可独立运行,无需外部依赖Servlet容器 提供运行时的应用监控 极大地提高了开发,部署效率 与云计算的天然集成 缺点 书籍文档较少,且不够深入 ...
LogService 日志服务通用模块 1.采用springboot+jpa框架搭建 2.自定义注解,拦截器和rabbitMq实现日志异步插入数据库
generator一键生成代码插件、logback、一键生成文档以及多环境的配置方法,最后再介绍一下自定义配置的注解获取、全局异常处理等经常用到的东西。 开发环境 本人使用IDEA作为开发工具,IDEA下载时默认集成了...
教程目录: ├─0001-多线程快速入门.zip ├─0002-多线程之间实现同步.zip ├─0003--多线程之间通讯.zip ├─0004--Java并发编程.zip ├─0005--数据交换格式与SpringIOC底层实现.zip ├─0006--自定义注解与设计...