您的位置:首页 > 编程语言 > Java开发

Mysql通用查询操作类(Jsp+servlet+javaBean+Mysql)

2010-01-16 09:15 651 查看
在腾科培训了有1个半月了,终于学完JSP+SERVLET+JAVABEAN+MYSQL,学了java的第一套web解决方案。老师要求我们6人一组开始做一个订餐系统。这个系统没有什么特别的,就跟电子商城是一个样的。由于要对数据库做大量的增删改查,那个代码又多,我想能不能将数据库操作的这一层打包起来(SqlOperDao),让我对数据库操作,用几行代码就搞定的。然后我只修改sql语句,和传进来的参数就可以了。

增删改属于一类操作,都是不返回结果集的,而查找是要返回结果集的

1)先说增删改的操作

public int buildConn(String sql)throws Exception{
Connection conn=null;
Statement stmt=null;
int result=0;
boolean flag;
try{
conn=sqlconn.conn();
stmt=conn.createStatement();
result=stmt.executeUpdate(sql);
System.out.println("恭喜你执行成功"+result+"条记录!");
flag=true;
}catch(Exception e){
System.out.println("抱歉!执行失败!"+e.getMessage());
flag=false;
}finally{

stmt.close();
conn.close();
}
return result;
}

2)而对于查询操作的就比较麻烦一点,通常我们都将查询的结果集打包到一个javabean组合中,例如我有一个登陆的javabean里面只有name和password,对应的表中user_list的两列name,password.现在要将user_list中的所有数据读出来,读出一条,就放到一个javabean中,多条数据就放到List<javabean>中。首先我们可以讲数据库中的所有数据都用读取字符串的形式getString的方法读出来,当然如果数据库中表的列的属性不是varchar类型,就不可以用此类方法。

本通用查询只针对都是String类型的表。

/**
* 通用查询,传入要查询的sql语句
* 返回一个List<String[]>
*/
public List<String[]> query(String sql) throws Exception{
this.queryList=new ArrayList<String[]>();
Statement stmt = null;
ResultSet rs = null;
Connection conn=null;
conn=this.sqlconn.conn();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
//2、取得表体信息,要对表体进行判断是否存在,如果不存在则退出
while(true){
if(false == rs.next()){
break;
}
String dataList[] = new String[columnCount];
for(int body = 1; body <= columnCount; body ++){
String columnValue = rs.getString(body);
dataList[body - 1] = columnValue;
}
this.queryList.add(dataList);
}
rs.close();
stmt.close();
conn.close();
return queryList;
}

这个方法是将表中的内容读取出来,然后存放到一个List<String[]>中,但这样有个坏处,就是读出来的数据还没有打包成javabean,要自己打包,很是繁琐。所以在这个方法的基础上,我再写了一个将List<String[]>打包成javabean的方法。在这里要注意一点,就是,这个数据库通用操作类必须是一个泛型,class SqlOperDao<T>,要不然,Object类型是无法转化为你想要的javabean类型

/**
* 传入一个javabean,sql查询语句
* 查询返回的结果集,放到一个集合中List<javaBean>
* 这是一个赋值的操作,只对String类型进行复制,如果javabean中的set方法不是传String类型的
* 可以改写为
* public void setAttribute(String str){
* this.attribute=Integer.parseInt(str);
* }
* T可以传入一个JavaBean
*/
public List<Object> query(Object t,String sql)throws Exception{
List<Object> resultlist=new ArrayList<Object>();
Class cl=t.getClass();
Class mycl=Class.forName(cl.getName());
Field[] fields=mycl.getDeclaredFields();
List<String[]> querylist=this.query(sql);
for(String[] results:queryList){
Object instance=mycl.newInstance();
int i=0;
for(Field field:fields){

//采用java反射机制,获取javabean中set方法的方法名称,由于set方法都是由set+属性名称(String)构成的,所以用拼凑字符串
String setMethod="set"+String.valueOf(field.getName().charAt(0)).toUpperCase()+""+field.getName().substring(1);
Method set=mycl.getMethod(setMethod,String.class);
set.invoke(instance,results[i]);
i++;
}
resultlist.add(instance);
}
return resultlist;
}

在此通用数据查询就完成了,再来,看下如何使用?

javabean: class UserList{ private String name;

private String password; //get和set方法由myeclipse自动生成}

Dao层:要读取数据库中user_list中的所有数据

public static void main(String[] args0) throws Exception{

SqlOperDao sod=new SqlOperDao();
UserList t=new UserList();
String sql="SELECT * FROM user_list";
List<UserList> list=sod.query(t, sql);
for(Eatery e:list){
System.out.println(e.getEateryName());
}

//这样三句话就可以写完一个数据库的查询操作了,这样我们写出来的Dao层要比其他人的代码要少70%

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: