高分求写两个工具方法(关于J2EE开发中的sql查询)

这两个工具方法用于J2EE的项目开发,一个是从数据库里取出的数据存放在ResultSet中,想自动组装给实体对象;另一个是自动从实体对象中获取属性值,添加到预备语句中。

我是新手,想了很长时间,不知道该怎么写,到这里来求助,希望高手能帮我解决,解决之后我会追加积分的……

processResultset(Object obj,ResultSet rs);
将ResultSet映射的指定的记录自动组装给指定的实体对象

processStatement(Object obj, PreparedStatement ps);
用指定实体对象中的属性值,自动组装preparedStatement,并能正常执行操纵语句
现在正在学习的过程中,不能用hibernate,只用struts。希望有人能帮我写出来……
第二个方法只需要写出insert和update的就行。

现在在学习阶段,做的不是商业项目,不考虑性能的问题,只是利用这两个方法减少编码的工作量。

思想和所需要的技术我大体理解,但是因为是新手,技术不行实在写不出来,所以在这里求方法

这个不能帮你写,真的。。如果你是项目用,建议考虑jpa或者是ibatis,毕竟自己写效率不如框架快。如果你是想真的学到东西,就不能抄代码。。这样没意思。不过可以给你提供下思路。

(1)首先根据你的想法,是想将查出来的记录自动映射成一个实体对象。这需要用到java反射机制。可以参照jpa或者是ibatis的实现方式,做一个xml配置文件。自己写工具解析xml的属性与字段的映射。如果闲麻烦也可以自己强制要求实体类的属性名必须与字段名字相同。步骤如下:
a: 取出记录,获取字段名和字段value。保存(map)。
b:新建对应的实体对象。
c: 根据字段名或者是xml映射的属性名调用反射机制,setter方法赋值。
d:返回对象。
(2)自动组装preparedStatement,我猜你的大概意思是想通过传递来的对象,自己做一个增,删,改的方法吧。这个也是利用反射,判读某个属性是否有值,有点话就添加column。

..............
楼主我已经发消息给你了。。。。看到请回复。。。

哎,,算了。。。刚给你写好了。。。直接给你上代码吧。。。。

