Struts2 中常用的代码
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);
	}
}
Struts2 中常用的代码的更多相关文章
- NC65在日常开发中常用的代码写法
		
标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...
 - VS中常用C#代码段快速输入总结
		
转自:https://blog.csdn.net/a980433875/article/details/12231673 Visual Studio 中有很多代码段都可以直接简写然后按TAB快速输入编 ...
 - struts2中常用配置
		
1.Post提交乱码问题,如果编码采用的是utf-8,那么默认不需要自己处理,因为其默认的常量配置文件就是处理UTF-8的 这个常量值只处理POST提交,get如果乱码还得自己写拦截器处理,一般只要页 ...
 - struts2中常用constant命令配置
		
struts.objectFactory这个属性用 于说明Struts2的 对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Sp ...
 - SEO中常用HTML代码大全,及权重排序
		
做SEO必须要懂HTML,说的是一点都没错,不过其实是不需要全部都懂,最重点的你懂了会用,基本上都是事半功倍了.可以这么说一个不懂代码的优化人员不算是一个合格的好优化.下面就总结一下做优化,必须要懂得 ...
 - JavaScript开发中常用的代码规范配置文件
		
一.jsconfig.json { compilerOptions: { target: 'es6', experimentalDecorators: true, allowSyntheticDefa ...
 - ADF backing Bean中常用的代码
		
// 刷新iterator bindings.refreshControl(); iterBind.executeQuery(); iterBind.refresh(DCIteratorBinding ...
 - WebApp 开发中常用的代码片段
		
其实这里面的多数都是 iOS 上面的代码.其他平台的就没有去验证了. HTML, 从HTML文档的开始到结束排列: <meta name=”viewport” content=”width=de ...
 - MYSQL列表中常用语句代码块
		
查看数据表是否存在:SHOW TABLES; 显示已经打开的数据库:SELECT DATABASE(); 查看数据表结构:SHOW COLUMNS FROM ***(数据表名): 插入数据:INSER ...
 
随机推荐
- python之路--迭代器和生成器
			
迭代: 迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
 - VSTO:使用C#开发Excel、Word【11】
			
编程用户定义的功能Excel可以创建可在Excel公式中使用的用户定义的函数. 开发人员必须创建一种称为XLL的特殊类型的DLL. Excel还允许您在VBA中编写可在Excel公式中使用的自定义函数 ...
 - VBA消息框
			
MsgBox函数显示一个消息框,并等待用户点击一个按钮,然后根据用户点击该按钮的动作执行. 语法 MsgBox(prompt[,buttons][,title][,helpfile,context]) ...
 - 剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)
			
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目地址 https://www.nowcoder.com/practic ...
 - CoAP、MQTT、RESTful协议区别
			
/********************************************************************** * CoAP.MQTT.RESTful协议区别 * 说明 ...
 - 类Shiro权限校验框架的设计和实现
			
前言: 之前简单集成了springmvc和shiro用于后台管理平台的权限控制, 设计思路非常的优美, 而且编程确实非常的方便和简洁. 唯一的不足, 我觉得配置稍有些繁琐. 当时我有个小想法, 觉得可 ...
 - ubuntu下安装mysql和配置远程访问
			
ubuntu下安装mysql和配置远程访问 下载安装mysql sudo apt-get install mysql-client mysql-server 安装的时候会提示要设置root密码,如 ...
 - confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法
			
https://www.cnblogs.com/heyongboke/p/9806396.html 1.confluence中报错信息如下: 严重 [http-nio-18090-Acceptor-0 ...
 - PythonStudy——字符编码  Character Encoding
			
测试一下学习字符编码的问题:解决乱码问题 数据 从 硬盘 => 内存 => cpu应用程序打开文本文件的三步骤1.打开应用程序2.将数据加载到内存中3.cpu将内存中的数据直接翻译成字符显 ...
 - python_字符编码&格式化
			
电脑最小储存单位是bit(位),8bit为一个Byte(字节), 8bit=1Byte 1024Byte=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB 编码的故事: 计算机 ...