Hibernate简单学习记录

Hibernate配置
  • 首先Hibernate需要事先知道在哪里找映射信息。
    • == hibernate.properties == 或者 hibernate.cfg.xml文件
重要的属性
属性描述
hibernate.dialect这个属性使 Hibernate 应用为被选择的数据库生成适当的 SQL
hibernate.connection.driver_classJDBC 驱动程序类
hibernate.connection.url数据库实例的 JDBC URL
hibernate.connection.username数据库用户名
hibernate.connection.password数据库密码
hibernate.connection.pool_size限制在 Hibernate 应用数据库连接池中连接的数量
hibernate.connection.autocommit允许在 JDBC 连接中使用自动提交模式
使用 JNDI 和数据库应用程序服务器然后必须配置以下属性
属性描述
hibernate.connection.datasource在应用程序服务器环境中正在使用的应用程序 JNDI 名
hibernate.jndi.classJNDI 的 InitialContext 类
hibernate.jndi.在 JNDI的 InitialContext 类中通过任何你想要的 Java 命名和目录接口属性
hibernate.jndi.url为 JNDI 提供 URL
hibernate.connection.username数据库用户名
hibernate.connection.password数据库密码
一般情况下hibernate.cfg.xml在应用程序的根目录创建

例子:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
   <property name="hibernate.dialect">
      org.hibernate.dialect.MySQLDialect  //MySQL方言属性
   </property>
   <property name="hibernate.connection.driver_class">
      com.mysql.jdbc.Driver
   </property>

   <!-- Assume test is the database name -->
   <property name="hibernate.connection.url">
      jdbc:mysql://localhost/test
   </property>
   <property name="hibernate.connection.username">
      root
   </property>
   <property name="hibernate.connection.password">
      root123
   </property>


	<property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
       <!-- 
             1:每次在创建sessionFactory时执行创建表,当调用sessionFactory的close方法的时候,删除表
              #hibernate.hbm2ddl.auto create-drop
            
            2:每次都重新建表,如果已经存在就先删除再创建
             #hibernate.hbm2ddl.auto create
          
           3:如果表不存在就创建,表存在就不创建
            #hibernate.hbm2ddl.auto update
           
            4:生成环境时候执行验证,当映射文件的内容与数据库表结构不一样的时候就报错
             #hibernate.hbm2ddl.auto validate
          --> 
   <!--加载映射文件,可以有多个,写全路径 -->
   <mapping resource="类名.hbm.xml"/>

</session-factory>
</hibernate-configuration> 
Session:用于获取与数据库的物理连接

Session的主要功能是为映射实体类的实例提供创建、读取、删除操作。
创建session对象

public class HibernateUtil {
	//Hibernate4创建session对象
	public static Session getSession4() {
		Session session = null;
		// 创建一个读取主配置文件的对象
		Configuration cfg = new Configuration();
		// 读取主配置文件
		cfg.configure();
		// 在4.x版中创建sessionfactory时,需要传入一个参数serviceRegistry
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
				.buildServiceRegistry();
		// 创建Session工厂
		SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
		// 打开Session
		// session = factory.openSession();
		// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出session
		session = factory.getCurrentSession();
		return session;
	}
	//Hibernate5创建session对象
	public static Session getSession5() {
		Session session = null;
		// 创建一个读取主配置文件的对象
		Configuration cfg = new Configuration();
		// 读取主配置文件
		cfg.configure();
		// 创建Session工厂
		SessionFactory factory = cfg.buildSessionFactory();
		// 打开Session
		// session = factory.openSession();
		// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出session
		session = factory.getCurrentSession();
		return session;
	}

}	

一些常见的Session接口方法

方法说明
Transaction beginTransaction()开始工作单位,并返回关联事务对象
void cancelQuery()取消当前的查询执行
void clear()完全清除该会话
Connection close()通过释放和清理 JDBC 连接以结束该会话
Criteria createCriteria(Class persistentClass)为给定的实体类或实体类的超类创建一个新的 Criteria 实例
Criteria createCriteria(String entityName)为给定的实体名称创建一个新的 Criteria 实例
Serializable getIdentifier(Object object)返回与给定实体相关联的会话的标识符值
Query createFilter(Object collection, String queryString)为给定的集合和过滤字符创建查询的新实例
Query createQuery(String queryString)为给定的 HQL 查询字符创建查询的新实例
SQLQuery createSQLQuery(String queryString)为给定的 SQL 查询字符串创建 SQLQuery 的新实例
void delete(Object object)从数据存储中删除持久化实例
void delete(String entityName, Object object)从数据存储中删除持久化实例
Session get(String entityName, Serializable id)返回给定命名的且带有给定标识符或 null 的持久化实例(若无该种持久化实例)
SessionFactory getSessionFactory()获取创建该会话的 session 工厂
void refresh(Object object)从基本数据库中重新读取给定实例的状态
Transaction getTransaction()获取与该 session 关联的事务实例
boolean isConnected()检查当前 session 是否连接
boolean isDirty()该 session 中是否包含必须与数据库同步的变化
boolean isOpen()检查该 session 是否仍处于开启状态
Serializable save(Object object)先分配一个生成的标识,以保持给定的瞬时状态实例
void saveOrUpdate(Object object)保存(对象)或更新(对象)给定的实例
void update(Object object)更新带有标识符且是给定的处于脱管状态的实例的持久化实例
void update(String entityName, Object object)更新带有标识符且是给定的处于脱管状态的实例的持久化实例
Hibernate 映射文件

