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 中常用的代码的更多相关文章

  1. NC65在日常开发中常用的代码写法

    标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...

  2. VS中常用C#代码段快速输入总结

    转自:https://blog.csdn.net/a980433875/article/details/12231673 Visual Studio 中有很多代码段都可以直接简写然后按TAB快速输入编 ...

  3. struts2中常用配置

    1.Post提交乱码问题,如果编码采用的是utf-8,那么默认不需要自己处理,因为其默认的常量配置文件就是处理UTF-8的 这个常量值只处理POST提交,get如果乱码还得自己写拦截器处理,一般只要页 ...

  4. struts2中常用constant命令配置

    struts.objectFactory这个属性用 于说明Struts2的 对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Sp ...

  5. SEO中常用HTML代码大全,及权重排序

    做SEO必须要懂HTML,说的是一点都没错,不过其实是不需要全部都懂,最重点的你懂了会用,基本上都是事半功倍了.可以这么说一个不懂代码的优化人员不算是一个合格的好优化.下面就总结一下做优化,必须要懂得 ...

  6. JavaScript开发中常用的代码规范配置文件

    一.jsconfig.json { compilerOptions: { target: 'es6', experimentalDecorators: true, allowSyntheticDefa ...

  7. ADF backing Bean中常用的代码

    // 刷新iterator bindings.refreshControl(); iterBind.executeQuery(); iterBind.refresh(DCIteratorBinding ...

  8. WebApp 开发中常用的代码片段

    其实这里面的多数都是 iOS 上面的代码.其他平台的就没有去验证了. HTML, 从HTML文档的开始到结束排列: <meta name=”viewport” content=”width=de ...

  9. MYSQL列表中常用语句代码块

    查看数据表是否存在:SHOW TABLES; 显示已经打开的数据库:SELECT DATABASE(); 查看数据表结构:SHOW COLUMNS FROM ***(数据表名): 插入数据:INSER ...

随机推荐

  1. 201621123075 week5 继承、多态、抽象类和接口

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口.abstract.implements.comparable 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一 ...

  2. 关于WebUpload插件的使用

    上传的路径地址: 删除图片时也应该注意: unlink('/Upload/1.jpg')删除不了 unlink('./Upload/1.jpg')可以删除. 也就是说,绝对路径删除不了  相对路径可以 ...

  3. LeetCode Rotatelmage

    ---恢复内容开始--- You are given an n x n 2D matrix representing an image. Ratate the image by 90 degrees( ...

  4. NAT资料

    第1章 NAT 1.1 NAT概述 1990年代中期,NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的.网络地址转换在很多国家都有很广泛的使用.所以NAT就成了家庭和小型办 ...

  5. 关于空指针NULL、野指针、通用指针 (转)

    reference:https://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白 ...

  6. Python简介(一)

    1.Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  7. Centos7部署kubernetes测试k8s应用(九)

    1.创建一个deployment [root@linux-node1 ~]# kubectl run net-test --image=alpine --replicas=2 sleep 360000 ...

  8. [Version Control]—— Git如何使用

    Git是什么? Git是目前世界上最先进的分布式版本控制系统. 它没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上.既然每个人的电脑都有一 ...

  9. L333 Should You Listen to Music While You Work?

    Should You Listen to Music While You Work? "Whistle while you work" is classic advice, str ...

  10. JAVA8之函数式接口

    由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...