BaseAction
public class BaseAction extends ActionSupport { protected String target; public Map getRequest(){ return (Map)ActionContext.getContext().get("request"); } public Map getSession(){ return ActionContext.getContext().getSession(); } public Map getApplication(){ return ActionContext.getContext().getApplication(); } public HttpServletResponse getResponse(){ HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html;charset=utf-8"); return response; }
DaoFactory
public class DaoFactory<T> { private static String fname = "oracle.jdbc.driver.OracleDriver"; private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; private static String user = "scott"; private static String pwd = "tiger"; /** * 加载数据库驱动 */ static{ try { Class.forName(fname); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 创建登陆对象,获取connection * @return */ public Connection getConnection(){ try { return DriverManager.getConnection(url,user,pwd); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 设置preparedStatement对象参数 * @param ps * @param params * @throws SQLException */ public void setParams(PreparedStatement ps,Object[] params) throws SQLException{ if(params == null)return; for(int i = 0; i < params.length; i++){ ps.setObject(i+1, params[i]); } } /** * 查询方法 * @param sql * @param params * @return */ public List<List> query(String sql,Object[] params) { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; ArrayList allData = new ArrayList(); try { con = getConnection(); pstmt = con.prepareStatement(sql); setParams(pstmt,params); rs = pstmt.executeQuery(); int colCount = rs.getMetaData().getColumnCount(); while (rs.next()) { ArrayList rowData = new ArrayList(); for (int i = 1; i <= colCount; i++) { rowData.add(rs.getObject(i)); } allData.add(rowData); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { closeAll(rs,pstmt,con); } return allData; } /** * * @param sql 查询语句,要求句中字段名或别名必须和类中的属性名相同 * @param params sql语句所需的参数数组 * @param clazz 要封装的类的Class对象 * @return 返回封装好的对象,装载在集合中 * @throws Exception * */ public List<T> list(String sql,Object[] params,Class clazz){ List<T> list=new ArrayList<T>(); Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try { con = getConnection(); ps = con.prepareStatement(sql); setParams(ps, params); rs = ps.executeQuery(); ResultSetMetaData md=rs.getMetaData(); int colCount=md.getColumnCount(); String fieldName=""; Field field=null; while(rs.next()){ T obj=(T)clazz.newInstance();//实例化包装实体 for(int i=1;i<=colCount;i++){ fieldName=md.getColumnName(i);//获得数据库字段名 //System.out.println("字段名:====================="+ fieldName+"================" + rs.getString(i)); try { field = clazz.getDeclaredField(fieldName);//获得实体类中和数据库字段名相应的Field对象 field.setAccessible(true);//设置Field的可访问性为true,否则私有属性不能访问 //System.out.println("字段类型:===================" + field.getType().getName()+"================"); field.set(obj, convert(rs.getString(i),field.getType())); //调用Field的set方法给属性赋值 } catch (Exception e) { //如果没有相应的Field对象则不作任何处理 } } list.add(obj); } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally{ closeAll(rs, ps, con); } return list; } /** * 该方法用于返回多对一关系的集合 * @param sql 用于多表联合查询的语句,要求主类对应的字段前缀名必须和类名相同(不区分大小写), * 引用类对应的字段前缀名必须和主类中引用的属性名相同(大小写严格区分) * @param params 查询语句的参数数组 * @param clazzs 返回的封装对象,第一个是List中封装的主对象,其余为该对象的引用属性对象 * @return * @throws Exception */ public List<T> list(String sql,Object[] params,Class...clazzs){ List<T> list=new ArrayList<T>(); Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try { con = getConnection(); ps = con.prepareStatement(sql); setParams(ps, params); rs = ps.executeQuery(); ResultSetMetaData md=rs.getMetaData(); int colCount=md.getColumnCount(); System.out.println(colCount); String fieldName="";//sql中的字段名或别名 Field field=null; //要包装的类中的属性对象 String prefixName="";//数据库字段的前缀名(映射类名) Map<String,Object> refMap=new HashMap<String,Object>();//用来存放主类中引用类对象的属性名和对象 String key="";//用来标记refMap中的键 while(rs.next()){ List<T> claObjList=new ArrayList<T>(); for(Class cla:clazzs){//将要封装的实体类型实例化放入到List中,以便将rs中的值赋值给实例的属性 claObjList.add((T) cla.newInstance()); } for(int j=0;j<clazzs.length;j++){ for(int i=1;i<=colCount;i++){ fieldName=md.getColumnName(i); prefixName=fieldName.split("\\.")[0];//获得结果集中字段的前缀名 fieldName=fieldName.split("\\.")[1];//获得结果集中字段的名称 //System.out.println(clazzs[j].getSimpleName()+"==="+prefixName+"==="+fieldName+"---"); if(clazzs[j].getSimpleName().toLowerCase().equals(prefixName.toLowerCase())){ try { //System.out.println(clazzs[j].getSimpleName()); field=clazzs[j].getDeclaredField(fieldName);//获得当前类中所有的字段对象 field.setAccessible(true);//设置Field的可访问性为true,否则私有属性不能访问 field.set(claObjList.get(j), convert(rs.getString(i),field.getType())); //给参数数组对映的实例化对象的属性赋值 if(j>0) refMap.put(prefixName, claObjList.get(j)); //如果是第二个以后的对象,则放入到引用对象的Map中 } catch (Exception e) { e.printStackTrace(); } } } } Set<String> keySet=refMap.keySet(); Iterator<String> it=keySet.iterator(); while(it.hasNext()){ key=it.next(); try { field=clazzs[0].getDeclaredField(key);//获得主类中外键对象的引用字段对象 field.setAccessible(true);//设置该字段可访问 field.set(claObjList.get(0), refMap.get(key));//将Map集合中该键对应的值赋值给该字段 } catch (Exception e) { } } list.add(claObjList.get(0)); } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ closeAll(rs, ps, con); } return list; } /** * 将传入的字符串参数转化成制定的数据类型,如果格式不匹配则返回null * * @param <T> * @param param * 要转换的参数字符串 * @param clas * 转换的目标CLASS * @return */ private <T extends Serializable> T convert(String param, Class clas) { if (param == null || param == "" || clas == null) return null; String type = clas.getName();// 获得要转换的数据类型名称 //System.out.println(type); if (type.equals("java.lang.String")) { //System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); return (T) param; } try {// 根据不同类型的属性,返回不同的结果,如果出现异常,则返回null if (type.equals("java.util.Date")) { return (T) new java.util.Date(java.sql.Timestamp.valueOf(param) .getTime()); } if (type.equals("java.sql.Date")) { return (T) new java.sql.Date(java.sql.Timestamp.valueOf(param).getTime()); } if (type.equals("java.sql.Timestamp")) { return (T) java.sql.Timestamp.valueOf(param); } if (type.equals("java.lang.Char")) { return (T) Character.valueOf(param.charAt(0)); } if (type.equals("java.lang.Integer") || type.equals("int")) { return (T) Integer.valueOf(param); } if (type.equals("java.lang.Double") || type.equals("double")) { return (T) Double.valueOf(param); } if (type.equals("java.lang.Float") || type.equals("float")) { return (T) Float.valueOf(param); } if (type.equals("java.lang.Byte") || type.equals("byte")) { return (T) Byte.valueOf(param); } if (type.equals("java.lang.Short") || type.equals("short")) { return (T) Short.valueOf(param); } if (type.equals("java.lang.Long") || type.equals("long")) { return (T) Long.valueOf(param); } if (type.equals("java.lang.Boolean") || type.equals("boolean")) { return (T) Boolean.valueOf(param); } } catch (Exception e) { //e.printStackTrace(); } return null; } /** * 将sql语句中传入的地段名称转换为相应的set方法名 * @param fieldName 传入的sql语句的字段名称 * @return 返回set方法名称 */ private String findSetMethodName(String fieldName) { Character firstChar = fieldName.charAt(0); firstChar = Character.toUpperCase(firstChar); String methodName = "set"+firstChar + fieldName.substring(1);// 将首字母小写 return methodName; } public boolean updateTrans(String[] sql,List<Object[]> listParam) { Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); con.setAutoCommit(false); for(int i=0;i<sql.length;i++){ pstmt = con.prepareStatement(sql[i]); setParams(pstmt,listParam.get(i)); pstmt.executeUpdate(); } con.commit(); return true; } catch (Exception e) { e.printStackTrace(); try { con.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } finally { closeAll(null,pstmt,con); } return false; } public int update(String sql,Object[] params) { Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); setParams(pstmt,params); return pstmt.executeUpdate(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { closeAll(null,pstmt,con); } return -1; } public int update(String sql,Object[] params,Connection con) { PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); setParams(pstmt,params); return pstmt.executeUpdate(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { closeAll(null,pstmt,null); } return -1; } /** * 修改数据库信息的通用方法 * @param sql * 一个sql语句 * @param params * 参数数组 * @return * 修改每条信息的主键,为int类型 */ public int getKey(String sql,Object[] params) { int id=0; Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn =getConnection(); ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); setParams(ps, params); ps.executeUpdate(); rs = ps.getGeneratedKeys(); while(rs.next()) id=rs.getInt(1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ closeAll(rs,ps,conn); } return id; } /** * 修改数据库信息的通用方法 * @param sql * 一个sql语句 * @param params * 参数数组 * @param con * 一个Connection对象 * @return * 修改每条信息的主键,为int类型 */ public int getKey(String sql,Object[] params,Connection con) { int id=0; PreparedStatement ps=null; ResultSet rs=null; try { con = getConnection(); ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); setParams(ps, params); ps.executeUpdate(); rs = ps.getGeneratedKeys(); while(rs.next()){ id=rs.getInt(1); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ closeAll(rs,ps,null); } return id; } /** * 关闭连接对象 * @param rs * @param ps * @param con */ public void closeAll(ResultSet rs, Statement ps, Connection con) { // TODO Auto-generated method stub try { if(rs != null){ rs.close(); rs = null; } if(ps != null){ ps.close(); ps = null; } if(con != null){ con.close(); con = null; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 测试显示数据 * @param args */ public static void main(String[] args){ DaoFactory dao = new DaoFactory(); List li = dao.query("select * from rights", null); System.out.println(li); } }