附上链接:Hibernate单表映射 点击打开链接
第1章 Hibernate初识(一)
1. 什么是ORM
?ORM(Object Relationship Mapping) 对象关系映射。
利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是要编写很多和底层数据库相关的SQL语句
2. 为什么要用hibernate的ORM框架技术,用原始的SQL方式的有什么局限性?
1. 不同的数据库使用的SQL语法不同。比如:PL/SQL与T/SQL
2. 同样的功能在不同的数据库中有不同的实现方式。比如分页SQL。
3. 程序过分依赖SQL对程序的移植及扩展、维护带来很大的麻烦。
3. Hibernate是java领域的一块开源的ORM框架技术。
Hibernate对JDBC进行了非常轻量级的对象封装。
封装JDBC,让其程序员尽可能的少些SQL语句
4.@·hibernate.cfg.xml常用配置
hibernate.cfg.xml常用配置
(1)hibernate.show_sql 编码阶段便于测试
(2)hibernate.format_sql 排版问题,建议设置为true
(3)hbm2ddl.auto 可以帮助由 java代码生成数据库脚本,进而生成具体的表结构。create|update|create-drop|validate
(4)hiberante.default_schema 默认的数据库
(5)hibernate.dialect 配置Hibernate数据库方言
hiberante的前缀可以省略,即:hibernate.dialect等同于dialect
其中:1、create:先删除原有的表,然后重新生成。
2、update:不会删除原有的表,在原有的基础上继续操作。
5.configuration:读取配置文档
sessionFactory:对象关系映射文件
session:操作数据库的对象,类似于JDBC中的connection
session的方法:save,delete,update,createQuery()
Transaction:commit
session和connection:多对一关系,一个connection服务多个session,每个session都有与之对应的connection
1.不建议直接使用jdbc的connection操作数据库,而是通过session操作数据库。
2.session可以了解为操作数据库的对象,操作数据库之前必须先获取session的实例
3.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
4.把对象保存到关系数据库中需要调用session的各种方法:save(),update(),delete(),createQuery
6.transaction 事物
hibrenate操作都是封装在事物中,并且默认是非自动提交方式,所以session保存对象时,如果不开启事物,并且手工提交事物,对象并不会真正保存在数据库中
打开session后,必须提交事务(Transaction),否则数据不会真正保存在数据库中<br>
不使用事务的自动提交方式,记得用session.flush()来输出sql语句,否则添加不成功
beginTransaction,commit(可用session.doWork(new Work(){}))方法来实现<br>
session.flush():输出sql语句(注意:通常并不推荐这样做)
7.
openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;
getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 ;
一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;
如何获得session对象???
(1)openSessionion
(2)getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
8.openSession与getCurrentSession的区别:
(1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSesssion需要你手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出!
(2)openSession每次创建新的session对象,getCurrentSession使用现有的session对象
openSession与getCurrentSession
openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;
getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 ;
一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;
9.User.hbm.xml常用配置【】
<hibernate-mapping
schema="schemaName" //模式的名字
catalog="catalogName" //目录的名称
default-cascade="cassade_style" //级联风格 @
default-access="field/property/CalssName" //访问策略 @
default-lazy="true/false" //加载策略 @
package="packagename" //默认包名
/>
<class
name="ClassName" //对应映射的类
table="tableName" //对应映射数据库的表
batch-size="N" //抓取策略,一次抓取多少记录
where="condition" //条件 eg:抓取条件
entity-name="EntiyName" //如果需要映射多张表
/>
<id //表的主键
name="propertyName" //对应的属性
type="typeName" //对应类型
column="column_nam" //映射数据库中表当中字段名的名称
length="length" //指定长度
<generator class="generatorClass"/> //主键生成策略 @
/>
10.单一主键:
(1)assigned 由java应用程序负责生成(手工赋值)
(2)native 由底层数据库自动生成标示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等
Ps1:assigned注意:如果实体类中设置的主键id是基本类型int的话,则可以不用赋值,系统默认值为0;如是引用类型Integer话,则默认值为null,不赋值系统则报错。
Ps2:native注意:系统会自动选择该数据库对应的自动增值方式,从1开始。即使手动给他赋值,也不会起作用,但也不会报错。
11.
一个用Jubit单元测试,进行注解!
//用Junit单元测试,进行注解
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//打开会话
session=sessionFactory.openSession();
//打开事务
transaction=session.beginTransaction();
}
@After
public void destory(){
//提交事务
transaction.commit();
//关闭会话
session.close();
//关闭会话工厂
sessionFactory.close();
}
@Test
public void testSaveStudenets(){
Students s=new Students(1,"张三","男",new Date(),"重庆");
session.save(s);//保存对象进入数据库
}