Hibernate个人理解与使用

Hibernate的介绍

  • dao层的框架,全自动化的ORM框架。
  • 优势
    完全面向对象化(对于sql语句的可控性不强)
    开发效率高
    方便数据库移植
    支持缓存机制

Hibernate的入门搭建

  • 创建项目导入依赖包
    required文件中的包+mysql的驱动包
    在这里插入图片描述加入配置文件

  • 全局文件:数据源,映射文件,方言

<?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="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibdata</property>
        <property name="connection.username">root</property>
        <property name="connection.password">****</property>


        <!-- SQL方言 -->
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        
        <!--  控制台显示sql -->
        <property name="show_sql">true</property>
        <!-- 格式化sql -->
        <property name="format_sql">true</property>
        
        <!-- 管理映射文件 -->
        <mapping resource="com/fly/bean/News.hbm.xml"/>

    </session-factory>

</hibernate-configuration>
  • 映射文件:数据库表和实体以及表中列和实体属性的对应关系
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
        SYSTEM
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.fly.bean">
    <!-- name:实体名,table:表名 -->
    <class name="News" table="news">
        <!-- id:完成实体中和表中主键的映射
            name:实体中主键的属性名
            column:表中主键的列名 -->
        <id name="nid" column="nid">
            <!-- 主键的增长方式 -->
            <generator class="native"/>
        </id>

        <!--property:完成实体中和表中非主键的映射
            name:实体中的属性名
            column:表中的列名 
            type:属性的类型-->
        <property name="title" column="title" type="string"/>
        <property name="content" column="content" type="string"/>
        <property name="photo" column="photo" type="string"/>

    </class>

</hibernate-mapping>
  • 解析配置文件
    解析配置----SessionFactory----Session----curd
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class App {
   public static void main(String[] args) {
	  //解析全局配置文件 
	  Configuration configure = new Configuration().configure("com/offcn/bean/hibernate.cfg.xml");
      //获取SessionFactory会话工厂
	  SessionFactory sf = configure.buildSessionFactory();
	  //获取Session会话
      Session session = sf.openSession();
      //调用根据主键查询的方法
      News news = session.get(News.class, 3);
      System.out.println(news);
      session.close();
   }
}

Hibernate中session.get()和session.load()的区别

两个方法都是用来从数据库获取对象,只不过实现机制不一样而已。
get:当查询的数据不存在返回null,在调用get方法时会立即从数据库查询
load:当查询的数据不存会抛出异常,在调用load方法时不会立即从数据库查询,在使用非之间属性时才去从数据查询(延时)

Hibernate常用的两种查询方式

Query查询

Query查询:(query对象的api方法:list,uniqueResult,executeUpdate)
hql语句的语法:from 类名 where 属性名=值

   @Test
   public void getAll() {
	  String hql=" from News";
	  Query q = session.createQuery(hql);
	  List<News> nlist = q.list();
	  System.out.println(nlist);
   }
   
   //默认将查询的列放到一个一个数组里,而不是一个对象里
   @Test
   public void getAll1() {
	  String hql="select nid,title from News";
	  Query q = session.createQuery(hql);
	  List<Object[]> nlist = q.list();
	  System.out.println(nlist.get(0)[0]+"----"+nlist.get(0)[1]);
   }
   
   //如果要查询某些列,同时将这些列的值赋值到一个对象里,需要类的有参构造方法
   @Test
   public void getAll2() {
	  String hql="select new News(nid,title) from News";
	  Query q = session.createQuery(hql);
	  List<News> nlist = q.list();
	  System.out.println(nlist.get(0).getNid()+"----"+nlist.get(0).getTitle());
   }
   
   @Test
   public void getById() {
	  String hql="select new News(nid,title) from News where nid=3";
	  Query q = session.createQuery(hql);
	  List<News> nlist = q.list();
	  System.out.println(nlist.get(0).getNid()+"----"+nlist.get(0).getTitle());
   }
   
   /*
    * hql语句中占位符的使用
    * ?------q.setParameter(索引, 值)
    * :变量名---- q.setParameter(变量名, 值);
    */
   @Test
   public void getById1() {
	  String hql="select new News(nid,title) from News where nid=? and title like ?";
	  Query q = session.createQuery(hql);
	  q.setParameter(0, 3);
	  q.setParameter(1, "%五%");
	  List<News> nlist = q.list();
	  System.out.println(nlist.get(0).getNid()+"----"+nlist.get(0).getTitle());
   }
   
   @Test
   public void getById2() {
	  String hql="select new News(nid,title) from News where nid=:nnid and title like :ti";
	  Query q = session.createQuery(hql);
	  q.setParameter("nnid", 3);
	  q.setParameter("ti", "%五%");
	  List<News> nlist = q.list();
	  System.out.println(nlist.get(0).getNid()+"----"+nlist.get(0).getTitle());
   }
   //通过hql语句完成删除
   @Test
   public void geByTitle() {
	 String hql="delete from News where title=?";
	 Query q = session.createQuery(hql);
	 q.setParameter(0, "gffh");
	 int row=q.executeUpdate();
	 System.out.println(row);
	 session.beginTransaction().commit();
   }
