您的位置:首页 > 其它

Hibernate的开发全步骤过程

2016-11-23 17:15 381 查看
开发顺序

1 下载并安装Hibernate

2 Hibernate配置文件详解 配置与MySQL数据库的链接与映射文件User.hbm.xml

3 生成映射文件User.hbm.xml

4 编写持久化类User.java

5 编写辅助类HibernateSessionFactory.java 负责取得和关闭Hibernate的Session对象

6 编写DAO类UserDAO.java 编写根据用户名取得用户对象的getUser()

7 编写Service类UserService.java 编写valid()函数 调用UserDAO.java的getUser()函数执行函数验证

 

 

1 下载并安装Hibernate

下载hibernate-3.0.zip  将hibernate3.zip文件和lib下的所有文件都复制到新建的HibernateTest项目的lib子目录下

MySQL数据库的驱动文件复制到lib子目录下

 

2 hibernate.cfg.xml配置文件

<?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="myeclipse.connection.profile">

            JDBC for MySQL

        </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">

            org.gjt.mm.mysql.Driver

        </property>

        <property name="dialect">

            org.hibernate.dialect.MySQLDialect

        </property>

        <mapping resource="com/demo/hibernate/beans/User.hbm.xml" />

    </session-factory>

</hibernate-configuration>

使用XML文件进行配置时 指定Java类与数据库表格的映射文件位置 XML配置文件的位置必须在CLASSPATH的设定中 Web程式的WEB-INF/classes中 我们使用下面的方式读入XML文件以配置Hibernate

SessionFactory sf = new Configuration().configure().buildSessionFactory();

Configuration表示Java类与数据库表格映射的集合 用于之后建立SessionFactory 之后Configuration就不再起作用了 预设的XML文件名称是hibernate.cfg.xml你也可以指定文件的名称

压缩包Hibernate-3.0.zip压缩包的etc子目录下提供默认的Hibernate配置文件hibernate.cfg.xml 我们要在HibernateTest中使用XML的配置文件 因此请复制该文件到HibernateTest项目的src目录下  并添加MySQL的相关配置项 这样 HibernateTest就支持Hibernate了

3  编写映射文件 User.hbm.xml

Hibernate映射文件包含了对象/关系映射所需的元数据 元数据包含持久化类的声明和属性到数据库的映射

映射文件是XML格式的文件 它负责持久化类与数据库表之间的映射 其根目录是hibernate-mapping 并通过属性package指定类所在的包 每一个表使用一个class定义 那么表示类的名称 table表示关联的表明 通过property子元素来映射类的变量名与数据库表字段名之间的映射关系

在这个HibernateTest项目中 我们建立一个映射文件User.hbm.xml来映射到数据表user 映射的类名为User 所在的包为com.demo.hibernate.beans

 

<?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" >

<!-- DO NOT EDIT: This is a generated file that is synchronized -->

<!-- by MyEclipse Hibernate tool integration. -->

<!-- Created Tue Aug 14 18:57:22 CST 2007 -->

<hibernate-mapping package="com.demo.hibernate.beans">

    <class name="User" table="user">

        <id name="id" column="ID" type="integer">

            <generator class="native"/>

        </id>

        <property name="username" column="username" type="string" />

        <property name="password" column="password" type="string" />

        <property name="email" column="email" type="string" />

    </class>

    

</hibernate-mapping>

4  编写持久化类User.java

持久化类是指其实例需要被Hibernate持久化到数据库中的类 持久化通常是与模型中的实体域类 一般都是一张数据表对应一个持久化类 不能认为所有的持久化类的实例都是
1a7a2
持久的状态 一个实例的状态也可能是瞬时的或脱管的。

在HibernateTest示例程序中 包含了一个持久化类User.java 该类包含表User的4个字段对应的变量 这些变量都申明为private类型的

 

package com.demo.hibernate.beans;

public class User {

    private java.lang.Integer id;

    private java.lang.String username;

    private java.lang.String password;

    private java.lang.String email;

    public java.lang.String getEmail() {

        return email;

    }

    public void setEmail(java.lang.String email) {

        this.email = email;

    }

    public java.lang.Integer getId() {

        return id;

    }

    public void setId(java.lang.Integer id) {

        this.id = id;

    }

    public java.lang.String getPassword() {

        return password;

    }

    public void setPassword(java.lang.String password) {

        this.password = password;

    }

    public java.lang.String getUsername() {

        return username;

    }

    public void setUsername(java.lang.String username) {

        this.username = username;

    }

}

 

5  编写辅助类 HibernateSessionFactory.java

Hibernate的Session 这是一个持久化管理器 通过它从数据库中存取User

首先我们要从SessionFactory中获取一个Session

 

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

通过对configure()的调用来转载hibernate.cfg.xml配置文件 并初始化成一个Configuration实例 在创建SessionFactory之前 可以访问Configuration来设置其他属性

SessionFactory应该设置成单例模式 这样才能在程序中容易地访问SessionFactory

程序代码如下

 

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.

     * NOTICE: Location should be on the classpath as Hibernate uses

     * #resourceAsStream style lookup for its configuration file. That

     * is place the config file in a Java package - the default location

     * is the default Java package.

     * Examples: 

     * 
CONFIG_FILE_LOCATION = "/hibernate.conf.xml". 


     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".
 

     */

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

    /** Holds a single instance of Session */

    private static final ThreadLocal threadLocal = new ThreadLocal();

    /** The single instance of hibernate configuration */

    private static final Configuration cfg = new Configuration();

    /** The single instance of hibernate SessionFactory */

    private static org.hibernate.SessionFactory
