论坛首页 Java企业应用论坛

瞎改的东西

浏览 1512 次
锁定老帖子 主题:瞎改的东西
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-06   最后修改:2009-08-22

用Hibernate 的感觉 搞来搞去的东西太多了。

用Ibatis 的感觉 和Hibernate 差不多。

 

他们两个用的文件甚多...弄来弄去。太麻烦了,无聊时间写了个

支持多种形式操作的 JDBC 操作数据库的持久方法 

 

mport java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.xzj.common.DataBaseUtil;

/**
 * Support Map  String[] Object
 * 
 * 参数必须是#name#形式
 * 
 * 删除不支持多个相同的 ID 删除 如果要用只能用 String[] 形式传参
 * 
 * @author Administrator
 *
 */
public class JdbcAction implements Jdbc {
	private Connection con;
	private PreparedStatement ptmst;
	private ResultSet rs;
	
	public JdbcAction(){
		con=DBConnection.getConnection();
	}
	
	/**
	 * 直接执行 add,update,delete Method
	 * 
	 * @param sql
	 * @return Integer
	 */
	public int executeSQL(String sql){
		int rows=0;
		try {
			ptmst=con.prepareStatement(sql);
			rows=ptmst.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DataBaseUtil.close(con, ptmst);
		}
		return rows;
	}
	
	/**
	 * 带参数的处理的 add,update,delete Method
	 * @param sql
	 * @param obj
	 * @return Integer
	 */
	public int executeSQL(String sql,Object obj){
		int rows=0;
		try {
			con.setAutoCommit(false);
			rows=executeSql(sql,obj).executeUpdate();
			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
			DataBaseUtil.close(con, ptmst);
		}
		return rows;
	}
	
	public Object selectObjResult(String sql,Object param,Object obj){
		List<Object> list=selectResult(sql,param,obj);
		return  list.size()==0?null:list.get(0);
	}
	