数据库mysql:
DROP TABLE IF EXISTS `lauretest`.`person`;
CREATE TABLE `lauretest`.`person` (
`personID` int(10) unsigned NOT NULL auto_increment,
`lastName` varchar(45) NOT NULL,
`firstName` varchar(45) NOT NULL,
PRIMARY KEY USING BTREE (`personID`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=latin1;

代码:
// DBFactory.java
package com.laure.dbtool.dbfactory;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBFactory {
public static Connection getConnection() throws SQLException, java.lang.ClassNotFoundException {
String url = "jdbc:mysql://10.1.127.15:3306/laureTest";
Class.forName("com.mysql.jdbc.Driver");
String userName = "laure";
String password = "123456";
Connection con = DriverManager.getConnection(url, userName, password);
return con;
}

public static void main(String[] args) throws SQLException, ClassNotFoundException{
DBFactory.getConnection();
}
}

// Person.java
package com.laure.dbtool.entity;

public class Person {
private String personId;

private String firstName;

private String lastName;

public String getPersonId() {
return personId;
}

public void setPersonId(String personId) {
this.personId = personId;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

}

// BaseDao.java
package com.laure.dbtool.dao;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.laure.dbtool.dbfactory.DBFactory;
import com.laure.dbtool.util.SQLBuilder;

public class BaseDao<E> {
private SQLBuilder<E> builder = new SQLBuilder<E>();

private Connection con = null;

public void save(E e) {
try {
con = DBFactory.getConnection();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
PreparedStatement stat = con.prepareStatement(builder.insert(e));
stat.execute();
stat.close();
con.close();
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalArgumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvocationTargetException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

public void find(E e, String property, String propertyValue) {

try {
con = DBFactory.getConnection();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

try {
Class entity = Class.forName(e.getClass().getName());
PreparedStatement stat = con.prepareStatement(builder.find(e, property, propertyValue));
ResultSet set = stat.executeQuery();
if (set.next()) {
ResultSetMetaData rsm = set.getMetaData();
int colNum = 0;
colNum = rsm.getColumnCount();
for (int i = 1; i <= colNum; i++) {
String name = rsm.getColumnName(i);
String value = set.getString(name);
String setterName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method method = entity.getMethod(setterName, String.class);

method.invoke(e, (Object[]) new String[]{value});
}
} else {
return;
}
set.close();
stat.close();
con.close();
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalArgumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvocationTargetException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

// PersonDao.java
package com.laure.dbtool.dao;

import com.laure.dbtool.entity.Person;

public class PersonDao extends BaseDao<Person> {
public void save(Person person) {
super.save(person);
}

public void find(Person person) {
super.find(person, "personID", person.getPersonId());
}

public static void main(String[] args) {
PersonDao dao = new PersonDao();
Person person = new Person();
person.setFirstName("llll");
person.setLastName("eee");
person.setPersonId("0");
dao.save(person);
person = new Person();
person.setPersonId("2");
dao.find(person);
System.out.println(person.getFirstName());
}
}

最后sql拼装类:
// SQLBuilder.java
package com.laure.dbtool.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class SQLBuilder<E> {
public String insert(E e)
throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
String table = e.getClass().getSimpleName();
StringBuffer sql = new StringBuffer(16);
sql.append("insert into ");
sql.append(table);
sql.append(" (");
Class entity = Class.forName(e.getClass().getName());
Field[] fields = entity.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
sql.append(fields[i].getName());
if (i < fields.length - 1) {
sql.append(", ");
} else {
sql.append(")");
}
}

sql.append(" values (");
for (int i = 0; i < fields.length; i++) {
String getterName =
"get" + fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1);

if ("String".equals(fields[i].getType().getSimpleName())) {
sql.append("'");
Method getter = entity.getMethod(getterName);
sql.append(getter.invoke(e, (Object[])null));
sql.append("'");
} else {
Method getter = entity.getMethod(getterName);
sql.append(getter.invoke(e, (Object[])null));
}

if (i < fields.length - 1) {
sql.append(", ");
} else {
sql.append(");");
}
}

System.out.println(sql);
return sql.toString();
}

public String find(E e, String property, String value) throws ClassNotFoundException{
String table = e.getClass().getSimpleName();
StringBuffer sql = new StringBuffer(16);

sql.append("select ");
Class entity = Class.forName(e.getClass().getName());
Field[] fields = entity.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
sql.append(fields[i].getName());
if (i < fields.length - 1) {
sql.append(", ");
}
}

sql.append(" from ");
sql.append(table);
sql.append(" where ");
sql.append(property + "=" + value);

System.out.println(sql);
return sql.toString();
}
}

我只做了简单的查询和插入。。。修改的话看着改吧。。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-16
我给两个函数里面均加入了一个变量 count,下面有说明

//obj 是接收对象 rs是数据库查询返回的结果,count是sql查询的字段数量
processResultset(Object obj,ResultSet rs,int count ){
while (rs.next())
{
for (int i=0;i<=count;i++)[

rs.getString(i);
......

//这里看obj对象结构如何,rs中值取出组织下放入对象
}
}

}

// obj 是参数对象,, count 是参数数量
processStatement(Object obj, PreparedStatement ps,int count){

for (int i=0;i<=count;i++){
ps.setString(i, (String) obj.getValue1();
......

}

}

补充,第二个函数里ps.set的时候,肯定是要判断对象类型,然后再处理,如下,我只写了两个类型,现在手头有点忙,没时间写完,回头补充:

for (int i = 0; i < param.size(); i++)
{
if (param.get(i) instanceof String)
{
ps.setString(i + 1, (String) param.get(i));
}
else
{

if (param.get(i) instanceof Integer){
ps.setInt(i + 1, param.get(i));
}
}
}
第2个回答  2009-04-16
processStatement(Object obj, PreparedStatement ps); 没必要把,既然你的obj都已经封装数据了,就别显式的用PreparedStatement了吧。直接学各种ORM框架的方式用save或update(Object obj)就行了,再到函数里面具体用PreparedStatement实现了。

如果你觉得这样可以,我帮你写一个,觉得非要显式的用PreparedStatement参数那我就不写了,也没意思。
第3个回答  2009-04-15
建议你用hibernate
相似回答