zoukankan      html  css  js  c++  java
  • MyEclipse环境下Hibernate入门实例

      首先在MyEclipse下创建一个WebProject,项目命名为demo,然后【MyEclipse->project capablities->add hibernate capabilities】,跟着向导操作,最后会生成一个hibernate.cfg.xml和一个HibernateSessionFactory.java文件。在向导中要求填写一些数据库连接的配置信息以及HibernateSessionFactory存放的包,配置信息我们可以参考下面的hibernate.cfg.xml来填写,而HibernateSessionFactory我们放在com.demo.hibernate.util这个包里面。

    1.HibernateSessionFactory.java

    View Code
    package com.demo.hibernate.util;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;
    
    /**
     * Configures and provides access to Hibernate sessions, tied to the
     * current thread of execution.  Follows the Thread Local Session
     * pattern, see {@link http://hibernate.org/42.html }.
     */
    public class HibernateSessionFactory {
    
        /** 
         * Location of hibernate.cfg.xml file.
         * Location should be on the classpath as Hibernate uses  
         * #resourceAsStream style lookup for its configuration file. 
         * The default classpath location of the hibernate config file is 
         * in the default package. Use #setConfigFile() to update 
         * the location of the configuration file for the current session.   
         */
        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() {
        }
        
        /**
         * Returns the ThreadLocal Session instance.  Lazy initialize
         * the <code>SessionFactory</code> if needed.
         *
         *  @return Session
         *  @throws HibernateException
         */
        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;
        }
    
        /**
         *  Rebuild hibernate session factory
         *
         */
        public static void rebuildSessionFactory() {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err
                        .println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
    
        /**
         *  Close the single hibernate session instance.
         *
         *  @throws HibernateException
         */
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);
    
            if (session != null) {
                session.close();
            }
        }
    
        /**
         *  return session factory
         *
         */
        public static org.hibernate.SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        /**
         *  return session factory
         *
         *    session factory will be rebuilded in the next call
         */
        public static void setConfigFile(String configFile) {
            HibernateSessionFactory.configFile = configFile;
            sessionFactory = null;
        }
    
        /**
         *  return hibernate configuration
         *
         */
        public static Configuration getConfiguration() {
            return configuration;
        }
    
    }

    2.hibernate.cfg.xml(在src目录下)

    View Code
    <?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="show_sql">true</property>
             -->
           
            <!-- 连接字符串 -->
            <property name="connection.url">jdbc:mysql://localhost:3306/demo</property>                                         
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
            <!-- 数据库驱动 -->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <!-- 映射文件,是后来添加的,不是想到自动生成的 -->
            <mapping resource="com/demo/hibernate/beans/User.hbm.xml"/>
        </session-factory>
    
    </hibernate-configuration>

    3.创建数据库

    在MySql中创建一个名为demo的数据库,然后将下面的代码另存为“*.sql”文件,再将该文件导入数据库。当然也可直接通过类似navicat的数据库UI来创建数据库。

    DROP TABLE IF EXISTS `user`; 
    CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) DEFAULT NULL,
    `password` varchar(50) DEFAULT NULL,
    `email` varchar(50) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    4. *.hbm.xml映射文件

    我们知道Hibernate是用户将对象与数据库表进行映射,那么下面编写映射文件:User.hbm.xml(在com.demo.hibernate.beans包中),从代码中我们可以看到name与column属性,name表示User类中的属性,column表示数据库表user中的字段名称。类中的属性和表中的字段可以不相同,如果相同的话column可以省略。比如下面的column="username" column="password" 可以省略不写。像<property name="email" /> 一样。

    View Code
    <?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.demo.hibernate.beans">
     -->
    
    <hibernate-mapping>
        <class name="com.demo.hibernate.beans.User" table="user">
            <id name="id" column="ID" >
                <generator class="native" />
            </id>
            <property name="username" column="username" />
            <property name="password" column="password" />
            <property name="email"/>
    
        </class>
    
    </hibernate-mapping>

    5.编写持久化类User.java,

    这里我们不一定要求User类中的属性与表user的字段相同,不过如果相同则可以省去一些步骤,就是前面提到的*.hbm.xml文件中的一些字段可以省略。

    View Code
    package com.demo.hibernate.beans;
    
    public class User {
        private int id;
        private String username;
        private String password;
        private String email;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
    }

    6.编写DAO类UserDAO.java

    DAO就是Database Access Objects,数据访问对象的英文缩写。顾名思义对数据库操作的方法都写在这个类中,就比如代码中getUser()方法就是需要读取数据库信息。不过hibernate因为通过映射的方法不直接使用SQL语句操纵数据库,而是引入了HQL语言。最明显的一点是:

      Query query=session.createQuery("from User where username=?");

    这里from User中的User是指User类而不是user表,HQL直接对对象操作。

    View Code
    package com.demo.hibernate.dao;
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import com.demo.hibernate.beans.User;
    import com.demo.hibernate.util.HibernateSessionFactory;
    public class UserDAO {
        
        public User getUser(String username) throws HibernateException{
            Session session=null;
            Transaction tx=null;
            User user=null;
            try
            {
                session=HibernateSessionFactory.getSession();
                tx=session.beginTransaction();
                Query query=session.createQuery("from User where username=?");
                query.setString(0, username.trim());
                user=(User)query.uniqueResult();
                query=null;
                //session.save(user);
                tx.commit();
                //session.close();
            }
    //        catch(HibernateException e)
    //        {
    //            throw e;
    //        }
    //        finally
    //        {
    //            if(tx!=null)
    //            {
    //                tx.rollback();
    //            }
    //            HibernateSessionFactory.closeSession();
    //        }
            catch(HibernateException e)
            {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
            return user;
        }
    }

    7.编写Service类并运行(含有主函数的类)

    View Code
    package com.demo.hibernate.service;
    
    import com.demo.hibernate.beans.User;
    import com.demo.hibernate.dao.UserDAO;
    
    public class UserService {
    
        public boolean valid(String username,String password)
        { 
            UserDAO test=new UserDAO();
            User user=test.getUser("admin");
            if(user.getPassword().equals(password))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public static void main(String args[])
        {
            UserService service=new UserService();
            boolean login=service.valid("admin", "admin");
            System.out.println("验证结果"+login);
        }
    }

    8.显示结果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    验证结果:true
    作者:xwdreamer
    欢迎任何形式的转载,但请务必注明出处。
    分享到:
  • 相关阅读:
    在dataGridView中实现批量删除
    VS2005制作简单的安装程序
    [WinForms]
    TreeView的联动复选框
    TreeView
    AcceptChanges()和RejectChanges()
    用C#在WINDOWS中实现新用户帐号的创建
    测试成功的窗体应用[批量新增、删除、保存]
    TreeView的递归读取
    VS2005中部署C#应用程序
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2297087.html
Copyright © 2011-2022 走看看