hibernate+Struts2实现分页和删除功能和spring注解功能

第一步:先导包(Struts2+spring+hibernate+MySQL)。

第二步:编写web.xml文件。

 

第三步:编写实体类和实体类的映射文件(News.hbm.xml)

  实体类News

 

  News.hbm.xml文件的属性值。

 

 第四步:编写Dao类的接口和实现类。

  NewsDao接口:

  

  NewsDaoImpl实现类:

import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import news.entity.News;

public class NewsDaoImpl implements NewsDao{
    
    @Autowired
    @Qualifier("mysessionFactory")
    private SessionFactory sessionFactory;
    
    //计算数据库中数据的数量
    public int getAllRowCount(String hql) {
        //首先要打开会话。
        Session session = sessionFactory.openSession();
        //打开会话的事务。
        Transaction tc = null;
        //定义一个数据库中的数据的总的数量。
        int allRows = 0;
        
        try {
            tc = session.beginTransaction();
            //调用session中  的方法查询数据库中的所有的数据信息。
            Query query = session.createQuery(hql);
            //把数据库中数据的数量放到allRows中去。
            allRows = query.getResultList().size();
            //事务的提交。
            tc.commit();
        } catch (Exception e) {
            if (tc!=null) {
                //没有查询到数据就回滚。
                tc.rollback();
            }
            System.out.println(e.getMessage());
        }finally {
            if (session!=null) {
                session.close();
                
            }
        }
        
        return allRows;
    }
    
    //使用hibernate提供的分页的功能,得到每页显示多少条数据。
    //hql表示的意思是HQL语句,offset表示的是从第几条数据开始记录,pagesize表示的是每页显示的记录数据。
    public List<News> queryByPage(String hql, int offset, int pageSize) {
        //先打开会话。
        Session session = sessionFactory.openSession();
        //也是打开会话的事务管理。
        Transaction tc = null;
        //把通过条件查询出来的数据存放到list集合里面。
        List<News> list = null;
        try {
            tc = session.beginTransaction();
            //根据条件来进行分页。setFirstResult的意思是从第几条记录开始算起。setMaxResults的意思是每页显示的数据
            Query query = session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize);
            //把通过条件查询出来的数据存放到list集合里面。
            list = query.getResultList();
            //提交事务。
            tc.commit();
        } catch (Exception e) {
            if (tc!=null) {
                tc.rollback();
            }
        }finally {
            if (session!=null) {
                session.close();
                
            }
        }
        