对象/关系型映射 一般定义在XML文件中
需要以== className.hbm.xml ==格式保存映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
   <class name="映射的类名" table="表名">
      <meta attribute="class-description">
         //对此类的描述 meta标签可不写
      </meta>
      //<id>标签关联主键
      <id name="类属性名" type="映射的java类型" column="表主键名">
      //生成主键   native自行判断生成方式
         <generator class="native"/>
      </id>
      //<property>匹配Java类属性和数据库表的列
      <property name="类属性名" column="表列名" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
   <!-- 
           set集合属性的映射:重点消化
           name指定要映射的set集合的属性
           table集合属性要映射的表
           key指定集合表(t_address)的外键字段
           element指定集合表的其他字段
           type元素类型,一定要指定
     -->
     <set name="address" table="t_address">
             <key column="uid"></key>
             <element column="address" type="string"></element>
      </set>
       <!-- 
              List集合属性的映射
              name指定要映射的list集合的属性
              table集合属性要映射的表
              key指定集合表(t_addressList)的外键字段
              element指定集合表的其他字段
              type元素类型,一定要指定
              list-index是list集合一定要指定的,指定排序列的名称,因为list是有序的
        -->
        <list name="addressList" table="t_addressList">
             <key column="uid"></key>
             <list-index column="idx"></list-index>
             <element column="address" type="string"></element>
        </list>
          
        <!-- 
             Map映射
                  name指定要映射的map集合的属性
                  table集合属性要映射的表
                  key指定集合表(t_addressMap)的外键字段
                  element指定集合map的其他字段value
                  type元素类型,一定要指定
                  map-key指定map的key
         -->
         <map name="addressMap" table="t_addressMap">
              <key column="uid"></key>
              <map-key type="string" column="shortName"></map-key>
              <element type="string" column="address"></element>
         </map>
         <-- 
             这里一共四个表
             1.和java实体类对应的表
             2.和set集合对应的表
             3.和list集合对应的表
             4.和map集合对应的表
         -->
</hibernate-mapping>
关系映射

many-to-one

<!--
	多对一:假设表A是多,B是一
	B的实体类是BOne
	A的实体类是AMany
	a中有个属性BOne
-->
<many-to-one name="BOne" class="B实体类全路径" column="A表外键"/>

one-to-many

<!-- 
	一对多:假设A是一,B是多
	A表实体类是AOne
	B表实体类是BMany
	B表中有个属性Set<AOne> aOnes
-->
<set name="aOnes">
	<key column="B外键">
	<one-to-many class="AOne类全名"/>
</set>

many-to-many

<!-- 
表A实体类AMany
表B实体类BMany
每个实体类都有对方的一个Set<>属性
-->
<set name=" Set的属性名 " table="中间表">
	<key column="当前对象中对应中间表的外键名称">
	<many-to-many class="对方类的全路径" column="对方类在中间表中的外键名称"/>
</set>
Hibernate注释

启动注释需要三个包:

  • hibernate-annotations.jar,
  • lib/hibernate-comons-annotations.jar
  • lib/ejb3-persistence.jar
注释含义
@Entity标志这个类是一个实体bean,所以它必须含有一个没有参数的构造函数并且在可保护范围是可见的。
@Table提供了四个属性,允许覆盖的表的名称,目录及其模式,在表中可以对列制定独特的约束
@Id自动确定最合适的主键生成策略
@GeneratedValue覆盖主键自动生成策略(有两个属性strategy和generator,也可不写)
@Column指定映射关系(name:指定列名,length:设置大小,nullable:列可以被标记为非空,unique:唯一约束)
Hibernate查询语句

Query对象也就是查询对象,通过query.list()得到结果。

  • FROM 语句;在存储中加载一个完整并持久的对象
    • String hql = “FROM Employee”;
      Query query = session.createQuery(hql);
      List results = query.list();
    • String hql = “FROM com.hibernatebook.criteria.Employee”;
      Query query = session.createQuery(hql);
      List results = query.list();
  • SELECT 语句比from 语句提供了更多的对结果集的控制
    • String hql = “SELECT E.firstName FROM Employee E”;
      Query query = session.createQuery(hql);
      List results = query.list();
  • WHERE 语句;精确地从数据库存储中返回特定对象
    • String hql = “FROM Employee E WHERE E.id = 10”;
      Query query = session.createQuery(hql);
      List results = query.list();
  • ORDER BY 语句
  • GROUP BY 语句
  • 使用命名参数
    *String hql = “FROM Employee E WHERE E.id = :employee_id”;
    Query query = session.createQuery(hql);
    query.setParameter(“employee_id”,10);
    List results = query.list();
  • UPDATE 语句
  • DELETE 语句
  • 标准查询
    • Criteria cr = session.createCriteria(Employee.class);
      List results = cr.list();
  • 对标准的限制:使用 Criteria 对象可用的 add() 方法去添加一个标准查询的限制。
    • Criteria cr = session.createCriteria(Employee.class);
      cr.add(Restrictions.eq(“salary”, 2000));
      List results = cr.list();
缓存
  1. 一级缓存Session
  2. 二级缓存
  3. 查询层次缓存
  4. 并发策略
拦截器

直接实现 Interceptor 类或者继承 EmptyInterceptor 类
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值