`

使用自定义注解搭建简单框架

阅读更多
本文主要介绍如何使用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)




分享到:
评论

相关推荐

    springBoot+aop+自定义注解+本地线程实现统一接口日志及接口响应时长

    springboot+拦截器+aop+自定义注解+本地线程实现统一接口日志记录,记录下接口所在模块、接口描述、接口请求参数、接口返回参数、接口请求时间以及接口耗时用于接口优化,接口记录参数以及操作人防止使用人员误操作...

    SpringMvc自定义注解获取用户登陆信息.rar

    自定义注解的定义通常包含元注解,如`@Retention`(指定注解的生命周期)、`@Target`(指定可以使用的元素类型)和`@Documented`等。 3. **处理自定义注解** 注解本身不执行任何操作,它们必须被解析才能起作用。...

    android 进阶之注解框架搭建

    1. **定义注解**:创建自定义注解,例如`@MyAnnotation`。这可以通过使用`@interface`关键字实现,并在其中定义参数,这些参数在使用注解时可以被赋值。 ```java @Retention(RetentionPolicy.CLASS) @Target...

    ssh框架搭建并简单实例实现(注册登录功能)

    3. 如果验证成功,可以使用Spring Security或自定义Session管理实现用户登录状态的维护。 4. 登录成功后,跳转到主页或其他受保护的页面。 在实践中,还需要处理可能出现的异常,优化用户体验,如添加验证码、错误...

    使用netty+spring搭建游戏框架

    综上所述,搭建一个Netty+Spring的游戏框架需要理解两个框架的核心原理,并将其特性融合到游戏服务的各个层面。通过这样的框架,可以构建出稳定、高效的网络游戏服务器。如果你对这个主题感兴趣,可以参考给定的博文...

    Mybatis自定义框架及使用1

    【Mybatis自定义框架及使用】知识详解 Mybatis 是一款优秀的 Java 持久层框架,它专注于 SQL 查询,提供了动态 SQL 支持,使得开发者可以更方便地编写 SQL 代码。本篇将深入探讨 Mybatis 的核心概念、使用方法以及...

    Struts2框架搭建

    在Action类中,可以使用Struts2的注解简化配置,例如`@Action`用于指定URL映射,`@Result`定义结果页面。如果使用`struts2-convention-plugin`,那么Action的命名和方法的命名规则会自动映射到URL,大大减少了XML...

    IDEA下搭建maven项目(SSM框架)

    以上就是在IDEA下使用Maven搭建SSM框架项目,实现登录拦截和注解式事务管理的基本流程。这个过程中,我们不仅需要熟悉各个框架的使用,还要掌握Spring的配置、MyBatis的映射机制以及Maven项目的构建方式。希望这篇...

    ssh注解框架整合

    SSH框架整合是一个常见的Java Web开发任务,涉及...这样的整合使得开发者可以快速搭建应用,并通过注解实现灵活的配置,降低了代码的复杂度,提高了开发效率。理解并掌握这些知识点对于Java Web开发人员来说至关重要。

    springmvc+shiro 框架搭建

    5. 使用Shiro注解:在Controller的方法上使用Shiro的@RequiresAuthentication、@RequiresRoles和@RequiresPermissions等注解,实现权限控制。 6. 自定义拦截器:如果需要更复杂的权限控制,可以创建自定义的Shiro...

    SSH搭建的框架,提供

    标题中的"SSH搭建的框架"指的是在IT行业中常用的Spring、Struts和Hibernate三大框架的集成,这是一套常用于Java Web开发的技术栈。SSH框架的整合提供了强大的后端开发能力,能够有效地处理业务逻辑、数据持久化以及...

    Struts框架搭建和基本使用

    本教程将详细介绍如何搭建Struts框架,并演示其基本使用,包括所需的库、输入验证、FreeMarker模板引擎的使用以及国际化资源文件的配置。 首先,搭建Struts框架的核心在于正确配置项目的类路径。你需要以下7个必备...

    MyBatis框架OA未搭建

    - 如果项目中使用了Spring框架,可以将MyBatis与Spring整合,通过`@Autowired`注解实现DAO的自动注入。 - 在Spring配置文件中,配置SqlSessionFactoryBean以及MapperScannerConfigurer,扫描Mapper接口。 8. **...

    AOP注解动态切换.rar

    - 在需要切换数据源的方法上使用自定义注解。 7. **监控与调试** Druid提供了强大的监控界面,可以实时查看数据源的状态、SQL执行情况等,这对于理解和优化数据库性能非常有帮助。 8. **注意事项** - 确保不同...

    shiro基础框架搭建

    本文将详细介绍如何使用SpringBoot集成Shiro,结合Redis进行权限管理,并利用MyBatis作为持久层框架进行数据操作。 **一、Shiro框架基础** Shiro提供了身份验证(Authentication)、授权(Authorization)、加密...

    使用Jersey框架搭建Rest服务

    在IT行业中,REST...这个教程文档"使用Jersey框架搭建Rest服务.doc"应该会提供更详细步骤和示例,包括如何测试和部署你的REST服务。建议仔细阅读,以深入理解每个步骤和最佳实践,确保你的REST服务按照预期工作。

    SpringMvc+MyBatis搭建MVC框架

    下面将详细解释如何使用这两个框架搭建一个高效的MVC应用。 1. **Spring MVC框架**: - **概念**:Spring MVC是Spring框架的一部分,用于构建Web应用程序。它通过解耦业务逻辑、用户界面和数据访问,提高了开发...

    简单的SSH框架搭建包含测试方法(其中hibernate包含在Spring框架中)

    在这个简单的SSH框架搭建中,Hibernate被集成到Spring框架内,形成了一个更高效的解决方案。 首先,我们需要理解Spring框架的核心概念。Spring通过IoC(Inversion of Control,控制反转)和DI(Dependency ...

    SSM框架搭建(IDEA+Maven)

    下面我们将详细讲解如何在IntelliJ IDEA(IDEA)中结合Maven来搭建SSM框架,并进行简单的应用。 首先,我们需要了解这三个框架的基本概念: 1. Spring:这是一个轻量级的Java企业级应用框架,核心功能包括依赖注入...

Global site tag (gtag.js) - Google Analytics