1.Hibernate是dao层的框架,全自动化的ORM框架。
主键的增长方式
* identity:
适用于MySQL、DB2、MS SQL Server,
采用数据库生成的主键,用于为long、short、int类型生成唯一标识;
* sequence:
DB2、Oracle均支持的序列,用于为long、short或int生成唯一标识;
* native:
对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用);
* increment:
这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate生成的,所以只能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用;
* assigned:
由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况
* foreign:
使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。
2.特点
1.完全面向对象开发,自动生产sql语句(sql语句不可控,不方便优化)
2.对于数据库的移植性强
3.支持缓存机制
-
Hibernate工作流程
Mybaitsd工作流程:加载全局配置------>sqlSessionFactory---->sqlSession-----statement Mapper Hibernate工作流程:加载全局配置------>SessionFactory---->Session-----statement Mapper
4. Hiberate搭建入门环境
1. 数据库表创建以及实体类
public class News {
private int nid;
private String title;
private String content;
private String photo;
}
2. 加入jar lib\required 下所有 jar包 以及mysql的驱动包
3. 配置文件(全局配置+映射文件)
* 全局配置(数据源,映射,方言)hibernate.cfg.xml
<?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/hibernate01</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- SQL dialect sql方言-->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 控制台打印sql以及格式化sql -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!--映射文件 -->
<mapping resource="com/demos/bean/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
* 映射文件 News.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
SYSTEM
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<!--package:实体类所在的包名,可以省略,省略后class里的类名写全路径(包名+类名) -->
<hibernate-mapping package="com.demos.bean">
<!-- name:指定类名 ,table:实体类对应的数据库表名-->
<class name="News" table="nesw">
<!--id:主键,name:类中主键对应的的属性名,column:表里主键的列名 -->
<id name="nid" column="nid">
<!-- 设置主键的增长方式 -->
<generator class="native"/>
</id>
<!-- column省略不写,默认和属性名一致,type:指定列或者属性的类型,有三种指定方式(属性类型,hibernate 提供的类型,数据库列的类型) -->
<property name="title" type="string"/>
<property name="content" column="content" type="java.lang.String"/>
<!-- <property name="photo" column="photo" type="java.lang.String"/> -->
<property name="photo">
<column name="photo" sql-type="varchar"></column>
</property>
</class>
</hibernate-mapping>
* 解析配置文件并测试
public class App {
public static void main(String[] args) {
//加载全局配置文件
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sf = configure.buildSessionFactory();
Session session = sf.openSession();
News news = session.get(News.class, 4);//根据主键查询
System.out.println(news);
session.close();
}
}
CRUD 操作
Session session;
@Before
public void startUp() {
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sf = configure.buildSessionFactory();
session = sf.openSession();
}
/*
* OID查询(根据主键查询) get:在查询不存在数据时,会返回null
* load:在查询不存在数据时,会异常,有延迟作用,不会立即执行sql语句,而是在获取主键之外的其他属性时才会执行SQL语句
*/
// 根据主键查询
@Test
public void getNewsByNid() {
News news = session.load(News.class, 4);// 根据主键查询
System.out.println(news.getNid());
System.out.println(news.getTitle());
session.close();
}
// 保存
@Test
public void saveNews() {
News n = new News();
n.setTitle("大新闻");
n.setContent("70周年");
n.setPhoto("d://no.png");
session.save(n);
session.getTransaction().commit();
session.close();
}
// 更新
@Test
public void updateNews() {
News n = new News();
n.setNid(12);
n.setTitle("爆炸新闻");
n.setContent("70周年");
n.setPhoto("d://no.png");
session.update(n);// 根据主键更新
session.beginTransaction().commit();
session.close();
}
// 删除
@Test
public void delNews() {
News n = new News();
n.setNid(12);
session.delete(n);
session.beginTransaction().commit();
session.close();
}