Hibernate综合运用内部留言本(三)

来源:互联网 发布:数据库删除语句怎么写 编辑:程序博客网 时间:2024/05/29 03:41
一 理解需求

二 根据需求文档,我们画出程序框架图

三 创建一个web项目

四 创建web层

五 引入hibernate,使用手动的方法来开发domain和对象关系文件
1 Message
package com.sina.domain;public class Message {        private Integer mesId;        private java.util.Date mesTime;        private String content;        //对象        private Users sender;        private Users getter;        public Integer getMesId() {                return mesId;        }        public void setMesId(Integer mesId) {                this.mesId = mesId;        }        public java.util.Date getMesTime() {                return mesTime;        }        public void setMesTime(java.util.Date mesTime) {                this.mesTime = mesTime;        }        public String getContent() {                return content;        }        public void setContent(String content) {                this.content = content;        }        public Users getSender() {                return sender;        }        public void setSender(Users sender) {                this.sender = sender;        }        public Users getGetter() {                return getter;        }        public void setGetter(Users getter) {                this.getter = getter;        }}


2 Users
package com.sina.domain;import java.util.List;import java.util.Set;public class Users {    private Integer userid;    private String userpwd;    private String name;    //这里一个用户可以发送多个消息,也可以接收多个消息. one-to-many        private Set<Message> sendMessages;    private Set<Message> getMessages;    public Integer getUserid() {        return userid;    }    public void setUserid(Integer userid) {        this.userid = userid;    }    public String getUserpwd() {        return userpwd;    }    public void setUserpwd(String userpwd) {        this.userpwd = userpwd;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Set<Message> getSendMessages() {        return sendMessages;    }    public void setSendMessages(Set<Message> sendMessages) {        this.sendMessages = sendMessages;    }    public Set<Message> getGetMessages() {        return getMessages;    }    public void setGetMessages(Set<Message> getMessages) {        this.getMessages = getMessages;    }   }


3 Message.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";><hibernate-mapping package="com.sina.domain"><class name="Message"><!-- 主键属性 --><id name="mesId" type="java.lang.Integer"><generator class="increment"></generator></id><!-- 普通属性 --><property name="content" type="java.lang.String"><column name="content" length="2000"/></property><property name="mesTime" type="java.util.Date"><column name="mesTime" /></property><!-- 配置getter属性 --><many-to-one name="getter" column="getter_id" /><!-- 配置sendder --><many-to-one name="sender" column="sender_id"/></class></hibernate-mapping>


4 Users.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";><hibernate-mapping package="com.sina.domain"><class name="Users" table="users" lazy="false"><id name="userid" type="java.lang.Integer"><generator class="increment"></generator></id><property name="name" type="java.lang.String"><column name="name" length="64"/></property><property name="userpwd" type="java.lang.String"><column name="userpwd" length="64"/></property><!-- getMessages属性 --><!-- <list name="sendMessages"><list-index column=""/><key column="sender_id" /><one-to-many class="Message"/></list>--><set name="sendMessages"><key column="sender_id" /><one-to-many class="Message"/></set><set name="getMessages"><key  column="getter_id" /><one-to-many class="Message"/></set></class></hibernate-mapping>


六 配置文件
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd";><!-- Generated by MyEclipse Hibernate Tools.                   --><hibernate-configuration><session-factory>                <property name="dialect">                        org.hibernate.dialect.MySQLDialect                </property>                <property name="connection.url">                        jdbc:mysql://localhost:3306/users                </property>                <property name="connection.username">root</property>                <property name="connection.password">root</property>                <property name="connection.driver_class">                        org.gjt.mm.mysql.Driver                </property>        <property name="show_sql">true</property>        <!-- 配置让hibernate自动创建关系模型(表) -->        <property name="hbm2ddl.auto">create</property>        <mapping resource="com/sina/domain/Message.hbm.xml" />        <mapping resource="com/sina/domain/Users.hbm.xml" /></session-factory></hibernate-configuration>


七 写成工具类 
package com.sina.util;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;final public class HibernateUtil {        private static SessionFactory sessionFactory = null;        // 使用线程局部模式        private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();        private HibernateUtil() {        };        static {                sessionFactory = new Configuration().configure().buildSessionFactory();        }        // 获取全新的全新的sesession        public static Session openSession() {                return sessionFactory.openSession();        }        // 获取和线程关联的session        public static Session getCurrentSession() {                Session session = threadLocal.get();                // 判断是否得到                if (session == null) {                        session = sessionFactory.openSession();                        // 把session对象设置到 threadLocal,相当于该session已经和线程绑定                        threadLocal.set(session);                }                return session;        }        public static void closeCurrentSession() {                Session s = getCurrentSession();                if (s != null && s.isOpen()) {                        s.close();                        threadLocal.set(null);                }        }        // 这里提供一个根据id返回对象的方法        public static Object findById(Class clazz, java.io.Serializable id) {                Session s = null;                Transaction tx = null;                Object obj = null;                try {                        s = openSession();                        tx = s.beginTransaction();                        obj = s.load(clazz, id);                        tx.commit();                } catch (Exception e) {                        e.printStackTrace();                        throw new RuntimeException(e.getMessage());                        // TODO: handle exception                } finally {                        if (s != null && s.isOpen()) {                                s.close();                        }                }                return obj;        }        // 统一的一个修改和删除(批量 hql) hql"delete upate ...??"        public static void executeUpdate(String hql, String[] parameters) {                Session s = null;                Transaction tx = null;                try {                        s = openSession();                        tx = s.beginTransaction();                        Query query = s.createQuery(hql);                        // 先判断是否有参数要绑定                        if (parameters != null && parameters.length > 0) {                                for (int i = 0; i < parameters.length; i++) {                                        query.setString(i, parameters[i]);                                }                        }                        query.executeUpdate();                        tx.commit();                } catch (Exception e) {                        e.printStackTrace();                        throw new RuntimeException(e.getMessage());                        // TODO: handle exception                } finally {                        if (s != null && s.isOpen()) {                                s.close();                        }                }        }        // 如果要配置openSessionInView        // 统一的一个修改和删除(批量 hql) hql"delete upate ...??"        public static void executeUpdateOpenInView(String hql, String[] parameters) {                Session s = getCurrentSession();                Query query = s.createQuery(hql);                // 先判断是否有参数要绑定                if (parameters != null && parameters.length > 0) {                        for (int i = 0; i < parameters.length; i++) {                                query.setString(i, parameters[i]);                        }                }                query.executeUpdate();        }        // 统一的添加的方法        public static void save(Object obj) {                Session s = null;                Transaction tx = null;                try {                        s = openSession();                        tx = s.beginTransaction();                        s.save(obj);                        tx.commit();                } catch (Exception e) {                        if (tx != null) {                                tx.rollback();                        }                        throw new RuntimeException(e.getMessage());                        // TODO: handle exception                } finally {                        if (s != null && s.isOpen()) {                                s.close();                        }                }        }        // 提供一个统一的查询方法(带分页) hql 形式 from 类 where 条件=? ..        public static List executeQueryByPage(String hql, String[] parameters,                        int pageSize, int pageNow) {                Session s = null;                List list = null;                try {                        s = openSession();                        Query query = s.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();                        throw new RuntimeException(e.getMessage());                        // TODO: handle exception                } finally {                        if (s != null && s.isOpen()) {                                s.close();                        }                }                return list;        }        // 提供一个统一的查询方法 hql 形式 from 类 where 条件=? ..        public static List executeQuery(String hql, String[] parameters) {                Session s = null;                List list = null;                try {                        s = openSession();                        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) {                        e.printStackTrace();                        throw new RuntimeException(e.getMessage());                        // TODO: handle exception                } finally {                        if (s != null && s.isOpen()) {                                s.close();                        }                }                return list;        }}



八 测试一下看看能否映射成功
package com.sina.test;import com.sina.util.HibernateUtil;import com.sina.util.MyTools;public class TestMain {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        HibernateUtil.openSession();    }}


生成了两张表:
CREATE TABLE `users` (  `userid` int(11) NOT NULL,  `name` varchar(64) DEFAULT NULL,  `userpwd` varchar(64) DEFAULT NULL,  PRIMARY KEY (`userid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `message` (  `mesId` int(11) NOT NULL,  `content` longtext,  `mesTime` datetime DEFAULT NULL,  `getter_id` int(11) DEFAULT NULL,  `sender_id` int(11) DEFAULT NULL,  PRIMARY KEY (`mesId`),  KEY `FK9C2397E7D2E9BD25` (`getter_id`),  KEY `FK9C2397E76D6C03BB` (`sender_id`),  CONSTRAINT `FK9C2397E76D6C03BB` FOREIGN KEY (`sender_id`) REFERENCES `users` (`userid`),  CONSTRAINT `FK9C2397E7D2E9BD25` FOREIGN KEY (`getter_id`) REFERENCES `users` (`userid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;



原创粉丝点击