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对象,可以共享二级缓存区域的数据。