一,Hibernate框架介绍
没有Hibernate之前,使用jdbc来连接数据库时,需要反射加载驱动,再获取连接
在连接上获取sql承载块,传入sql语句执行,获取结果集,解析结果
Hibernate框架,核心对象就是使用连接字串获取的session,自动完成对象关系映射,不需要手动来解析对象
二,程序实例
1.新建web项目,导入框架包
2.编写 User.java
package com.zhaolong.bean; import java.sql.Date; public class User { private Integer id; private String name; private String gender; private String age; private Date birthday; private String phone; private String address; private String card; private String email; private String wechat; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCard() { return card; } public void setCard(String card) { this.card = card; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getWechat() { return wechat; } public void setWechat(String wechat) { this.wechat = wechat; } public User(String name, String gender, String age, Date birthday, String phone, String address, String card, String email, String wechat) { super(); this.name = name; this.gender = gender; this.age = age; this.birthday = birthday; this.phone = phone; this.address = address; this.card = card; this.email = email; this.wechat = wechat; } public User() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", birthday=" + birthday + ", phone=" + phone + ", address=" + address + ", card=" + card + ", email=" + email + ", wechat=" + wechat + "]"; } }
3.编写实体类的映射文件 User.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.zhaolong.bean.User" table="HUQB_USER"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <property name="gender"/> <property name="age"/> <property name="birthday"/> <property name="phone"/> <property name="address"/> <property name="card"/> <property name="email"/> <property name="wechat"/> </class> <!-- 创建命名查询 --> <query name="findAllUsers"> <![CDATA[ from User ]]> </query> <!-- 查询年龄大于30的所有人 --> <query name="findUsersByAge"> <![CDATA[ from User u where u.age>:age ]]> </query> <!-- 本地命名查询 --> <sql-query name="findAllUsersLocal"> <!-- 通过return 标签指定返回结果的映射 --> <return class="com.zhaolong.bean.User"/> <![CDATA[ select * from huqb_user ]]> </sql-query> </hibernate-mapping>
4.编写连接字串配置文件 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="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">java</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> --> <!-- 配置方言 --> <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> <!-- 配置连接地址 --> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <!-- 配置用户名 --> <property name="connection.username">mart</property> <!-- 配置密码 --> <property name="connection.password">java</property> <!-- 配置驱动 --> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="show_sql">true</property> <!-- 对sql语句进行格式化 --> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource="com/zhaolong/bean/User.hbm.xml"/> </session-factory> </hibernate-configuration>
5.根据cfg文件获取操作数据库的session,可以自己编写,也可以选择自动生成 HibernateSessionFactory
package com.zhaolong.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 final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static org.hibernate.SessionFactory sessionFactory; private static Configuration configuration = new Configuration(); private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; 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; } }
6.编写数据测试类 AddTest
package com.zhaolong.test; import java.sql.Date; import org.hibernate.Session; import org.hibernate.Transaction; import com.zhaolong.bean.User; import com.zhaolong.util.HibernateSessionFactory; public class AddTest { public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Transaction tx = session.beginTransaction(); User u1=new User("诸葛亮", "男", "35", new Date(System.currentTimeMillis()) , "110", "蜀国", "1234567890", "zgl@huqb.com", "zhugeliang01"); User u2=new User("黄月英", "女", "33", new Date(System.currentTimeMillis()+100000000) , "119", "蜀国", "0987654321", "hyy@huqb.com", "huangyueying01"); User u3=new User("曹丕", "男", "45", new Date(System.currentTimeMillis()) , "120", "魏国", "1234567890", "cp@huqb.com", "caopi"); User u4=new User("甄姬", "女", "33", new Date(System.currentTimeMillis()+100000000) , "114", "魏国", "0987654321", "zj@huqb.com", "zhenji01"); User u5=new User("荀彧", "男", "45", new Date(System.currentTimeMillis()) , "120", "魏国", "1234567890", "cp@huqb.com", "caopi"); User u6=new User("曹操", "男", "33", new Date(System.currentTimeMillis()+100000000) , "114", "魏国", "0987654321", "zj@huqb.com", "zhenji01"); session.save(u1); session.save(u2); session.save(u3); session.save(u4); session.save(u5); session.save(u6); tx.commit(); session.close(); } }