1 Hibernate的基本配置

 

添加所需 jar 包

hibernate-distribution-3.6.10.Final 下的基本 hibernate.jar;

\hibernate-distribution-3.6.10.Final\lib\required下的所有 jar 包。 

编写 hibernate.cfg.xml (hibernate 配置文件) 配置 hibernate 如何连接到数据库

<?配置xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration- 3.0.dtd" > <hibernate-configuration>  <session-factory>  <!-- 配置如何连接数据库 -->  <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>  <property name="hibernate.connection.username">hr</property>  <property name="hibernate.connection.password">hr</property>  <!-- hibernate支持多种数据库, 需要选择一种方言 -->  <property name="hibernate.dialect">org.hibernate.dialect.Oracle10g Dialect</property>  <!-- 二级缓存配置 -->  <!-- 启用二级缓存 -->  <property name="hibernate.cache.use_second_level_cache">true</property>  <!-- 启用hql查询缓存 -->  <property  name="hibernate.cache.use_query_cache">true</property>  <!-- 选择缓存实现类 -->  <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>  <!-- 跟连接池相关的配置 -->  <!-- 连接的***个数 -->  <property name="hibernate.c3p0.max_size">10</property>  <!-- 每次创建连接的增长数 -->  <property name="hibernate.c3p0.acquire_increment">2</property>  <!-- 连接最小保留个数 -->  <property name="hibernate.c3p0.min_size">2</property>  <!-- 获取连接的超时时间 -->  <property name="hibernate.c3p0.timeout">20</property>  <property name="current_session_context_class">thread</property>  <!-- 加入sql监控 -->  <property name="hibernate.show_sql">true</property>  <mapping resource="entity/User.hbm.xml" />  </session-factory> </hibernate-configuration> 

配置映射文件

在java实体类和数据库表之间建立对应关系,来简化增删改查操作对象(java实体类) 关 系(关系型数据库) 映射(对应关系) ORM(object relationship mapping)

对实体类的要求:

1. 要有无参构造方法

2. 实体类不能加 final

3. 建议实现 Serializable 接口(以后二级缓存会用到)

映射文件(格式为 xml):

习惯上格式为 实体类名.hbm.xml

hibernate 主键生成方式:

increment 取 id 的***值+1 sequence 默认找 hibernate_sequence `<generator class="sequence"/>`  如果要自定义序列名:  <generator class="sequence">  <param name="sequence">自定义序列名</param>  </generator> assigned 由应用程序指定 id identity 例如 sqlserver, mysql 需要使用这种方式生成主键值 native (会根据方言选择是亿华云用 sequence 或是 identity) 

例:

-- 数据库 create table person ( id number(10) primary key, name varchar2(10), age number(2), gender varchar2(4), city varchar2(10) );  //实体类 public class Person {   private Integer id;  private String name;  private Integer age;  private String gender; }  <!--person.hbm.xml(映射文件)--> <?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" > <hibernate-mapping package="com.zyb.entity">  <class name="Person" table="person">  <id name="id">  <generator class="increment"/>  </id>  <property name="name" />  <property name="age" />  <property name="gender" />  </class> </hibernate-mapping> 

使用 hibernate 的 api 进行 CRUD

session.save(实体对象); 执行 insert 来保存数据

session.delete(实体对象); 执行 delete 来删除数据

要先查询、后删除

session.get(实体类型,基本 实体 id 主键值) ; 执行 select 来查询单个实体

session.update(实体对象);

在 session 打开的过程中, 对实体的修改,***事务提交时,hibernate 都会将这些修改同步到数据库,如果实体对象的配置数据与数据库数据不一致,就称此数据变”脏”了。hibernate 会进行脏数据检查,基本事务提交时,如果数据变”脏”了,hibernate才会执行 update 查询多个实体。香港云服务器

session.createQuery(hql 语句).list(); 返回一个 List 集合

例:

import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public static void main(String[] args) {   // 1. 读取配置文件  Configuration cfg = new Configuration().configure();  // 2. 创建SessionFactory  SessionFactory sf = cfg.buildSessionFactory();  // 3. Session <-> Connection (类似于)  Session session = sf.openSession(); // 打开新session,配置 类似 于打开一个数据库连接  // 4. 进行实体类的增删改查  Person p = new Person();  p.setName("王五"); p.setAge(19);  p.setGender("男");  // 开始事务  session.beginTransaction();  // 参数即为实体对象  session.save(p);  // 提交事务 rollback()回滚事务  session.getTransaction().commit();  // 5. 释放资源  session.close();  sf.close(); } 

掌握 HibernateUtil 的工具类

理解同一个线程要使用同一个 session 对象的实现方式

import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil {   private static Configuration cfg;  private static SessionFactory sf;  static {   try {   cfg = new Configuration().configure(); sf = cfg.buildSessionFactory();  } catch (HibernateException e) {   e.printStackTrace();  }  }  private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();  /**  * 同一个线程要使用同一个session对象  *  * @return  */  public static Session getSession() {   Session session = threadLocal.get();  if (session == null) {   // ***次调用,线程中还没有session,这时创建新的session对象  session = sf.openSession();  threadLocal.set(session);  }  return session;  }  public static void closeSession() {   Session session = threadLocal.get();  if (session != null) {   session.close(); // 关闭session  threadLocal.remove(); // 并从当前线程清除此session  }  } } 

使用 jUnit 来进行单元测试

它是一种单元测试工具junit类中的方法都可以作为程序入口点, 要添加@Test注解到方法上

【本文是专栏作者张勇波的原创文章,亿华云计算转载请通过获取作者授权】

基本
滇ICP备2023000592号-31