Hibernate(jdbc冬眠—数据库细节看不到了)数据层框架
一、基本配置
- 创建vo类
- 导包:数据库驱动包,hibernate核心包,第三方jar包
- 配置文件:hibernate\project\etc\hibernate.cfg.xml
属性:hibernate.properties
log4j:log for java - 实体类配置文件hibernate-distribution-3.6.10.Final\project\hibernate-testsuite\src\test\resources\org\hibernate\test\annotations\Ferry.hbm.xml
- 配置文件引入mapping标签:resource
(如果断网状态,手动关联dtd文件,dtd文件在hibernate-distribution-3.6.10.Final\project\hibernate-core\src\main\resources\org\hibernate目录下,添加到src目录,window>preferences>xml>xml catalog>)
二、建表
- 创建test类
- 加载配置文件
Configuration cfg=new Configuration().configure(); - 创建输出表
SchemaExport export=new SchemaExport(cfg);//根据配置文件,输出计划
export.create(true, true);//是否显示sql语句,是否覆盖原内容
(版本问题,2.0读取.properties,3.0读取.xml,4.0注解)
三、实现增删改查
1.创建JUnit Test Cate
2.写增删改查方法
a.创建对象,传递参数
b.读取配置文件
c.创建session工厂对象,创建session对象
d.创建session对象,添加事务处理Transaction:
开启事务-增删改查-事务提交-事务回滚-关闭
查看sql语句,hibernate.cfg.xml配置文件增加属性,show_sql,format_sql
四、ORM(Object/Relation Mapping)对象/关系 映射
Hibernate
优点:
提高了开发效率
使开发更具对象化
使应用具有可移植性
轻量级框架,无需继承任何父类,无侵入性
缺点:
不使用数据库的特性语句,使调优困难
不适用于大批量的数据更新
不适用于大量的统计查询
Hibernate的基本组件
Hibernate的核心接口
Hibernate的对象
1.Configuration类负责配置
a.XML文件(hibernate.cfg.xml)3.0
Configuration cfg=new Configuration().configure();
b.属性文件(hibernate.properties)
Configuration cfg=new Configuration();
2.SchemaExport(输出设计表)
SchemaExport export=new SchemaExport(cfg);
export.create(true,true);是否显示sql语句,是否覆盖原来的内容
3.SessionFactory(会话工厂)
SessionFactory factory=cfg.buildSessionFactory();
4.Session代表应用与数据库系统的一次操作
Session session=factory.openSession();
session.close();
5.Transaction事务
五、基本映射
vo类映射文件
表名table
字段column 长度length
字段唯一not-null=”true”
字段不为空unique=”true”
六、主键映射
generator主键生成策略
- 由数据库提供主键生成机制:identity(MySQL,SQL Server),sequence(Oracle)
- 由外部程序提供主键生成机制:increment(递增),uuid(IP地址+JVM的启动时间(精确到1/4秒)+系统时间+一个计数器值(在JVM中唯一)),hilo(高低位算法,使用指定的表),seqhilo(高低位,使用序列)
- native(数据库生成,即identity或sequence),assigned(手工生成),foreign(引用别的类的id)
七、持久化对象的生命周期
新建HibernateUtil工具类优化代码
- private static SessionFactory factory;
- static{}
- 返回session对象
- 关闭session
瞬时状态,持久状态,脱管状态
八、get和load
get任何情况都会发sql语句
load用到对象才会发sql语句
load支持lazy loading延迟加载
企业中,应用服务器与数据服务器是分离的在不同的机器中,跨机器操作开销很大,用load节省资源
九、many2one
User实体类加属性:private Company company;
User配置文件加属性:<many-to-one name=”company” column=”com_id” cascade=”save-update”/>
级联:保存用户信息,顺便保存公司信息
(级联的四个属性:save-update,delete,all,none)
Test类中加company属性
十、one2many
Company类添加Set<User> users属性
Company配置文件加属性:
<set name=”users”/>属性
<key column=”com_id”/>字段
<one-to-many class=”vo/User”/>类
保存班级信息,先保存学生信息,防止瞬时状态异常
用for(User u:Users){}输出学生信息
(一对多效率比较低,可以添加翻转属性inverse=”true”,由学生类控制维护,相当于转换成多对一)
十一、many2many
十二、查询机制
标准化对象查询(Criteria Query)×很少
Hibernate查询语言(Hibernate Query Language,HQL)用得最多
Native SQL Queries(原生SQL查询)
HQL支持所有的关系数据库操作
连接(Joins,包括inner/outer/full joins)
投影(Projection)
聚合(Aggregation,如max,sum)和分组(Group)
排序(Ordering)
子查询(Subqueries)
调用原生SQL函数(SQL function calls)
HQL分页查询
List students=session.createQuery(“from Student”)
.setFirstResult(1) //起始记录位置,从0开始计数
.setMaxResults(2) //返回的记录个数
.list();
update与delette
update:
Query query =session.createQuery
(“update Student set name=’zhang’ where name=’Zhang’ ”);
query.executeUpdate();
delete:
session.createQuery(“delete Student where name=’Zhang’ ”).executeUpdate();
只支持insert into…select…形式,不支持insert into…values…形式
原生SQL查询
session.createSQLQuery(“selete *from t_student”).list();
返回List<Object[]>
十三、一级缓存
在一个session内,打开与关闭之间来查。用得比较少,效率低。
十四、二级缓存
跨session的缓存
热门评论
第五部分字段唯一和字段不为空写反了
大哥,第五部分“字段唯一:unique=true”,“字段不为空:not-null=true”,你写反了-_-#