本文的主要是讲述在SSH2框架下实现对oracle数据库的分页查询,删除,更新,插入的接口。注意:第一部分的代码是不用更改,直接可以添加到你工程使用的,它们是整个框架的基础,注意查看代码后的注释,有助于你的水平提高。第二部分代码则不是,用处不同,而且第二部分我写的也不好,见谅!
一。定义公共类,接口
1.数据库抽象接口类:BaseDaoInterface
package com.commons;import java.util.List;public interface BaseDaoInterface{ void addObject(Object o); void excutesql(String sql); void updateObject(Object o); List getinfo( String sql); List getinfo( String sql,String modelname); List getRows( String sql,int pageSize, int startRow);// List getRows( String sql,int pageSize, int startRow,String modelname);//}
2.数据库接口实现抽象类:BaseDaoInterfaceImple
package com.commons;import java.sql.SQLException;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class BaseDaoInterfaceImple extends HibernateDaoSupport { private static final Log log = LogFactory.getLog(DaoInterfaceimpl.class); //执行添加 public void addObject(Object o) { // TODO Auto-generated method stub this.getHibernateTemplate().save(o); } //执行一句sql,主要用于删除等。 public void excutesql(final String sql) { try { this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws SQLException, HibernateException { try{ Query query = session.createQuery(sql); query.executeUpdate(); session.close(); return null; } catch(Exception e){ session.close(); return null; } } }); } catch (RuntimeException re) { log.error("save failed", re); throw re; } } //执行更新 public void updateObject(Object o) { this.getHibernateTemplate().update(o); // TODO Auto-generated method stub } //执行sql,返回一组数据,主要用于查询 public List getinfo(final String sql) { return getHibernateTemplate().executeFind(new HibernateCallback() {// 回调 public Object doInHibernate(Session session) throws HibernateException, SQLException { try{ Query query = session.createSQLQuery(sql); List list = query.list(); session.close(); return list; } catch(Exception e){ session.close(); return null; } } }); } //执行分段查询,在分页查询中使用 public List getRows(final String sql, int pageSize, int startRow) throws HibernateException { final int pageSize1 = pageSize; final int startRow1 = startRow; return getHibernateTemplate().executeFind(new HibernateCallback() {// 回调 public Object doInHibernate(Session session) throws HibernateException, SQLException { try{ Query query = session.createSQLQuery(sql); query.setFirstResult(startRow1); query.setMaxResults(pageSize1); List list = query.list(); session.close(); return list; } catch(Exception e){ session.close(); return null; } } }); }}
3.实现分页的:1.Pager(此为一个bean,主要包含当前页,每页行数等属性,和点击下页等方法) 2.PagerService(提供对Page的操作及返回一个Page)
3.1:Pager类
package com.commons;public class Pager { private int totalRows; // 总行数 private int pageSize = 10; // 每页显示的行数 private int currentPage; // 当前页号 private int totalPages; // 总页数 private int startRow; // 当前页在数据库中的起始行 public Pager() { } public Pager(int _totalRows) { totalRows = _totalRows; totalPages = totalRows / pageSize; int mod = totalRows % pageSize; if (mod > 0) { totalPages++; } if (0 == totalRows) { currentPage = 0; startRow = 0; } else{ currentPage = 1; startRow = 0; } } public void first() { if (0 == totalPages) { currentPage = 0; startRow = 0; return; } currentPage = 1; startRow = 0; } public void last() { currentPage = totalPages; startRow = (currentPage - 1) * pageSize; } public void previous() { if (currentPage <= 1) { startRow = 0; return; } currentPage--; startRow = (currentPage - 1) * pageSize; } public void next() { if (currentPage >= totalPages) { startRow = (totalPages - 1) * pageSize; return; } currentPage++; startRow = (currentPage - 1) * pageSize; } public void stay() { startRow = (currentPage - 1) * pageSize; } public void refresh(int _currentPage) { currentPage = _currentPage; if (currentPage > totalPages) { last(); } else if (currentPage < 0) { first(); }else if(0 == currentPage && 1 == totalPages){ currentPage = 1; } } public int getStartRow() { return startRow; } public int getTotalPages() { return totalPages; } public int getCurrentPage() { return currentPage; } public int getPageSize() { return pageSize; } public void setTotalRows(int totalRows) { this.totalRows = totalRows; } public void setStartRow(int startRow) { this.startRow = startRow; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalRows() { return totalRows; }}
3.2:PagerService 类
package com.commons;public class PagerService { public Pager getPager(String currentPage,String pagerMethod,int totalRows) { // 定义pager对象,用于传到页面 Pager pager = new Pager(totalRows); // 如果当前页号为空,表示为首次查询该页 // 如果不为空,则刷新pager对象,输入当前页号等信息 if (currentPage != null) { pager.refresh(Integer.parseInt(currentPage)); } // 获取当前执行的方法,首页,前一页,后一页,尾页。 if (pagerMethod != null) { if (pagerMethod.equals("first")) { pager.first(); } else if (pagerMethod.equals("previous")) { pager.previous(); } else if (pagerMethod.equals("next")) { pager.next(); } else if (pagerMethod.equals("last")) { pager.last(); } else if (pagerMethod.equals("stay")) { pager.stay(); } } return pager; }}
4.业务逻辑接口实现抽象类,此类只是在逻辑上划分了一下:BaseServiceInterface
public interface BaseServiceInterface{ void addObject(Object[] o,Object log); void excutesql(String[] sql,Object log); void updateObject(Object[] o,Object log); void addObject(Object o,Object log); void excutesql(String sql,Object log); void updateObject(Object o,Object log); void addObject(Object[] o); void excutesql(String[] sql); void updateObject(Object[] o); List getinfo( String sql); List getinfo( String sql,String modelname); List getRows( String sql,int pageSize, int startRow); List getRows( String sql,int pageSize, int startRow,String modelname);}
二.应用在不同模块的接口和类:
1.CaDaoInterface
package com.CA.dao.inface;import com.commons.BaseDaoInterface;public interface CaDaoInterface extends BaseDaoInterface {}
2.CaDaoImple 重点类:此类实现了上面的接口,上面的接口是继承了数据库抽象接口类,而且继承了数据库接口实现抽象类,这样它就具有了真正操作数据库的方法了,它里面的2个方法是可以不要的,是特殊要求的。你就可以调用上面的实现接口来调用操作方法。实现方法为在apllication中注入到服务接口中,下面会讲。
package com.CA.dao.imple;import java.sql.SQLException;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.springframework.orm.hibernate3.HibernateCallback;import com.CA.dao.inface.CaDaoInterface;import com.commons.BaseDaoInterfaceImple;public class CaDaoImple extends BaseDaoInterfaceImple implements CaDaoInterface { public List getRows(String sql, int pageSize, int startRow, String modelname) { // TODO Auto-generated method stub final String sql1 = sql; final int pageSize1 = pageSize; final int startRow1 = startRow; final String modelname1 = modelname; return getHibernateTemplate().executeFind(new HibernateCallback() {// 回调 public Object doInHibernate(Session session) throws HibernateException, SQLException { SQLQuery query = session.createSQLQuery(sql1); query.setFirstResult(startRow1); query.setMaxResults(pageSize1); List list = null; if (modelname1.equals("TbKeyInfo")) { //System.out.print("NND == NND"); list = query.addEntity(TbKeyInfo.class).list(); } return list; } }); }public List getinfo(String sql, String modelname) { // TODO Auto-generated method stub return null; }}
3.CaServicesInface接口,具体应用业务逻辑接口,继承公共的业务逻辑
package com.CA.service.inface;import com.commons.BaseServiceInterface;public interface CaServicesInface extends BaseServiceInterface {}
4.CaServiceImple类,具体应用业务逻辑实现类,在此会注入一个CaDaoInterface,它是被实现了操作数据库的接口,调用它等于调用的CaDaoImple,CaDaoImple是真正操作数据库的类。
package com.CA.services.imple;import java.util.List;import com.CA.dao.inface.CaDaoInterface;import com.CA.service.inface.CaServicesInface;public class CaServiceImple implements CaServicesInface { private CaDaoInterface caDaoInterface; public CaDaoInterface getCaDaoInterface() { return caDaoInterface; } public void setCaDaoInterface(CaDaoInterface caDaoInterface) { this.caDaoInterface = caDaoInterface; } public void addObject(Object[] o, Object log) { // TODO Auto-generated method stub } public void addObject(Object o, Object log) { // TODO Auto-generated method stub } public void addObject(Object[] o) { // TODO Auto-generated method stub for (int i = 0; i < o.length; i++){ caDaoInterface.addObject(o[i]); } } public void excutesql(String[] sql, Object log) { // TODO Auto-generated method stub } public void excutesql(String sql, Object log) { // TODO Auto-generated method stub } public void excutesql(String[] sql) { // TODO Auto-generated method stub for (int i = 0; i < sql.length; i++){ caDaoInterface.excutesql(sql[i]); } } public List getRows(String sql, int pageSize, int startRow) { // TODO Auto-generated method stub return caDaoInterface.getRows(sql, pageSize, startRow); } public List getRows(String sql, int pageSize, int startRow, String modelname) { // TODO Auto-generated method stub return caDaoInterface.getRows(sql, pageSize, startRow, modelname); } public List getinfo(String sql) { // TODO Auto-generated method stub return caDaoInterface.getinfo(sql); } public List getinfo(String sql, String modelname) { // TODO Auto-generated method stub return null; } public void updateObject(Object[] o, Object log) { // TODO Auto-generated method stub } public void updateObject(Object o, Object log) { // TODO Auto-generated method stub } public void updateObject(Object[] o) { // TODO Auto-generated method stub for (int i = 0; i < o.length; i++){ caDaoInterface.updateObject(o[i]); } }}
5.Action类:此类就是你处理提交数据,返回数据,控制跳转的
你在其中注入private CaServicesInface caServicesInface
就可以使用操作数据库的各个方法了。例子:此为一个实际使用过的,只供举例。
package com.CA.web.action;import java.io.File;import java.io.FileInputStream;import java.io.ObjectInputStream;import java.security.PrivateKey;import java.util.ArrayList;import java.util.Iterator;import java.util.Map;import java.util.ResourceBundle;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import com.opensymphony.xwork2.ActionContext;import com.CA.hibernate.TbKeyInfo;import com.CA.hibernate.TbReadedInfo;import com.CA.hibernate.TbUseruploadInfo;import com.CA.service.inface.CaServicesInface;import com.commons.BaseAction;import com.commons.Pager;import com.commons.PagerService;import com.commons.PublicUtil;public class AcceptAction extends BaseAction { private PagerService pagerService; private CaServicesInface caServicesInface; private Pager pager; protected String currentPage; protected String pagerMethod; protected String totalRows; private String returnResult; private String msg; private String url; private String sqlText; private ArrayList userInfo;// 显示登陆用户所有可接收的密文 private String id;//显示接收哪一个密文 private File[] inputfile1;//上传的私钥 private String encrytesturl; private String encrydeskeyurl; private String signeurl; private String systemdisturl; public String getEncrytesturl() { return encrytesturl; } public void setEncrytesturl(String encrytesturl) { this.encrytesturl = encrytesturl; } public String getEncrydeskeyurl() { return encrydeskeyurl; } public void setEncrydeskeyurl(String encrydeskeyurl) { this.encrydeskeyurl = encrydeskeyurl; } public String getSigneurl() { return signeurl; } public void setSigneurl(String signeurl) { this.signeurl = signeurl; } public String getSystemdisturl() { return systemdisturl; } public void setSystemdisturl(String systemdisturl) { this.systemdisturl = systemdisturl; } public File[] getInputfile1() { return inputfile1; } public void setInputfile1(File[] inputfile1) { this.inputfile1 = inputfile1; } public String getId() { return id; } public void setId(String id) { this.id = id; } public ArrayList getUserInfo() { return userInfo; } public void setUserInfo(ArrayList userInfo) { this.userInfo = userInfo; } public PagerService getPagerService() { return pagerService; } public void setPagerService(PagerService pagerService) { this.pagerService = pagerService; } public CaServicesInface getCaServicesInface() { return caServicesInface; } public void setCaServicesInface(CaServicesInface caServicesInface) { this.caServicesInface = caServicesInface; } public Pager getPager() { return pager; } public void setPager(Pager pager) { this.pager = pager; } public String getCurrentPage() { return currentPage; } public void setCurrentPage(String currentPage) { this.currentPage = currentPage; } public String getPagerMethod() { return pagerMethod; } public void setPagerMethod(String pagerMethod) { this.pagerMethod = pagerMethod; } public String getTotalRows() { return totalRows; } public void setTotalRows(String totalRows) { this.totalRows = totalRows; } public String getReturnResult() { return returnResult; } public void setReturnResult(String returnResult) { this.returnResult = returnResult; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getSqlText() { return sqlText; } public void setSqlText(String sqlText) { this.sqlText = sqlText; } // 查询出当前登陆用户的所有已经保存的文件 public String Showallfile() { Map session = ActionContext.getContext().getSession(); String userid = session.get("userid").toString(); TbUseruploadInfo tbuseruploadinfo = null; if (session.get("userid") != null) { try { sqlText = "select count(ID) FROM tb_userupload_info where RECEIVE_USER_ID='" + userid + "'"+" ORDER BY ID"; int totalRow = Integer.valueOf((((ArrayList) caServicesInface .getinfo(sqlText)).get(0).toString())); pager = pagerService.getPager(this.getCurrentPage(), this .getPagerMethod(), totalRow); this.setCurrentPage(String.valueOf(pager.getCurrentPage())); this.setTotalRows(String.valueOf(totalRow)); sqlText = "select * FROM tb_userupload_info where RECEIVE_USER_ID='" + userid + "'"; userInfo = (ArrayList) caServicesInface.getRows(sqlText, pager .getPageSize(), pager.getStartRow()); Iterator iter = userInfo.iterator(); ArrayList list = new ArrayList(); while (iter.hasNext()) { Object[] row = (Object[]) iter.next(); tbuseruploadinfo = new TbUseruploadInfo(); tbuseruploadinfo.setId(String.valueOf(row[0])); tbuseruploadinfo.setUploadUserId(String.valueOf(row[1])); tbuseruploadinfo.setReceiveUserId(String.valueOf(row[2])); tbuseruploadinfo.setFileOrTest(String.valueOf(row[3])); tbuseruploadinfo.setTitle(String.valueOf(row[4])); tbuseruploadinfo.setUploadTime(String.valueOf(row[5])); tbuseruploadinfo.setDigitalSignatureTest(String .valueOf(row[6])); tbuseruploadinfo.setEncryptTest(String.valueOf(row[7])); tbuseruploadinfo.setEncryptKey(String.valueOf(row[8])); tbuseruploadinfo.setDigitalSignatureTestUrl(String .valueOf(row[9])); tbuseruploadinfo.setEncryptTestUrl(String.valueOf(row[10])); tbuseruploadinfo.setEncryptKeyUrl(String.valueOf(row[11])); list.add(tbuseruploadinfo); } userInfo = list; returnResult = "browseallacceptfile"; } catch (Exception e) { e.printStackTrace(); msg = "AcceptAction!Showallfile" + ResourceBundle.getBundle("resource").getString( "databaseerror"); this.setUrl("AcceptAction!Showallfile.action?currentPage=1&pagerMethod=first"); returnResult = "fail"; } } else { msg = ResourceBundle.getBundle("resource").getString("timeout"); url = ResourceBundle.getBundle("resource").getString("timeouturl"); returnResult = "timeout"; } return returnResult; } //接受文件 public String acceptfile(){ Map session = ActionContext.getContext().getSession(); if (session.get("userid") != null) { try { returnResult = "acceptsuccess"; } catch (Exception e) { e.printStackTrace(); msg = "AcceptAction!acceptfile" + ResourceBundle.getBundle("resource").getString( "databaseerror"); this.setUrl("AcceptAction!Showallfile.action?currentPage=1&pagerMethod=first"); returnResult = "fail"; } } else { msg = ResourceBundle.getBundle("resource").getString("timeout"); url = ResourceBundle.getBundle("resource").getString("timeouturl"); returnResult = "timeout"; } return returnResult; } //验证填写的接收回执 public String uploadmessage(){ Map session = ActionContext.getContext().getSession(); String userid=session.get("userid").toString(); ArrayList userInfo = null; ArrayList UserInfo; Iterator iter; TbKeyInfo tbkeyinfo=new TbKeyInfo(); TbUseruploadInfo tbuseruploadinfo = new TbUseruploadInfo(); PublicUtil p=new PublicUtil(); BASE64Encoder enc = new BASE64Encoder(); BASE64Decoder dec = new BASE64Decoder(); if (session.get("userid") != null) { try { //读取到私钥 ObjectInputStream in=new ObjectInputStream(new FileInputStream(inputfile1[0])); PrivateKey myprikey=(PrivateKey)in.readObject(); byte[] prikey=myprikey.getEncoded(); String prikey1=enc.encodeBuffer(prikey); //查询到私钥 sqlText = "select * from TB_KEY_INFO where ID_NUM='" +userid + "'"; userInfo = (ArrayList) caServicesInface.getinfo(sqlText); iter = userInfo.iterator(); ArrayList list = new ArrayList(); while (iter.hasNext()) { Object[] row1 = (Object[]) iter.next(); tbkeyinfo.setIdNum(String.valueOf(row1[0])); tbkeyinfo.setPublicKey(String.valueOf(row1[1])); tbkeyinfo.setPrivateKey(String.valueOf(row1[2])); list.add(tbkeyinfo); } userInfo = list; String prikey2=tbkeyinfo.getPrivateKey(); //查询到接收文件的地址以供用户下载 sqlText = "select * FROM tb_userupload_info where ID='" + id + "'"; UserInfo = (ArrayList) caServicesInface.getinfo(sqlText); iter = UserInfo.iterator(); while (iter.hasNext()) { Object[] row = (Object[]) iter.next(); tbuseruploadinfo.setId(String.valueOf(row[0])); tbuseruploadinfo.setUploadUserId(String.valueOf(row[1])); tbuseruploadinfo.setReceiveUserId(String.valueOf(row[2])); tbuseruploadinfo.setFileOrTest(String.valueOf(row[3])); tbuseruploadinfo.setTitle(String.valueOf(row[4])); tbuseruploadinfo.setUploadTime(String.valueOf(row[5])); tbuseruploadinfo.setDigitalSignatureTest(String .valueOf(row[6])); tbuseruploadinfo.setEncryptTest(String.valueOf(row[7])); tbuseruploadinfo.setEncryptKey(String.valueOf(row[8])); tbuseruploadinfo.setDigitalSignatureTestUrl(String .valueOf(row[9])); tbuseruploadinfo.setEncryptTestUrl(String.valueOf(row[10])); tbuseruploadinfo.setEncryptKeyUrl(String.valueOf(row[11])); tbuseruploadinfo.setRedeadyReceiveUserId(String.valueOf(row[12])); } //得到各个连接地址 String filePath = ResourceBundle.getBundle("resource").getString( "upload"); systemdisturl=filePath+tbuseruploadinfo.getDigitalSignatureTest(); prikey1=prikey1.replaceAll("\r\n", ""); prikey2=prikey2.replaceAll("\r\n", "");// System.out.println(prikey1);// System.out.println(prikey2);// System.out.println(prikey1.length());// System.out.println(prikey2.length()); if(prikey1.equals(prikey2)){ //填写已读回执,写入数据库 sqlText = "select max(ID)+1 as id FROM tb_readed_info "; // 计算保存信息的最大ID号 String a; try { a = ((ArrayList) caServicesInface .getinfo(sqlText)).get(0).toString(); } catch (Exception e) { a = "1"; } String time=p.getNowtime(); TbReadedInfo t=new TbReadedInfo(); t.setId(a); t.setUploadUserId(tbuseruploadinfo.getUploadUserId()); t.setReceiveUserId(userid); t.setTitle(tbuseruploadinfo.getTitle()); t.setReadedTime(time); t.setIsvalid(id); Object obj[] = {t}; caServicesInface.addObject(obj); returnResult = "accepttrue"; }else{ returnResult = "acceptfalse"; } } catch (Exception e) { e.printStackTrace(); msg = "AcceptAction!uploadmessage" + ResourceBundle.getBundle("resource").getString( "databaseerror"); this.setUrl("AcceptAction!Showallfile.action?currentPage=1&pagerMethod=first"); returnResult = "fail"; } } else { msg = ResourceBundle.getBundle("resource").getString("timeout"); url = ResourceBundle.getBundle("resource").getString("timeouturl"); returnResult = "timeout"; } return returnResult; }}
三。配置application,只显示相关的:
<!-- 定义session工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 依赖注入数据源,注入正是上文定义的dataSource --> <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 定义hibernate的SessionFactor的属性 --> <property name="hibernateProperties"> <props> <!-- 定义使用数据的SQL方言--> <!-- Derby数据库 --> <!-- <prop key="hibernate.dialect"> org.hibernate.dialect.DerbyDialect </prop> --> <!-- Oracle9 i数据库 --> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <!-- 定义显示调试的SQL语句 --> <prop key="hibernate.show_sql ">true</prop> </props> </property> <!-- 定义加载Hibernate持久化对象实体映射文件 --> <property name="mappingResources"> <list> <value></value> </list> </property> </bean> <!-- 定义事务管理器,使适用于Hiberante的事务管理器--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 为事务管理器注入sessionFactory --> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean><!-- 配置业务逻辑 --> <bean id="pagerService" class="com.sunnysky.commons.PagerService"></bean><bean id="caDaoInterface" class="com.sunnysky.CA.dao.imple.CaDaoImple"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="caServicesInface" class="com.sunnysky.CA.services.imple.CaServiceImple"> <property name="caDaoInterface"> <ref bean="caDaoInterface" /> </property> </bean> <bean id="EncryptAction" class="com.sunnysky.CA.web.action.EncryptAction" scope="request"> <property name="caServicesInface"> <ref bean="caServicesInface" /> </property> <property name="pagerService"> <ref bean="pagerService" /> </property> </bean>
相关资源:Struts2连接oracle数据库增删改查实例的实现