一、Hibernate框架简介
Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具
1.1、理解持久化
- 瞬时状态:在程序运行的时候,有些程序数据是保存在内存中,当程序退出后,这些数据就不复存在了,所以称这些数据的状态为瞬时状态
- 持久状态:在使用一此软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘或者数据库中,称这些数据的状态是持久状态
- 持久化:持久化就是将程序中的数据在瞬时状态和持久状态之间转换的机制。(如:JDBC)
1.2、对象-关系映射(ORM)
Java是一种面象对象的设计语言。在程序运行时的数据是以对象形式存在内存中,而保存数据时,又要以对象的形式存在关系型数据库中。
ORM简单讲:就是能在对象和关系型数据库两者之间进行数据转换的机制。Hibernate就是这样一个中间的解决方案。关系如下图
1.3、ORM框架综述
ORM:对象关系映射(Object Relation Mapping)
Hibernate框架:能够实现ORM框架
Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMap
Hibernate框架对JDBC时行和封装,简化了数据访问层。可应用在任何使用JDBC的场合如:Servlet、JSP的WEB应用,JAVA客户端等。
二、Hibernate下载
官网:http://sourceforge.net/projects/hibernate/files/hibernate3/
这里下载的是3.3.2GA,
解压后,将根目录下的hibernate3.jar和将lib目录下全部的jar导入项目中
同时将数据库驱动也导入这里使用Oracle 11g
其中加入了一些其它的jar包如:JSTL包
当然也可以用MyEclipse完全集成,不用下载
三、Hibernate配置
3.1、创建hibernate.cfg.xml文件.
这是配置文件默认名.一般放在src目录下:作用指定数据库连接的信息及映射文件路径
获取配置文件进行修改。当然如果记得了就全写也可以。在下载的Hibernate解压目录下就有配置文件模板
hibernate-distribution-3.3.2.GA-disthibernate-distribution-3.3.2.GAproject utorialswebsrcmain esources此目录下就有,将其复制到src目录下进行修改
<?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"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <!-- 数据库驱动 不同的数据库不一样--> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- 数据库访问url 不同的数据库不一样--> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <!-- 数据库连接用户名 --> <property name="connection.username">sa</property> <!--数据库连接用户名的密码 --> <property name="connection.password"></property> <!-- JDBC connection pool (use the built-in) --> <!--数据库连接池默认连接数量 --> <property name="connection.pool_size">2</property> <!-- SQL dialect --> <!--方言,不同的数据不同的版都有所不同 --> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <!-- Enable Hibernate's current session context --> <!-- Session设置 --> <property name="current_session_context_class">org.hibernate.context.ManagedSessionContext</property> <!-- Disable the second-level cache --> <!--二级缓存 --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <!-- 在执行数据操作时,是不是在控制台显示SQL语句,true为显示 --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <!--根据数据库表得到类,根据类到表 --> <property name="hbm2ddl.auto">create</property> <!--对类的配置文件映射 --> <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/> <mapping resource="org/hibernate/tutorial/domain/Person.hbm.xml"/> </session-factory> </hibernate-configuration>
这里暂时只做数据库的连接配置Oracle的
<?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"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <!-- 数据库驱动 不同的数据库不一样--> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- 数据库访问url 不同的数据库不一样--> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <!-- 数据库连接用户名 --> <property name="connection.username">accp</property> <!--数据库连接用户名的密码 --> <property name="connection.password">accp</property> </session-factory> </hibernate-configuration>
3.2、创建持久化类和映射文件
也就是创建实体类的配置文件如:Login.hbm.xml(Login为类名),并在hibernate.cfg.xml文件下方</session-factory>前面中添加映射文件路径
1、在数据库中创建一张表
create table login ( username varchar2(20) primary key, password varchar2(20) );
2、创建Login实体类
package com.pb.entity; /* * 登录实体类 */ public class Login { private String username; private String password; 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; } }
3、在实体类的同一个包下创建实体类的配置文件
<?xml version='1.0' encoding='utf-8'?> <!-- 这里与hibernate.cfg.xml配置文件不一样注意 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 这里与hibernate.cfg.xml配置文件不一样注意 --> <hibernate-mapping> <!--类名和数据库中的表名相对应 哪个用户 --> <class name="com.pb.entity.Login" table="LOGIN" schema="accp"> <!-- id代表主键 column列表 type代表数据类型--> <!-- 类中的属性 --> <id name="username" type="java.lang.String"> <!-- 表中哪一个字段或者是列名 --> <column name="USERNAME" length="20" /> <!--生成的方式 assigned代表由外部外部程序负责生成,在 save() 之前必须指定一个--> <!-- native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。--> <generator class="assigned" /> </id> <!-- 密码段设置 --> <!--类中的名字和数据类型 --> <property name="password" type="java.lang.String"> <!-- 表中的字段名,长度可心不要,是不为空true为不能为空,false是可以为空 --> <column name="PASSWORD" length="20" not-null="true"/> </property> <!--如果还有其它的属性,设置方式与password一样设置 --> </class> </hibernate-mapping>
在src下的配置文件中添加映射
<?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"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <!-- 数据库驱动 不同的数据库不一样--> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- 数据库访问url 不同的数据库不一样--> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <!-- 数据库连接用户名 --> <property name="connection.username">accp</property> <!--数据库连接用户名的密码 --> <property name="connection.password">accp</property> <!--为实体类配置文件添加映射 --> <mapping resource="com/pb/entity/Login.hbm.xml"/> </session-factory> </hibernate-configuration>
3.3、创建Hibernate连接工具类
Hibernater主要接口和类:
Configuration
SessionFactory:DriverManager
Session:Connection
Transaction
Query:Statement和PreparedStatement
在下载的包中有提供好的一个比较简单的工具类
package com.pb.until; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
这个比较,也可以增加一功能
相比较MyEclipse提供的一个比较完美
package com.pb.until; 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; } }
根据需要选择
四、Hibernate的持久化操作的步骤
4.1、读取并散板配置文件
Configuration config=new Configuration().configure();
4.2、读取并解析映射信息,创建SessionFactory
SessionFactory factory=config.buildSessionFactory();
4.3、打开session
Session session=factory.openSessin();
4.4、开始一个事务(增、删、改操作必须,查询操作可选)
Transaction tran=session.beginTransaction();
4.5、操作化操作
session.save(对象);
session.update(对象);
session.delete(对象);
session.get(主键之类的);
4.6、提交事务
tran.commit();
4.7、关闭session
session.close();
五、Hibernate使用
实现增、删、改、查的类
package com.pb.LoginDao; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.pb.entity.Login; import com.pb.until.HibernateSessionFactory; import com.pb.until.HibernateUtil; public class LoginDao { /* * 增加 */ public void save(Login login) { // 得到Session Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tran = null; // 也可以 // Session session=new // Configuration().configure().buildSessionFactory().openSession(); try { // 打开事务 tran = session.beginTransaction(); // 执行数据添加 session.save(login); // 提交事务 tran.commit(); System.out.println("用户信息添加成功"); } catch (HibernateException e) { // 事务回滚 tran.rollback(); e.printStackTrace(); System.out.println("用户信息添加失败"); } finally { // 关闭session session.close(); } } /* * 修改根据用户名 */ public void update(Login login) { // 得到Session Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tran = null; // 也可以 // Session session=new // Configuration().configure().buildSessionFactory().openSession(); try { // 打开事务 tran = session.beginTransaction(); // 执行数据添加 session.update(login); // 提交事务 tran.commit(); System.out.println("用户信息修改成功"); } catch (HibernateException e) { // 事务回滚 tran.rollback(); e.printStackTrace(); System.out.println("用户信息修改失败"); } finally { // 关闭session session.close(); } } /* * 修改根据用户名修改密码 */ public void delte(Login login) { // 得到Session Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tran = null; // 也可以 // Session session=new // Configuration().configure().buildSessionFactory().openSession(); try { // 打开事务 tran = session.beginTransaction(); // 执行数据添加 session.delete(login); // 提交事务 tran.commit(); System.out.println("用户信息删除成功"); } catch (HibernateException e) { // 事务回滚 tran.rollback(); e.printStackTrace(); System.out.println("用户信息删除失败"); } finally { // 关闭session session.close(); } } /* * 查询一查询全部用户 */ public List<Login> QueryALL() { // 使用myeclipse提供的工具类来得到session Session session = HibernateSessionFactory.getSession(); // 建立查询 Query query = session.createQuery("from Login"); // 查询重到List集合 List<Login> list = query.list(); // 关闭session session.close(); // 返回结果集合 return list; } /* * 查询二 查询指定的用户名的 */ public Login QueryByName(String username) { // 使用myeclipse提供的工具类来得到session Session session = HibernateSessionFactory.getSession(); // 建立查询 Query query = session.createQuery("from Login l where l.username=?"); // 占位 query.setString(0, username); // 查询返回唯一 Login login = (Login) query.uniqueResult(); // 关闭session session.close(); // 返回结果集合 return login; } /* * 查询三,模糊查询 */ public List<Login> QueryLikeName(String username) { // 使用myeclipse提供的工具类来得到session Session session = HibernateSessionFactory.getSession(); // 建立查询 Query query = session .createQuery("from Login l where l.username like ?"); // 占位 query.setString(0, "%" + username + "%"); // 查询重到List集合 List<Login> list = query.list(); // 关闭session session.close(); // 返回结果集合 return list; } }
测试类:
package com.pb.test; import java.util.List; import com.pb.LoginDao.LoginDao; import com.pb.entity.Login; public class Test { public static void main(String[] args) { //声明LoginDao对象 LoginDao loginDao=new LoginDao(); //声明对象并赋初始值 Login login=new Login(); login.setUsername("Jack"); login.setPassword("blue"); //执行添加 loginDao.save(login); //执行修改 login.setUsername("Jack"); login.setPassword("while"); loginDao.update(login); //执行删除 loginDao.delte(login); System.out.println("=========查询全部========"); //查询全部 List<Login> list=loginDao.QueryALL(); for (Login log : list) { System.out.println("用户名:"+log.getUsername()+" 密码:"+log.getPassword()); } System.out.println("=========精确查询========"); //查询一个用户 Login lg=loginDao.QueryByName("ffff"); if(lg!=null){ System.out.println("用户名:"+lg.getUsername()+" 密码:"+lg.getPassword()); }else{ System.out.println("没有此用户"); } System.out.println("=========模糊查询========"); //模糊查询 List<Login> likelist=loginDao.QueryLikeName("t"); for (Login lo : likelist) { System.out.println("用户名:"+ lo.getUsername()+" 密码:"+ lo.getPassword()); } } }