//1、加入相关jar包
//2、src下创建hibernate.cfg.xml文件
<session-factory>
//<!-- 数据库基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///h</property>
//<!-- Hibernate基本信息 -->
//<!-- Hibernate方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>//hibernate-release-4.3.9.Final\project\etc\hibernate.properties
//<!-- 执行操作时是否在控制台打印SQL -->
<property name="show_sql">true</property>
//<!-- 是否对SQL进行格式化 -->
<property name="format_sql">true</property>
//<!-- 自动生成数据表策略 -->
<property name="hbm2ddl.auto">update</property>//update更新不删除原有的列名,create删除原有的表重新创建,create-drop当sessionFactory
//一旦关闭表就自动删除
//<!-- 指定关联的hbm.xml文件 -->
<mapping resource="com/gmy/h1/News.hbm.xml"/>
//<!-- 配置C3P0数据源 -->
<property name="c3p0.max_size">2</property>
<property name="c3p0.min_size">2</property>
<property name="c3p0.timeout">5000</property>
<property name="c3p0.max_statements">100</property>
<property name="c3p0.idle_test_period">300</property>
<property name="c3p0.acquire_increment">2</property>
<property name="c3p0.validate">false</property>
</session-factory>
//3、写一个实体类
public class News {
private Integer id;
private String title;
private String author;
private Date date;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public News(String title, String author, Date date) {
super();
this.title = title;
this.author = author;
this.date = date;
}
public News() {
}
@Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", author=" + author
+ ", date=" + date + "]";
}
}
//4、生成News.hbm.xml映射文件
<class name="com.gmy.h1.News" table="NEWS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="title" type="java.lang.String">
<column name="TITLE" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" />
</property>
<property name="date" type="java.util.Date">
<column name="DATE" />
</property>
</class>
//5、写一个测试类
SessionFactory sessionFactory = null;
//创建Configuration获取配置信息和映射关系
Configuration configure = new Configuration().configure();
//创建ServiceRegistry对象任何配置都需要注册才生效
ServiceRegistry buildServiceRegistry = new ServiceRegistryBuilder().applySettings(configure.getProperties())
.buildServiceRegistry();
//创建SessionFactory对象
sessionFactory = configure.buildSessionFactory(buildServiceRegistry);
//创建Session对象
Session openSession = sessionFactory.openSession();
//开启事物
Transaction beginTransaction = openSession.beginTransaction();
//执行保存操作
News news = new News("Java","gmy",new Date(new java.util.Date().getTime()));
openSession.save(news);
//提交事务
beginTransaction.commit();
//关闭Session
openSession.close();
//关闭SessionFactory对象
sessionFactory.close();
//Session缓存(一级缓存)
//flush():使数据表中的记录和对象的状态保持一致,可能会发出对应的SQL语句
//1、如果数据没有变则不发送,如果改变,则发送SQL语句
//refresh():会强制发送SELECT语句,已使Session缓存中的对象的状态和数据表中对应的记录保持一致
//注意Hibernate的隔离级别
//clear():清理缓存
//隔离级别
//1、READ UNCOMMITED(读未提交)
//2、READ COMMITED(读已提交)
//4、REPEATABLE READ(可重复读)
//8、SERIALIZEABLE(串行化)
//<property name="connection.isolation">2</property> 默认为4
//持久化对象状态
//持久化状态
//临时状态
//游离状态
//删除状态
//游离状态
//News news = new News();
//news.setId(1);
//持久化状态
//News news = (News)session.get(News.class,1);
//对象状态转换图
get()
Load()
Query.list()
Query.uniqueResult()
Query.iterator()
Query.scoll() new 语句
//持久化状态 <--------------- //临时状态
| ^ save()
| | saveOrUpdate()
| | persist()
| | merge()
| |
| |
evict() | | update()
close() | | saveOrUpdate()
clear() | | merge()
| |
v |
delete()
//游离状态 -----------> //删除状态
//save()方法
//临时对象变为持久化对象,并为对象分配ID
//在save()方法前设置ID无效
//对于持久化对象的ID不允许修改
//persist()方法:
//save设置对象ID无效但是不抛出异常,而persist会抛出异常
//get()方法:
//获取一个对象
//get()和load()区别
//1、执行get方法会立即返回一个对象,而执行load方法,若不使用对象,则不会立即执行查询而返回一个代理对象
//2、如果数据表中没有对应的记录,get返回null,load,当使用对象时,抛出异常
//3、load方法可能会抛出懒加载异常
//update()方法
//1、更新持久化对象,不需要显示调用update方法,但事物提交时,会先执行session的flush方法
//2、更新游离对象时,需要显示调用session中的update方法,可以把游离对象变成持久化对象
//saveOrUpdate()方法
//游离对象则执行update,临时对象则执行save
//delelte()方法
//删除对象
//evict()方法
//从缓存中移除指定的持久化对象
//set:映射set类型属性
//inverse:指定由哪一方维护关联关系
//cascade:级联操作,不建议使用,建议手工
//order-by: 排序操作,order-by中存放的是列名
//注意
//单向一对多
//插入:单向一对多应该先插入多的一方,在插入一的一方
//删除:可以直接删除一的一方,直接删除多的一方会有异常,必须在一的一方设置级联删除<set cascade="delete">
//双向一对多
//双向一对多,让一的一方放弃维护关联关系<set inverse="true">
//设定集合是要将集合初始化,防止发生空指针异常
//一对一
//先保存没有外键的一方
//单向多对多
//注意懒加载异常
//双向多对多
//继承映射
//join-subclass
//union-subclas
//检索策略
//类级别
//立即检索:立即加载检索方法的指定对象
//延迟检索:延迟加载检索方法的指定对象
//检索方式
//导航对象图检索方式:根据已经加载的对象导航到其他对象
//OID检索方式:按照对象的OID来检索对象
//HQL检索方式:使用面向对象的HQL查询语言
//QBC检索方式:使用QBC API来检索对象
//本地SQL检索方式:使用本地数据库的SQL查询语句
//HQL分页
query.setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list()
//HQL命名查询
getNamedQuery();
//常见错误
错误:数据表无法生成
原因:注意检查映射文件的路径,还有Hibernate的方言配置,Hibernate可以自动见表,但是不能自动建数据库