SSH开发个人博客(二)

上一阶段将struts映射完成,这一阶段目标是实现hibernate对blog数据库的封装,并将数据传回前端页面。
首先建立数据库,创建article表

CREATE TABLE `article` (
`a_id`  int(11) NOT NULL AUTO_INCREMENT ,
`a_title`  varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`a_body`  longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`a_created_time`  datetime NOT NULL ,
`a_last_modified_time`  datetime NOT NULL ,
`a_status`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'p' ,
`a_abstract`  varchar(54) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' ,
`a_views`  int(10) UNSIGNED NOT NULL DEFAULT 1 ,
`a_likes`  int(10) UNSIGNED NOT NULL DEFAULT 1 ,
`a_topped`  tinyint(1) NOT NULL DEFAULT 1 ,
`a_category_id`  int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`a_id`),
)

在web工程目录下建立bean包,创建ArticleBean.java,对应article表建立属性以及getter、setter方法。

package bean;

import java.util.Date;

public class Article {
    private Integer a_id;
    private String a_title;
    private String a_body;
    private Date a_create_time;
    private Date a_last_modified_time;
    private String a_status;
    private Integer a_abstract;
    private Integer a_views;
    private Integer a_likes;
    private Integer a_topped;
    private Integer a_category_id;
    
    public Integer getA_id() {
        return a_id;
    }
    public void setA_id(Integer a_id) {
        this.a_id = a_id;
    }
    public String getA_title() {
        return a_title;
    }
    public void setA_title(String a_title) {
        this.a_title = a_title;
    }
    public String getA_body() {
        return a_body;
    }
    public void setA_body(String a_body) {
        this.a_body = a_body;
    }
    public Date getA_create_time() {
        return a_create_time;
    }
    public void setA_create_time(Date a_create_time) {
        this.a_create_time = a_create_time;
    }
    public Date getA_last_modified_time() {
        return a_last_modified_time;
    }
    public void setA_last_modified_time(Date a_last_modified_time) {
        this.a_last_modified_time = a_last_modified_time;
    }
    public String getA_status() {
        return a_status;
    }
    public void setA_status(String a_status) {
        this.a_status = a_status;
    }
    public Integer getA_abstract() {
        return a_abstract;
    }
    public void setA_abstract(Integer a_abstract) {
        this.a_abstract = a_abstract;
    }
    public Integer getA_views() {
        return a_views;
    }
    public void setA_views(Integer a_views) {
        this.a_views = a_views;
    }
    public Integer getA_likes() {
        return a_likes;
    }
    public void setA_likes(Integer a_likes) {
        this.a_likes = a_likes;
    }
    public Integer getA_topped() {
        return a_topped;
    }
    public void setA_topped(Integer a_topped) {
        this.a_topped = a_topped;
    }
    public Integer getA_category_id() {
        return a_category_id;
    }
    public void setA_category_id(Integer a_category_id) {
        this.a_category_id = a_category_id;
    }
}

ArticleBean.java对应的ArticleBean.hbm.xml配置文件如下

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-2-25 15:16:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="bean.Article" table="ARTICLE">
        <id name="a_id" type="java.lang.Integer">
            <column name="A_ID" />
            <generator class="native" />
        </id>
        <property name="a_title" type="java.lang.String">
            <column name="A_TITLE"/>
        </property>
        <property name="a_body" type="java.lang.String">
            <column name="A_BODY" length="16777216"/>
        </property>
        <property name="a_create_time" type="java.util.Date">
            <column name="A_CREATE_TIME" />
        </property>
        <property name="a_last_modified_time" type="java.util.Date">
            <column name="A_LAST_MODIFIED_TIME" />
        </property>
        <property name="a_status" type="java.lang.String">
            <column name="A_STATUS" />
        </property>
        <property name="a_abstract" type="java.lang.Integer">
            <column name="A_ABSTRACT" not-null="false"/>
        </property>
        <property name="a_views" type="java.lang.Integer">
            <column name="A_VIEWS" />
        </property>
        <property name="a_likes" type="java.lang.Integer">
            <column name="A_LIKES" />
        </property>
        <property name="a_topped" type="java.lang.Integer">
            <column name="A_TOPPED" />
        </property>
        <property name="a_category_id" type="java.lang.Integer">
            <column name="A_CATEGORY_ID" not-null="false"/>
        </property>
    </class>
</hibernate-mapping>

web工程的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/blog</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <mapping resource="bean/Article.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

其中show_sql是显示sql语句;format_sql是格式化输出sql语句,输出的sql语句就不会是一行,便于查看;hbm2ddl.auto有几个参数:

create:表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新

接下来封装一个HibernateSessionFacory,这样做的好处是便于控制session,将操作代码统一封装,减少重复代码

