ORM概念:对象关系映射
O:object 对象 R:Realtion: 关系 M:Mapping:映射
Hibernate与ORM的关系: Hibernate是ORM的实现
Hibernate:基于持久层的框架(数据的访问层使用)
搭建一个Hibernate环境步骤:
1.引入Jar文件
--->:required文件下的所有包(必须要的包):
--->:连接数据库的包
2.写
对象:(domain)[Student.java]以及
对象的映射:domain.hbm.xml[Student.hbm.xml]
3.src/hibernate.cfg.xml 主配置文件
--->数据库连接配置
--->加载所用的映射(*.hbm.xml)
具体代码实现:
①对象模型:domain:
public class Student { private Long id; private String name; private Integer age;}
对象的映射:Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 类和表的映射配置文件 hibernate-mapping: 映射文件的根节点 --> <!-- name为对象的全限定名称 table为在数据库中与之相对应的表 --> <class name="com.gxxy.domain.Student" table="student"> <!-- id 表中的主键 name="id" id为对象的属性 column="s_id" s_id为数据库表中的字段 --> <id name="id" column="s_id"> <generator class="native"/> </id> <!-- property 为表中的其他字段 name="对象的属性" column="数据库表中的字段" --> <property name="name" column="s_name"/> <property name="age" column="s_age"/> </class> </hibernate-mapping>
②:src目录下的hibernate.cfg.xml 主配置文件
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!--#hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password hibernate.dialect org.hibernate.dialect.HSQLDialect --> <!--Hibernate配置文件 1.配置文件的文件名我们都会按照默认的命名:hibernate.cfg.xml 2. hibernate-configuration;hibernate文件的根节点 3.session-factory:Session工厂,相当于JDBC中的DataSource --> <hibernate-configuration> <session-factory> <!-- 设置连接数据库的四大参数 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql:///db_hibernate</property> <property name="connection.username">root</property> <property name="connection.password">******</property> <!-- 在控制台打印Hibernate自动生成的SQL语句 --> <property name="show_sql">true</property> <!-- 导入映射文件 --> <mapping resource="com/gxxy/domain/Students.hbm.xml" /> </session-factory> </hibernate-configuration>
③:具体实现类的代码:(增/删/改/查)
StudentOperateIMPL.java
package com.gxxy.dao.imp; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import com.gxxy.dao.StudentDAO; import com.gxxy.domain.Student; import com.gxxy.utils.HibernateUtils; @SuppressWarnings("all") public class StudentOperateIMPL implements StudentDAO { /** * 添加一个学生 */ public void save(Student st) { /* Save方法的执行流程:
1. 新建一个Configuration对象
2. 利用方法[Configuration.configure()]加载`hibernate.cfg.xml`文件 3.根据hibernate.cfg.xml中的连接数据库的信息(className, URL, username,password)连接数据库 并配置相关的property属性
4. 加载解析映射文件,把映射文件中的信息保存在Configuration对象中
5. 根据config创建SessionFactory对象,并创建session对象 */ // ①创建一个Configuration对象,利用创建的这个对象调用configure()方法,加载hibernate.cfg.xml文件 Configuration config = new Configuration().configure(); // ②获取session工厂创建的session Session session2 = config.buildSessionFactory().openSession(); // ③开始事务 session2.beginTransaction(); // ④保存对象 session2.save(st); // ⑤提交事务 session2.getTransaction().commit(); // ⑥关闭资源 session2.close(); } /** * 删除一个学生 */ public void delete(Student st) { Session session = HibernateUtils.getSession(); session.beginTransaction(); session.delete(st); ; session.getTransaction().commit(); session.close(); } /** * 更新学生信息 */ public void update(Student st) { Session session = HibernateUtils.getSession(); session.beginTransaction(); session.update(st); session.getTransaction().commit(); session.close(); } /** * 获取一个学生的信息 */ public Student get(Student st) { Configuration config = new Configuration().configure(); Session session = config.buildSessionFactory().openSession(); Student student = (Student) session.get(st.getClass(), st.getId()); session.close(); return student; } /** * 获取所有学生的信息 */ public List<?> list() { Session session = HibernateUtils.getSession(); return session.createQuery("FROM Student").list(); } }
以上的做法每调用一个方法就会new一个SessionFactory对象,这样就会降低性能,所以以下代码对其进行优化
public class HibernateUtils { private HibernateUtils() { } private static SessionFactory session = null; static { session = new Configuration().configure().buildSessionFactory(); } public static Session getSession() { return session.openSession(); } }