利用Java的反射机制实现的ORM数据库查询

我们在做Java的开发时,我们很不希望写SQL语句,因为Eclipse里面没有对SQL进行检查的机制,不小心写错了,我们很难在冗长的SQL语句中,找出要SQL语句的错误。所以我们喜欢用ORM方式来做数据库的操作。

 

这里我写了一个简单的实现ORM的操作的方法,希望对大家的工作会有一定的帮助。

 

 

1.首先我们要定义一个Java注释类,叫Id,自从Java1.5以后,我们可以用注释这种方法来取代以前用XML来定义的这种方法。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
	public String name = "id";
}

 有了这个注释类后,我们可以定义一个实体的ID是哪一个属性。

2.接下来,我们就可以定义实体类了。我用的数据是SQLServer2005,但其实数据库应该可以适用。

数据库的表结构如下:

 

CREATE TABLE [dbo].[newsclass](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](45) COLLATE Chinese_PRC_CI_AS NOT NULL,
 CONSTRAINT [PK__newsclass__7F60ED59] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

 

我们定义一个NewsClass类,来对应这张表,

public class NewsClass {
	@Id 
	private String id;
	private String name;
	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;
	}
}

 

接下来,我们可以定义一个Dao的类,叫ORMDao。

public class ORMDao {
	
	/**
	 * 获取实体的ID值
	 * 
	 * @param entity
	 * @return
	 */
	public String getIdField(Object entity) {

		String idField = null;
		try {
			Field[] fields = Class.forName("com.trip.info.entity.News")

			.getDeclaredFields();

			System.out.println(fields.length);

			Annotation[] annotations;

			for (Field field : fields) {

				annotations = field.getDeclaredAnnotations();

				for (Annotation a : annotations) {
					if (a.annotationType().getSimpleName().equals("Id")) {
						idField = field.getName();
					}
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return idField;
	}

	/**
	 * 对象查询
	 * 
	 * @param entity
	 * @param pageNo
	 * @param pageSize
	 * @param orderType
	 * @return
	 * @throws Exception
	 */
	public void query(Object entity){

		Field[] fields = entity.getClass().getDeclaredFields();

		String sqlSelect = "";

		String sqlWhere = "";

		String sql = "";

		Class cl = entity.getClass();

		boolean firstFlag = true;

		ArrayList cols = new ArrayList();
		
		String id = this.getIdField(entity);
		
		String className = entity.getClass().getSimpleName();

		for (int i = 0; i < fields.length; i++) {

			String fieldName = fields[i].getName();
			if (i != fields.length - 1) {
				sqlSelect += fieldName + ",";
			} else {
				sqlSelect += fieldName;
			}

			cols.add(fieldName);

			String methodName = "get" + fieldName.substring(0, 1).toUpperCase()
					+ fieldName.substring(1, fieldName.length());
			

			

			try{
				if (cl.getMethod(methodName).invoke(entity) != null) {
					if (firstFlag) {
						sqlWhere += " where " + fieldName + "='"
								+ cl.getMethod(methodName).invoke(entity) + "'";
						firstFlag = false;
					} else {
						sqlWhere += " and " + fieldName + "='"
								+ cl.getMethod(methodName).invoke(entity) + "'";
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
			
		}

		
		sql = "select " + sqlSelect + " from "
					+ className + sqlWhere;

		System.out.println("the final sql :" + sql);

	}

	public static void main(String[] args) {
		ORMDao dao = new ORMDao();
		NewsClass newsclass = new NewsClass();
		newsclass.setId("1");
		newsclass.setName("国际新闻");
		dao.query(newsclass);

	}

}

 

4. 用这种方法,我们对于单表的查询,不再需要自己写SQL代码,而是用Java对象来对应,自动生成SQL代码,大大减轻了开发的难度和开发量。

 

你可能感兴趣的:(Java咖啡厅)