1、导入架包(最小架包,共11个)
antlr-2.7.5H3.jar asm.jar asm-attrs.jar cglib-2.1.jar commons-collections-2.1.1.jar commons-logging-1.0.4.jar
dom4j-1.5.2.jar ehcache-1.1.jar hibernate3.jar jta.jar log4j-1.2.9.jar
2、添加 hibernate.cfg.xml 配置文件
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.profile">mysql</property>
<property name="connection.url">jdbc:mysql://localhost:3306/demo</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="user.hbm.xml"/>
</session-factory>
</hibernate-configuration>
上述xml创建一个sessionFactory,方言dialect指定了hibernate生成的特定SQL语句,配置此项,应用会参考方言。
mapping标签加载映射文件。
3、编写持久化类(User.java)
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;
}
}
hibernate使用POJOs,和javabean很像。说明hibernate通过get和set方法访问对象。
4、编写映射文件(user.hbm.xml)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.qh.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>
<property name="password" column="password" type="string"></property>
<property name="email" column="email" type="string"></property>
</class>
</hibernate-mapping>
此映射文件负责持久化类和数据库表之间的映射;id属性是唯一标识符;generator 元素指定标识符的生成策略,我们选择 native,它提供了取决于数据库方言的可移植性。property元素的name属性值为持久化类的属性。
5、编写辅助类 HibernateSessionFactory.java
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.<br><br>
* Examples: <br>
* <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
* CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code>
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
/** Holds a single instance of Session */
@SuppressWarnings("unchecked")
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 <code>SessionFactory</code> if needed.
*
* @return Session
* @throws HibernateException
*/
@SuppressWarnings("unchecked")
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
*/
@SuppressWarnings("unchecked")
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* Default constructor.
*/
private HibernateSessionFactory() {
}
}
它是持久化管理器,我们通过它来从数据库中存取User。
6、编写DAO类(UserDao.java)
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.qh.hibernate.beans.User;
import com.qh.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;
}
}
Dao层只负责调用hibernate API实现CURD操作。service层面向用户调用DAO层地代码。
7、编写service类(UserService.java)
import com.qh.hibernate.beans.User;
import com.qh.hibernate.dao.UserDao;
public class UserService {
public boolean valid(String username,String password){
UserDao userDao=new UserDao();
User user=userDao.getUser("admin");
if(user.getPassword().equals(password)){
return true;
}else{
return false;
}
}
public static void main(String args[]){
UserService userService=new UserService();
System.out.println("验证结果为:"+userService.valid("admin", "123"));
}
}
它定义的方法和具体的应用相关。
8、运行UserService.java,控制台输出如下:
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: user.hbm.xml
INFO - Mapping class: com.qh.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: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3306/demo
INFO - connection properties: {user=root, password=****, profile=mysql}
INFO - RDBMS: MySQL, version: 5.5.13
INFO - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.8 ( Revision: ${svn.Revision} )
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 - JDBC batch size: 15
INFO - JDBC batch updates for versioned data: disabled
INFO - Scrollable result sets: enabled
INFO - JDBC3 getGeneratedKeys(): enabled
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:/D:/My%20Documents/eclipse%20workspace/hibernateTest/WebContent/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
9、项目结构图和数据库表