package myUtil;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {
    
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static Configuration configuration = new Configuration();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;
    
    static {
        try{
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        }catch(Exception e){
            System.err.println("%%% Error Creating SessionFactory %%%");
            e.printStackTrace();
        }
    }
    
    private HibernateSessionFactory(){      
    }
    
    //@return Session
    //@throws HibernateExcception 
    public static Session getSession() throws HibernateException{
        Session session = (Session) threadLocal.get();
        if(session == null || session.isOpen()){
            if(sessionFactory == null){
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession():null;
            threadLocal.set(session);
        }       
        return session;     
    }

    private static void rebuildSessionFactory() {
        try{
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        }catch(Exception e){
            System.err.println("%%% Error Creating SessionFactory %%%");
            e.printStackTrace();
        }       
    }
    
    public static void closeSession() throws HibernateException{
        Session session = (Session)threadLocal.get();
        threadLocal.set(null);
        if(session != null){
            session.close();
        }
    }
    
    public static org.hibernate.SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    
    public static void setConfigFile(String configFile){
        HibernateSessionFactory.setConfigFile(configFile);
        sessionFactory = null;
    }
    
    public static Configuration getConfiguration(){
        return configuration;
    }
    
    //提供一个统一的查询方法(带分页) hql形式 from 类 where 条件=?
    public static List excuteQueryByPage(String hql, String [] parameters, int pageSize, int pageNow){
        Session session = null;
        List list = null;
        try {
            session = getSession();
            Query query = session.createQuery(hql);
            if(parameters != null && parameters.length > 0){
                for (int i=0; i<parameters.length; i++){
                    query.setString(i, parameters[i]);
                }
            }
            query.setFirstResult((pageNow - 1) * pageSize).setMaxResults(pageSize);
            list = query.list();
            
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            
        }

        return list;
    }
    
    //提供一个统一的查询方法hql 形式  from 类 where 条件=?
    public static List excuteQuery(String hql, String [] parameters){
        Session s = null;
        List list = null;
        try{
            s = getSession();
            Query query = s.createQuery(hql);
            //判断是否有参数要绑定
            if (parameters != null && parameters.length > 0){
                for (int i=0; i<parameters.length; i++){
                    query.setString(i, parameters[i]);
                }
            }
            list = query.list();
            
        } catch(Exception e){
            
        }finally {
            closeSession();
        }
        return list;
    }
}

编写ArticleService,用于操作数据库的artile表

package service;

import java.util.Iterator;
import java.util.List;

import org.hibernate.*;

import bean.Article;
import myUtil.HibernateSessionFactory;

public class ArticleService {
    
    public ArticleService(){        
    }
    
    public List<Article> getArtileByPage(int pageNow, int pageSize){        
        Session session = null;
        Transaction tx = null;
        List<Article> list = null;
        try{
            session = HibernateSessionFactory.getSession();
            tx = session.beginTransaction();
            String hql = "from Article"; 
            list = session.createQuery(hql).setFirstResult((pageNow - 1) * pageSize).setMaxResults(pageSize).list();
            tx.commit();
        }catch(Exception e){
            e.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            HibernateSessionFactory.closeSession();
        }       
        return list;
    }
    
    public List<Article> getArtile(){
        
        Session session = null;
        Transaction tx = null;
        List<Article> list = null;
        try{
            session = HibernateSessionFactory.getSession();
            tx = session.beginTransaction();
            String hql = "from Article"; 
            list = session.createQuery(hql).list();
            tx.commit();
        }catch(Exception e){
            e.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            HibernateSessionFactory.closeSession();
        }       
        return list;
    }
}

编写blogAction,用于响应客户端对article的请求,查询article,并以json形式返回

package action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

import bean.Article;
import service.ArticleService;

public class blogAction extends ActionSupport {

    private Map<Integer,Object> blogList;

    public Map<Integer, Object> getBlogList() {
        return blogList;
    }

    public String getArticle(){
        System.out.println("getArticle");
        ArticleService as = new ArticleService(); 
        List<Article> list = as.getArtileByPage(2, 3);
        blogList = new HashMap<Integer,Object>();
        int i=1;
        for (Article a:list){
            blogList.put(i++, a);           
        }
        System.out.print(blogList);
        //blogList1 = as.getArtile();
        //System.out.println(blogList);
        return "blogList";
    }
    
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return  SUCCESS;
    }   
}

编写struts.xml,将对atricle的请求分派给blogAction

<action name="blogList" class="action.blogAction" method="getArticle">
    <result name="blogList" type="json">
        <param name="root">blogList</param>
    </result>
</action>

前端js请求

$(document).ready(function(){
    $.post({
        url:'blogList',
        data:'{}',
        datatype:'json',
        success:function(data){
            console.log(data);
            str = "";
            $.each(data,function(i,e){
                str += "<div class='blog-post'>";
                str += "<h2 class='blog-post-title'>"+e['a_title']+"</h2>";
                str += "<p class='blog-post-date'>"+e['a_last_modified_time']+"</p>";
                str += "<p class='blog-post-abs'>"+e['a_body']+"</p>";
                str += "</div>";
            });
            $("#blog").append(str);         
        }
    })  
});

效果如图



工程目录结构如下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容