        return list;
    }

    @Override
    public String deleteNews(Integer id) {
        //首先要先打开会话。
        Session session = sessionFactory.openSession();
        //根据条件来进行查询。
        Query query = session.createQuery("from News where id=:myid");
        //把ID传入进去。
        query.setParameter("myid",id);
        //把查询出来的数据存入到list集合里面去。
        List<News> delete = query.getResultList();
        //对数据进行判断,看看是否为一还是为零。
        if(delete.size()==1){
            //如果有数据的话就从集合里面取出来。
            News news = delete.get(0);
            //开启事务。
            Transaction tc = session.beginTransaction();
            //调用session中删除的方法,进行操作。
            session.delete(news);
            //提交事务。
            tc.commit();
            //关闭会话。
            session.close();
            
        }
        
        return "delete";
    }

}

   第五步:编写NewsBean的类。(记录前端显示的数据信息)

 1 import java.util.List;
 2 import news.entity.News;
 3 
 4 public class NewsBean {
 5     //通过hql从数据库分页查询出来的list集合
 6     private List<News> list;
 7     //总记录数
 8     private int allRows;
 9     //总页数
10     private int totalPage;
11     //当前页
12     private int currentPage;
13     
14     public List<News> getList() {
15         return list;
16     }
17     public void setList(List<News> list) {
18         this.list = list;
19     }
20     public int getAllRows() {
21         return allRows;
22     }
23     public void setAllRows(int allRows) {
24         this.allRows = allRows;
25     }
26     public int getTotalPage() {
27         return totalPage;
28     }
29     public void setTotalPage(int totalPage) {
30         this.totalPage = totalPage;
31     }
32     public int getCurrentPage() {
33         return currentPage;
34     }
35     public void setCurrentPage(int currentPage) {
36         this.currentPage = currentPage;
37     } 
38     
39     //定义一个得到总页数的方法。
40     //pageSize:每页记录数。
41     //allRows:总数据的数量的记录。
42     public int getTotalPages(int pageSize,int allRows){
43         //进行计算总页数。
44         int totalPage = (allRows%pageSize==0)?(allRows/pageSize):((allRows/pageSize)+1);
45         //System.out.println(totalPage);
46         return totalPage;
47     }
48     
49     //定义一个获取当前开始记录的方法。
50     public int getCurrentPageoffset(int pageSize,int currentPage){
51         int offset = pageSize*(currentPage-1);
52         return offset;
53     }
54     
55     //得到当前页,如果当前页为0 的时候,则开始第一页,否则为当前页。
56     public int getCurPage(int page){
57         int currentPage = (page==0)?1:page;
58         return currentPage;
59     }
60     
61     
62 }

 

   第六步:编写NewsService接口和NewsServiceImpl实现类。

  NewsService接口

     

  NewsServiceImpl实现类

 1 import java.util.List;
 2 import org.springframework.beans.factory.annotation.Autowired;
 3 import org.springframework.beans.factory.annotation.Qualifier;
 4 import news.bean.NewsBean;
 5 import news.dao.NewsDao;
 6 import news.entity.News;
 7 
 8 public class NewsServiceImpl implements NewsService{
 9     @Autowired
10     @Qualifier("mynd")
11     private NewsDao nd;
12     
13     @Autowired
14     @Qualifier("mynb")
15     private NewsBean nb;
16     
17     //pageSize为每页显示的记录数
18     // page为当前显示的页数
19     public NewsBean getPageBean(int pageSize, int page) {
20         //定义HQL的语句。
21         String hql = "from News";
22         //总记录数。
23         int allRows = nd.getAllRowCount(hql);
24         //总页数。
25         int totalPage = nb.getTotalPages(pageSize, allRows);
26         //当前页。
27         int currentPage = nb.getCurPage(page);
28         //锚点(从第几条数据开始查询)
29         int offset = nb.getCurrentPageoffset(pageSize, currentPage);
30         //把每页显示的数据存放到集合里面去。
31         List<News> list = nd.queryByPage(hql, offset, pageSize);
32         
33         //把查询到集合返回到bean的对象里面去。
34         nb.setList(list);
35         //把总记录数也返回到bean对象里面去。
36         nb.setAllRows(allRows);
37         //把总页数返回到bean对象中去。
38         nb.setTotalPage(totalPage);
39         //把当前页返回到bean对象中去。
40         nb.setCurrentPage(currentPage);
41         
42         return nb;
43     }
44 
45     @Override
46     public String deleteSingleNews(Integer id) {
47         String delete = nd.deleteNews(id);
48         return delete;
49     }
50 
51 }

   第七步:编写NewsAction的类。

 1 import javax.servlet.http.HttpServletRequest;
 2 import org.apache.struts2.ServletActionContext;
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5 import com.opensymphony.xwork2.ActionSupport;
 6 import news.bean.NewsBean;
 7 import news.service.NewsService;
 8 
 9 public class NewsAction extends ActionSupport {
10     
11     @Autowired
12     @Qualifier("myns")
13     private NewsService ns;
14     
15     //定义一个ID,用于页面中删除的作用。
16     private Integer id;
17     
18     public Integer getId() {
19         return id;
20     }
21 
22     public void setId(Integer id) {
23         this.id = id;
24     }
25 
26     //定义获取当前页数。
27     private int page;
28 
29     public int getPage() {
30         return page;
31     }
32 
33     public void setPage(int page) {
34         this.page = page;
35     }
36     
37     public String show(){
38         //表示每页显示的页数,page表示的是当前的页数。
39         NewsBean bean= ns.getPageBean(2, page);
40         
41         HttpServletRequest request = ServletActionContext.getRequest();
42         
43         request.setAttribute("bean",bean);
44         
45         return "success";
46     }
47     
48     //定义删除的方法。
49     public String delete(){
50         //调用删除的方法。
51         String delete = ns.deleteSingleNews(id);
52         return delete;
53     }
54     
55     
56 }

 

   第八步:编写Struts.xml文件的配置信息。

  

 

   第九步:编写applicationContext.xml文件的配置信息。

  数据库连接池的配置:

 1 <bean id="mysessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
 2         <property name="dataSource" ref="myDataSource"></property>
 3         <property name="hibernateProperties">
 4             <props>
 5                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
 6                 <prop key="hibernate.show_sql">true</prop>
 7                 <prop key="hibernate.format_sql">true</prop>
 8                 <prop key="hibernate.connection.autocommit">false</prop>
 9                 <prop key="hibernate.hbm2ddl.auto">update</prop>
10             </props>
11         </property>
12         
13         <property name="mappingResources">
14             <list>
15                 <value>news/entity/News.hbm.xml</value><!--这里是实体类的映射文件 -->
16             </list>
17         </property>    
18     </bean>
19     
20     <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
21         <property name="driverClass" value="${jdbc.driver}" />
22         <property name="jdbcUrl" value="${jdbc.url}" />
23         <property name="user" value="${jdbc.user}" />
24         <property name="password" value="${jdbc.password}" />
25         <!-- 每300秒检查所有连接池中的空闲连接 -->
26         <property name="idleConnectionTestPeriod" value="300"/>
27         <!-- 最大空闲时间,900秒内未使用则连接被丢弃。若为0则永不丢弃 -->
28         <property name="maxIdleTime" value="900"/>
29         <!-- 最大连接数 -->
30         <property name="maxPoolSize" value="2"/>
31 
32     </bean>
33     

   引入的数据库连接池的外部文件的配置信息:

   

 

   第十步:编写index.jsp页面。

  

 

   页面代码:

 1  <h1><font color="blue">分页查询</font></h1><hr>
 2     
 3     <table border="1" align="center" bordercolor="yellow" width="50%">
 4     
 5         <tr>
 6             <th>编号</th>
 7             <th>标题</th>
 8             <th>内容</th>
 9             <th>日期</th>
10             <th>作者</th>
11             <th>操作</th>
12         </tr>
13     
14         <s:iterator value="#request.bean.list" id="news">
15         
16             <tr align="center">
17                 <td><s:property value="#news.id"/></td>
18                 <td><s:property value="#news.title"/></td>
19                 <td><s:property value="#news.content"/></td>
20                 <td><s:date name="#news.begintime" format="yyyy-MM-dd"/></td>
21                 <td><s:property value="#news.username"/></td>
22                 <td><s:a value="NewsAction_delete?id=%{#news.id}" onclick="return confirm('你确定要删除这条记录吗?');">删除</s:a></td>
23             </tr>
24         
25         </s:iterator>
26         
27     </table>
28     <b></b>
29     
30     <center>
31         <font size="5">32             <font color="red">
33                 <s:property value="#request.bean.totalPage"/>
34             </font>35         </font>
36         &nbsp;&nbsp;
37          <font size="5">38              <font color="red">
39                  <s:property value="#request.bean.allRows"/>
40              </font>条记录
41          </font>
42          <br><br>
43         
44         <font size="5">45             <font color="red">
46                 <s:property value="#request.bean.currentPage"/>
47             </font>48         </font>
49         
50         <!--进行判断是否要跳转。  -->
51         <s:if test="#request.bean.currentPage == 1">
52             首页&nbsp;&nbsp;&nbsp;上一页
53         </s:if>
54         <s:else>
55             <a href="NewsAction_show.action">首页</a>&nbsp;&nbsp;&nbsp;
56             <a href="NewsAction_show.action?page=<s:property value='#request.bean.currentPage - 1'/>">上一页</a>
57         </s:else>
58         
59         <s:if test="#request.bean.currentPage!=#request.bean.totalPage">
60             <a href="NewsAction_show.action?page=<s:property value='#request.bean.currentPage + 1'/>">下一页</a>
61             <a href="NewsAction_show.action?page=<s:property value='#request.bean.totalPage'/>">尾页</a>
62         </s:if>
63         
64         <s:else>
65             下一页&nbsp;&nbsp;&nbsp;尾页
66         </s:else>
67         
68     </center>
69     <br>
70     <center>
71         <form action="NewsAction_show" onsubmit="return validate();">
72             <font size="4">跳转至</font>
73             <input type="text" size="2" value='<s:property value="#request.bean.currentPage"/>' name="page">74             <input type="submit" value="跳转">
75         </form>
76     
77     </center>

 

   页面显示的效果:

 

 

 

posted @ 2016-10-18 16:35  黄林彬  阅读(942)  评论(2编辑  收藏  举报