//通过hql语句完成更新
   @Test
   public void updByTitle() {
	 String hql="update News set content=? where title=?";
	 Query q = session.createQuery(hql);
	 q.setParameter(0, "的客户看的好附件是");
	 q.setParameter(1, "jintian");
	 int row=q.executeUpdate();
	 System.out.println(row);
	 session.beginTransaction().commit();
   }

Criteria查询

(list,uniqueResult)

   @Test
   public void getAllBycriteria() {
	  Criteria cc = session.createCriteria(News.class);
	  cc.add(Restrictions.eq("title", "标题"));
	  List<News> nlist = cc.list();
	  System.out.println(nlist);
   }
   
   @Test
   public void getByIds() {
	  Criteria cc = session.createCriteria(News.class);
	  cc.add(Restrictions.in("nid", 1,3,4,5,6));
	  List<News> nlist = cc.list();
	  System.out.println(nlist);
   }
   
   @Test
   public void getByTitleLike() {
	  Criteria cc = session.createCriteria(News.class);
	  cc.add(Restrictions.like("title", "%周五%"));
	  List<News> nlist = cc.list();
	  System.out.println(nlist);
   }
   
   @Test
   public void getByTileAndNid() {
	  Criteria cc = session.createCriteria(News.class);
	  cc.add(Restrictions.like("title", "%jint%"));
	  cc.add(Restrictions.idEq(4));
	  News news = (News) cc.uniqueResult();
	  System.out.println(news);
   }

主键的增长方式:
identity:数据库有主键自增功能的数据库可用这种方式,由数据库完成主键的自增,主要用于mysql或者sqlServer.
sequence:主要用于支持序列功能的数据库,例如DB2,oracle.
native:若连接的是含有主键自增功能的数据库,那么由数据库完成主键的自增;如链接的是序列功能的数据库,由序列完成主键自增。
increment:主键的自增由Hibernate 框架完成。在内存中获取主键的最大值,加1(mysql,oracle).
assigned:主键是由程序生产的。(mysql,oracle)
foreign:使用另外一个相关联的对象的主键作为该对象主键,主要用于一对一关系中。

Hibernate中对象的三状态

临时状态:采用new关键字创建的对象,该对象未与Session发生关联(未调用
Session的API)。也叫临时对象。临时状态的对象会被Java的垃圾回收机制回收。
持久状态:实体对象与Session发生关联(调用了Session的get、load、save、update等API)。也叫持久对象,持久状态的对象在被修改后是不需要调用更新方法,直接提交即可。
游离状态:原来是持久状态,后来脱离了Session的管理。如:Session被关闭,对象将从持久状态变为游离状态,同时垃圾回收机制可以回收掉,不再占用缓存空间了。
在这里插入图片描述

缓存机制

一级缓存:不需要做任何设置,Session级别的。只能在使用自己的一级缓存,不同的Session对象不可以共享一级缓存。
二级缓存:Sessionfactory级别的。由同一个SessionFactory创建的多个不同的Session对象,可以共享二级缓存区域的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值