我们在做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代码,大大减轻了开发的难度和开发量。