sessionFactory;

    /**

     * Returns the ThreadLocal Session instance. Lazy initialize

     * the 
SessionFactory
 if needed.

     *

     * @return Session

     * @throws HibernateException

     */

    public static Session currentSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

        if (session == null) {

            if (sessionFactory == null) {

                try {

                    cfg.configure(CONFIG_FILE_LOCATION);

                    sessionFactory = cfg.buildSessionFactory();

                }

                catch (Exception e) {

                    System.err.println("%%%%
Error Creating SessionFactory %%%%");

                    e.printStackTrace();

                }

            }

            session = sessionFactory.openSession();

            threadLocal.set(session);

        }

        return session;

    }

    /**

     * 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();

        }

    }

    /**

     * Default constructor.

     */

    private HibernateSessionFactory() {

    }

}

这个类不但在他的静态初始器中使用了SessionFactory 还使用了了一个ThreadLocal变量来保存Session作为当前工作线程

 

6  编写DAO类UserDAO.java

所谓的DAO层 就是数据访问接口 为了基于Hibernate的开发中将业务层与数据层分开 DAO层只负责处理调用Hibernate API实现CRUD操作 Service层面向用户负责调用DAO层的代码 这样做的好处是 数据层的代码不用关心业务服务 可以更好的实现移植

 

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.currentSession();

            tx = session.beginTransaction();

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

            query.setString(0, username.trim());

            user = (User)query.uniqueResult();

            query = null;

            tx.commit ();

        }catch(HibernateException e){

            throw e;

        }finally{

            if (tx!=null) {

                tx.rollback();

            }

            HibernateSessionFactory.closeSession();

        }

        return user;

    }

}

 

该类实现了一个getUser()函数 根据用户名username查询一个用户对象 在该函数中使用HibernateSessionFactory取得Session对象 然后通过session执行事务 创建查询对象 返回查询的用户对象,操作Session的代码都是Hibernate提供的API

7  编写Service类并运行

Service类即服务层 就是面向用户服务 它定义的方法都是与实际的业务相关的

此例子中 定义一个Service类UserService 他有一个函数valid() 根据用户名和密码来判断用户是否存在 改函数调用DAO层的UserDAO类来取得一个用户对象 并比较该对象的密码与输入的密码是否相等 如果相等就返回true 否则返回false  然后编写一个main()入口函数 用户调用valid()函数来执行业务的调用 并输出返回的结果

 

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);

    }

}

接下来 运行 UserService.java 运行方式 Java应用程序 即可运行main()函数

此处记住 还要添加日志属性文件 三个日志属性文件 复制到Hibernate的src子目录下即可

运行程序 出现错误

 

Communication failure during handshake. Is there a server running on localhost:3306?

原因:

结果在Mysql.com的官方网站上看到这个解释,是因为新的Mysql的认证机制发生了一些变化造成的,解决方法如下

解决方法:

I'd to change the authentication method at the mysql server: 
set password for @ = old_password(''); 

将红色那部分在cmd-mysql登录之后敲进去就解决了

假如你的用户名密码是root root 那么红色部分就是

set password for root@localhost=old_password('root');

最后正确运行的输出信息

 

INFO - Hibernate 3.0.5

INFO - hibernate.properties not found

INFO - using CGLIB reflection optimizer

INFO - using JDK 1.4 java.sql.Timestamp handling

INFO - configuring from resource: /hibernate.cfg.xml

INFO - Configuration resource: /hibernate.cfg.xml

INFO - Mapping resource: com/demo/hibernate/beans/User.hbm.xml

INFO - Mapping class: com.demo.hibernate.beans.User -> user

INFO - Configured SessionFactory: null

INFO - processing extends queue

INFO - processing collection mappings

INFO - processing association property references

INFO - processing foreign key constraints

INFO - Using Hibernate built-in connection pool (not for production use!)

INFO - Hibernate connection pool size: 20

INFO - autocommit mode: false

INFO - using driver: org.gjt.mm.mysql.Driver at URL: jdbc:mysql://localhost:3306/demo

INFO - connection properties: {user=root, password=****}

INFO - RDBMS: MySQL, version: 5.5.17

INFO - JDBC driver: Mark Matthews' MySQL Driver, version: 2.0.4

INFO - Using dialect: org.hibernate.dialect.MySQLDialect

INFO - Using default transaction strategy (direct JDBC transactions)

INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)

INFO - Automatic flush during beforeCompletion(): disabled

INFO - Automatic session close at end of transaction: disabled

INFO - Scrollable result sets: enabled

INFO - JDBC3 getGeneratedKeys(): disabled

INFO - Connection release mode: null

INFO - Maximum outer join fetch depth: 2

INFO - Default batch fetch size: 1

INFO - Generate SQL with comments: disabled

INFO - Order SQL updates by primary key: disabled

INFO - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory

INFO - Using ASTQueryTranslatorFactory

INFO - Query language substitutions: {}

INFO - Second-level cache: enabled

INFO - Query cache: disabled

INFO - Cache provider: org.hibernate.cache.EhCacheProvider

INFO - Optimize cache for minimal puts: disabled

INFO - Structured second-level cache entries: disabled

INFO - Statistics: disabled

INFO - Deleted entity synthetic identifier rollback: disabled

INFO - Default entity-mode: pojo

INFO - building session factory

WARN - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/eeeeeee/HibernateTest/WebRoot/WEB-INF/lib/ehcache-1.1.jar!/ehcache-failsafe.xml

INFO - Not binding factory to JNDI, no JNDI name configured

INFO - Checking 0 named queries

验证结果:true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: