我们在做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<String> cols = new ArrayList<String>(); 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代码,大大减轻了开发的难度和开发量。