`
amosleaf
  • 浏览: 60243 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用注解做ORM

    博客分类:
  • Nutz
阅读更多

1. 注解在Nutz中的应用

在nutz中,和数据库对应的pojo,我们可以使用注解的方式来配置field和table的column之间的对应,也可以用注解来配置两个pojo之间的关系,例如我有一个POJO,名字叫"Box",里面包含两个字段:

(1)

@Column("boxid")
@Id
private int id;

 对于字段id,@Column("boxid")说明在数据库中对应column "boxid", @Id说明,这个是主键。

 

(2)

@Many(target = BoxInfo.class, field = "boxId")
private BoxInfo[] infos;

这个注解声明了Box和BoxInfo这两个POJO之间存在一对多的关系:Box----->多个 BoxInfo,也就是说给定一个boxid,您可以在BoxInfo对应的table里面找到多条记录,通过"boxId"与"Box"关联。如果我没有说清楚这个例子,您可以去参考nutz项目的wiki,你会发现更多实用的注解和介绍。

 

2.注解的简单介绍

我相信,在此之前,您一定使用过注解,我猜测您用过junit4,hibernate3,等等框架或工具,最起码你用过@Override(我不信你没用过这个)。

Annotation是jdk1.5引进的,它的引入给我们了一种新的手段来增加程序的信息,在src,class或runtime级别。程序员可以自己定义一些Annotation,然后把它用到自己的程序中,当然您还得编写自己的Annotation处理器。

 

3.简单的例子

(3.1) 假如我想定义两个Annotation(@TableName ,@Column)给POJO使用,@TableName用在POJO的类上,声明对应于数据库的哪个table,@Column用在POJO的field上,用于指明对应的column,那么我可以这么做:

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TableName{
	String value();
}

@Target(ElementType.TYPE)说明了这是一个"类、接口(包括注释类型)或枚举声明",打开你的JDKAPI,去找“java.lang.annotation.ElementType”,您会发现更多的可选Target。

@Retention(RetentionPolicy.RUNTIME)指明"编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取"。

 再来定义一个

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {

	String value() default "";

}

 

(3.2) 把这两个注解应用到我的code中

@TableName("tbl_user")
public class User {

	@Column
	private int id;

	@Column
	private String name;

	@Column("age")
	private int userAge;

	public int getId() {return id;}
	public void setId(int id) {this.id = id;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public int getUserAge() {return userAge;}
	public void setUserAge(int userAge) {this.userAge = userAge;}
}

(3.3) 假如我想写一个处理器,为使用这两个注解的POJO生成Insert语句,那么我可以这么做。(为了不使示例复杂,这里只考虑最天真幼稚的情况,并且把所有代码放在一块,您明白什么意思就行)。

 

 

public class SqlGetter {

	public static void main(String[] args) throws Exception {
		User user = new User();
		user.setId(1);
		user.setName("Tom");
		user.setUserAge(12);
		System.out.println(new SqlGetter().getInsertSql(user));		
	}

	public String getInsertSql(Object obj) throws Exception {
		//获取table名称
		String tableName=obj.getClass().getAnnotation(TableName.class).value();
		
		// 存放column---value
		HashMap<String, Object> kvs = new HashMap<String, Object>();
		Field[] fs = obj.getClass().getDeclaredFields();
		for (Field f : fs) {
			String cn = this.getFieldColumn(f);
			if (cn != null) {
				kvs.put(f.getName(), this.getFieldValue(obj,f));
			}
		}
		//硬拼SQl
		StringBuilder prefix = new StringBuilder();
		StringBuilder suffix = new StringBuilder();
		for(Iterator<String> it=kvs.keySet().iterator();it.hasNext();){
			String key=it.next();
			prefix.append(key);
			suffix.append(kvs.get(key));
			if (it.hasNext()) {
				prefix.append(",");
				suffix.append(",");
			}
		}		
		return String.format("INSERT INTO %s (%s) VALUES (%s)", tableName,prefix,suffix);
	}

	private String getFieldColumn(Field field) {
		Column column = field.getAnnotation(Column.class);
		if (column != null) {
			if ("".equals(column.value()))
				return field.getName();
			else {
				return column.value();
			}
		}
		return null;
	}

	private Object getFieldValue(Object obj,Field field) throws Exception {
		String name = field.getName();
		String c = name.substring(0, 1);
		name = name.replaceFirst(c, c.toUpperCase());
		Method m = obj.getClass().getMethod("get" + name, new Class<?>[] {});
		return m.invoke(obj, new Object[] {});
	}

}

 不出意外,输出应该是"INSERT INTO tbl_user (id,name,userAge) VALUES (1,Tom,12)"。
 通过这个例子您会发现许多问题:

(1)代码结构差 (2)异常处理差 (3)结果都不对,因为sql语句没有给string类型加上引号。(4).....

但是,如果您之前对Annotation不是特别了解,但愿本文能起到一个抛砖引玉的作用。

 

最后,您可以去使用一下Nutz的dao功能,去体验一下Annotation给我们带来的便利。http://code.google.com/p/nutz/

 


 

 

1
1
分享到:
评论
3 楼 我是你们的爹 2016-03-08  
这篇文章有些问题,不适合新手阅读,容易对新手产生误导!
2 楼 amosleaf 2010-01-20  
天机老人 写道
这个能用pojo生成数据库吗?
当然我同意,复杂的表关系与SQL自己写。

但是还是最好出一个pojo转数据库的生成工具吧,在开发阶段可以引到jar包中,开发完后,上线后,以后可以不一定要引入。

我喜欢DDD

目前没有做到生成数据库。
1 楼 天机老人 2010-01-19  
这个能用pojo生成数据库吗?
当然我同意,复杂的表关系与SQL自己写。

但是还是最好出一个pojo转数据库的生成工具吧,在开发阶段可以引到jar包中,开发完后,上线后,以后可以不一定要引入。

我喜欢DDD

相关推荐

    反射+注解自定义ORM

    在ORM框架中,我们可以使用注解来标记那些需要映射到数据库表的类、字段,以及定义特定的数据库操作。例如,`@Table`表示对应的类映射到数据库的一个表,`@Column`表示字段映射到表的列。 3. **自定义ORM**: ...

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    AndroidInject增加sqlite3数据库映射注解(ORM).zip

    在项目"AndroidInject增加sqlite3数据库映射注解(ORM)"中,开发者可能会演示如何配置和集成ORM库,如何定义和使用注解,以及如何在实际业务逻辑中进行数据库操作。这包括创建数据库模型,使用注解标记字段,通过ORM...

    基于注解的hbase orm小工具,目前比较简单

    **基于注解的HBase ORM小工具详解** 在大数据领域,Apache HBase作为一个分布式、面向列的NoSQL数据库,常用于处理大规模数据。然而,与传统的关系型数据库不同,HBase的操作模式相对复杂,需要通过Java API进行低...

    Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).rar

    这个压缩包"Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).rar"提供了一个示例,展示了如何在Android项目中使用SQLite3数据库,并结合ORM(对象关系映射)技术,通过注解的方式简化数据库操作。...

    Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).zip

    这个压缩包"Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).zip"提供了一个示例,展示了如何在Android项目中使用SQLite3数据库,并通过ORM(对象关系映射)技术来简化数据库操作。ORM允许开发者...

    安卓Android源码——Inject增加sqlite3数据库映射注解(ORM).zip

    "Inject增加sqlite3数据库映射注解(ORM)"是一个关于如何在Android项目中使用对象关系映射(ORM)技术来简化SQLite数据库操作的主题。ORM允许开发者用面向对象的方式来处理数据库,减少了直接操作SQL语句的工作量,...

    ormsql使用示例

    本教程将通过一个简单易懂的示例来介绍如何在Android项目中使用ORMSQL进行数据存储和查询。 ### ORM概念 ORM全称为Object-Relational Mapping,即对象关系映射,它是一种技术,用于将关系数据库的数据模型与面向...

    ORM思想的深入学习ORM.zip

    1. **ORM思想**:ORM的核心思想是通过在应用程序中的对象与数据库表之间建立映射关系,使得开发者可以使用面向对象的方式来操作数据库,而无需直接编写SQL语句。这种映射关系通常通过XML配置文件或者注解来定义,...

    Moon.Orm下载

    ORM框架的主要目标是简化数据库操作,使得开发者可以使用面向对象的方式与数据库进行交互,而无需关心底层SQL语句的编写。 Moon.Orm的核心特性包括: 1. **多数据库支持**:Moon.Orm的一个显著特点是其多数据库...

    AndroidInject增加sqlite3数据库映射注解(ORM)

    AndroidInject库正是这样一个帮助开发者实现ORM的工具,它允许开发者通过注解来实现SQLite3数据库的映射。 首先,让我们深入理解AndroidInject的ORM机制。ORM的核心是将Java对象与数据库表进行映射,通过注解,我们...

    Android ORM 数据库的使用

    本篇将深入探讨Android中ORM数据库的使用,特别是以ActiveAndroid为例。 **ORM框架介绍** ORM是一种编程技术,它可以将关系型数据库的数据映射到对象上,使得开发者可以像操作普通对象一样操作数据库。ORM框架消除...

    AndroidInject增加sqlite3数据库映射注解(ORM).rar

    本话题主要探讨如何在Android中使用SQLite数据库,并通过AndroidInject库和sqlite3注解实现对象关系映射(ORM),以简化数据库操作。ORM允许开发者用面向对象的方式来处理数据库,而无需直接编写SQL语句,提高了代码...

    安卓Andriod源码——Inject增加sqlite3数据库映射注解(ORM).zip

    本资料包"安卓Andriod源码——Inject增加sqlite3数据库映射注解(ORM)"聚焦于如何通过注入(Inject)和对象关系映射(ORM)技术来简化SQLite3数据库的使用。 首先,我们需要理解ORM(Object-Relational Mapping)的...

    orm的详细解释概念

    这样,开发者可以使用面向对象的语言(如Java)操作对象,而ORM框架负责在后台将这些操作转化为相应的SQL指令,与数据库进行交互。 ORM的实现通常包括以下几个组件: 1. **持久化类对象操作API**:这是一个用于...

    AndroidInject增加sqlite3数据库映射注解(ORM)-IT计算机-毕业设计.zip

    - 使用注解:在实体类中,通过注解定义数据库表和字段,如@Table、@Column等,让ORM框架自动处理创建表、字段映射等任务。 - 数据库操作:通过ORM提供的API,如insert()、update()、delete()、query()等方法,进行...

    hsweb-easy-orm, 简单的orm工具,为动态表单而生.zip

    通过阅读源码,开发者可以深入了解 HSWeb-Easy-ORM 的实现细节,包括实体类的注解、查询构造器的使用、事务管理等。 总结来说,HSWeb-Easy-ORM 是一个针对动态表单设计的轻量级 ORM 工具,旨在简化数据库操作并提高...

    AndroidInject增加sqlite3数据库映射注解(ORM).7z

    本文将深入探讨如何使用AndroidInject库结合sqlite3数据库,通过注解实现对象关系映射(ORM),以提高开发效率和代码可读性。 AndroidInject是一个强大的依赖注入框架,它基于Dagger 2,旨在简化Android应用中的...

    ORM映射与WEB的应用

    ORM的核心思想是通过创建一个映射文件或使用注解,将数据库的表与程序中的类关联起来,每个表对应一个类,表中的字段对应类的属性。这样,当我们在程序中操作对象时,实际上是在操作数据库中的数据,反之亦然。ORM...

    Inject增加sqlite3数据库映射注解(ORM).zip

    本教程将介绍如何在Android项目中使用Inject库来实现SQLite3数据库的ORM映射注解。 Inject库是一个基于Java的依赖注入框架,它可以帮助我们简化代码,提高可维护性。在SQLite3数据库中使用Inject,可以通过注解的...

Global site tag (gtag.js) - Google Analytics