	public List<Object> selectResult(String sql,Object param,Object obj){
		List<Object> list=new ArrayList<Object>();
		try {
			rs=executeSql(sql,obj).executeQuery();
			/**
			 * explain:
			 * get select result column name
			 */
			ResultSetMetaData rsmd=rs.getMetaData();
			int columnCount=rsmd.getColumnCount();
			String [] column=new String[columnCount];
			for(int k=1;k<=columnCount;k++){
				column[k-1]=rsmd.getColumnName(k);
			}
			/**
			 * get select data 
			 * 
			 */
			Object objSelect=null;
			while(rs.next()){
				try {
					objSelect=obj.getClass().newInstance();
				} catch (InstantiationException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				list.add(instantiationObjectData(objSelect,rs,column));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DataBaseUtil.close(con, ptmst, rs);
		}
		
		return list;
	}
	
		
	private Object getObjectValue(String columName,Object obj){
		String methodName="";
		Object rs=null;
		try {
			for(int k=0;k<obj.getClass().getDeclaredMethods().length;k++){
				methodName=obj.getClass().getDeclaredMethods()[k].getName();
				if(methodName.substring(0, 3).equals("get")&&methodName.substring(3, methodName.length()).toLowerCase().equals(columName.toLowerCase())){
					rs=(Object) obj.getClass().getDeclaredMethods()[k].invoke(obj,new Object[]{});
					break;
				}
			}
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch(Exception e){
			e.printStackTrace();
		}
		methodName=null;
		return rs;
	}
	
	private static Object instantiationObjectData(Object obj,ResultSet rs,String [] column){
		String methodName="";
		for(int k=0;k<obj.getClass().getDeclaredMethods().length;k++){
			methodName=obj.getClass().getDeclaredMethods()[k].getName();
			try {
				if(methodName.substring(0, 3).equals("set")){
					for(int n=0;n<column.length;n++){
						if(column[n].toLowerCase().equals(methodName.substring(3, methodName.length()).toLowerCase())){
							obj.getClass().getDeclaredMethods()[k].invoke(obj,rs.getObject(column[n]));
							break;
						}
					}
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch(Exception e){
				e.printStackTrace();
			}
		}
		methodName=null;
		return obj;
	}
	
	private PreparedStatement executeSql(String sql,Object obj){
		//获得参数
		String [] setParam=param(sql);
		for(int k=0;k<setParam.length;k++){
			sql=sql.replace("#"+setParam[k]+"#", "?");
		}
		try{
			ptmst=con.prepareStatement(sql);
			if(null!=obj){
				if(obj instanceof String[]){
					String [] paramArray=(String []) obj;
					for(int k=0;k<setParam.length;k++){
						ptmst.setObject(k+1,paramArray[k]);
					}
				}else if(obj instanceof int []){
					int [] paramArray=(int []) obj;
					for(int k=0;k<paramArray.length;k++){
						ptmst.setObject(k+1,paramArray[k]);
					}
				}else if(obj instanceof Map){
					Map map=(Map)obj;
					for(int k=0;k<setParam.length;k++){
						ptmst.setObject(k+1, map.get(setParam[k]));
					}
				}else {
					for(int k=0;k<setParam.length;k++){
						ptmst.setObject(k+1, getObjectValue(setParam[k],obj));
					}
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		return ptmst;
	}
	
	private String [] param(String sql){
		String [] sqlSet=sql.trim().split("#");
		String [] setParam=new String[sqlSet.length/2];
		for(int k=0;k<setParam.length;k++){
			setParam[k]=sqlSet[(k+1)*2-1];
		}
		return setParam;
	}
}

  

那个数据库连接没写上去。。

 不知道效率怎么样。没测试过。。里面还有好多需要优化。代码有些还不是很规范。。

 

 

下面是我用到的一些基本测试。

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.xzj.domain.Student;

public class JdbcTest {
	
	public static void testSave(){
		Jdbc jdbc=JdbcUtil.JdbcAction();
		Map map=new HashMap();
		map.put("name", "周星驰");
		map.put("sex", "女");
		map.put("age", new Date());
		Student stu=new Student();
		stu.setName("冰山");
		stu.setSex("女");
		stu.setAge(new Date());
		String sql="insert into Student(name,sex,age) values(#name#,#sex#,#age#)";
		jdbc.executeSQL(sql, map);
	}
	
	public static void testUpdate(){
		Jdbc jdbc=JdbcUtil.JdbcAction();
		Map map=new HashMap();
		map.put("id", 2);
		map.put("name", "周星驰");
		map.put("sex", "男");
		map.put("age", new Date());
		String sql="update student set name=#name#,sex=#sex#,age=#age# where id=#id#";
		jdbc.executeSQL(sql, map);
	}
	
	public static void testDelete(){
		Jdbc jdbc=JdbcUtil.JdbcAction();
		String [] sql={
					"delete from Student where id=#id#",
					"delete from Student where id=#id# or id=#id#",
					"delete from Student where id=#id# or id=#id#  or id=#id#"};
		int []p={21,22,23};
		jdbc.executeSQL(sql[2], p);
	}
	
	public static void testSelect(){
		Jdbc jdbc=JdbcUtil.JdbcAction();
		Student stu=new Student();
		stu.setId(1001);
		stu.setName("测试");
		stu.setSex("女");
		stu.setAge(new Date());
		List<Object> list=jdbc.selectResult("select id,name,sex,age from Student",null,stu);
		System.out.println("编号\t姓名\t性别\t年龄");
		System.out.println("---------------------------------");
		for(int k=0;k<list.size();k++){
			stu=(Student) list.get(k);
			System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getSex()+"\t"+stu.getAge());
		}
	}
		
	public static void main(String [] args){
		//testSave();
		//testUpdate();
		//testDelete();
		testSelect();
		
	}
}

 

  

import java.util.Date;

public class Student {
	private Integer id;
	private String  name;
	private String  sex;
	private Date    age;
	private String  born;
	
	public String getBorn() {
		return born;
	}
	public void setBorn(String born) {
		this.born = born;
	}
	public Date getAge() {
		return age;
	}
	public void setAge(Date age) {
		this.age = age;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

 

 

 

希望各位能给出指点。。修改一些不必之处。。

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics