Hibernate基础
2016-06-07 10:12
453 查看
HIBERNATE
1、HIBERNATE 概述
JDBC主要解决的是数据持久化问题,也即数据的永久保存问题。 HIBERNATE也是解决持久化问题的,如果按分层开发来实现的话,HIBERNATE解决的是DAO层相关问题。 也即HIBERNATE 是对JDBC的封装 持久化相关技术:JDBC、DBUTILS框架、HIBERNATE框架、MYBATIS框架。 这些技术中 HIBERNATE框架相对更好,功能最强大,封装程度最高。 但是HIBERNATE效率相对较慢,如果数据量超过500万条,请选择其他技术。 HIBERNATE存在的必要性: 1、java程序员操作的是对象,而当今主流的数据库都是关系型数据库, 所以java程序员都是拿着对象,而底层操作的是关系数据库。操作数据库SQL语句实际相当于面向过程的、 2、对象关系映射,因此需要解决对象与关系的映射问题。 ORM(OBJCET RALATIONSHIP MAPPING) 对象关系映射是HIBERNATE精华 一个类映射到一张表 类中的属性映射为表中的字段 一个对象映射为表中的一条记录 在HIBERNATE中为体现这种映射就需要专门的配置文件(实体类名.hbm.xml) HIBERNATE优点: 1、程序员不需要关注SQL语句 2、程序员不需要关注数据封装
2、HIBERNATE 下载
下载hibernate: hibernate官方网站:http://hibernate.org/orm/ 下载hibernate5: http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download
3、介绍包结构
4、准备工作
1、准备hibernate 开发时所必须的jar包 2、准备hibernate 所需要的配置文件 默认配置文件名 hibernate.cfg.xml. a.找到dtd约束文件 b.打开对应的dtd文件,得到响应的引入信息,复制到hibernate.config.xml文件 c.找到hibernate.properties 文件,根据里面所需要的信息,配置hibernate.config.xm文件 d.<hibernate-configuration> <!--会话工厂元素 --> <session-factory> <!--配置数据库连接字符串 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_26</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 配置hibernate 方言 --> <!--方言是指hibernate 底层SQL语句使用的什么样的SQL语句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--配置显示sql语句 --> <property name="hibernate.show_sql">true</property> <!--格式化显示sql,使SQL语句更美观 --> <property name="hibernate.format_sql">true</property> <!--指定加载映射文件 配置文件路径默认为类路径 总结下,配置路径的写法详细 --> <mapping resource="Customer.hbm.xml" /> <!-- 自动建表属性--> #hibernate.hbm2ddl.auto create-drop 先删除再创建 (测试程序是否可用) #hibernate.hbm2ddl.auto create (测试人员) #hibernate.hbm2ddl.auto update (开发人员) 更新表结构 ,只加列,不删除列 #hibernate.hbm2ddl.auto validate (校验映射文件是否正确) none不更新表结构 <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration> --插入配置文件信息图 3、准备hibernate 相关的映射文件 a.先准备实体类(域模型) b.准备配置文件类名.hbm.xml c.配置相关信息 d.在配置文件中加载映射文件 4、HIBERNATTE 主键生成策略 记住 <!-- 主键的生成增长策略 identity:mysql的自增效果 sequence:Oracle 序列 native:根据本地数据库来决定,使用自增还是序列 assigned:程序员自己指定主键id uuid:根据uuid来自动生成随机主键 increment:在原有主键取值的基础上+1 -->
5、HIBERNATE开发步骤
//1 加载并解析hibernate 配置文件,默认加载的是hibernate.cfg.xml文件 //hibernate配置文件名称可以任意定义,只需要在new Configuration().configure("配置文件路径") Configuration config = new Configuration().configure(); //2 得到SesssionFactory对象 类似于连接池 sessionFactory = config.buildSessionFactory(); //3 得到Session 对象,类似于获取一个连接 session = sessionFactory.openSession(); //4 开启事务 transaction = session.beginTransaction(); //5 执行 curd操作 Customer customer = new Customer(); //5.1 封装数据 customer.setCustName("刘玄德"); session.save(customer); //6 提交或回滚事务 transaction.commit(); //7 关闭session ,sessionFactory 释放资源 session.close(); sessionFactory.close();
6、API详解
6.1 log4j.jar1、在项目中加入log4j.jar,用于记录日志的。同时加入log4j.properties配置文件 加入它们的主要目的就是为了日志信息的记录。 2、hibernate使用的连接池为自定义连接池,可以替换为c3p0连接池 导入c3p0的jar包 更改hibernate.cffg.xml配置文件<property name="hibernate.connection.provider_class"> org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> 这样就可以使用c3p0连接池了
6.2 session接口
1、openSession() 永远都是从连接池取出一个连接 2、getCurrentSession() 从本地线程中取出连接 使用getCurrentSession()获取的连接,提交事务时,自动关闭连接 ,不需要手动关闭连接
6.3 Transaction API分析
代表事务,操作的方法,commit()代表提交,rollback()代表回滚 事务的隔离性,如果没有考虑,可能产生一些情况: 脏读 不可重复读 虚读 就可以设置一些隔离级别, READ UNCOMMITED 可以产生脏读 1 READ COMMITED 可以防止脏读 (Oracle) 2 REPEATABLE READ 可以防止脏读,不可重复读,虚读依然可以产生 (Mysql) 4 SERIALIZABLE 什么都防 8 配置文件中进行配置 <property name="hibernate.connection.islation">4</property> 丢失更新问题:解决方案如下: 锁机制(增删改本身带锁) 查询命令带锁:select * from customer for update;(悲观锁) Hibernate要解决这个问题,也可以使用乐观锁 在映射文件中,加入一个version版本字段,hibernate就会自动维护 同时在配置文件中进行配置 <version name="version"></version>
7 hibernate 数据检索的五种方式
五种查询数据的方式
7.1 get/load
只能通过主键查询,效率相对较高 get与load的区别
7.2 QBC查询 query by criteria
1、获取Obc查询对象 Criteria criteria = session.createCriteria(实体类.class) //添加条件进行查询 gt 大于 ge大于等于 le小于等于 lt小于 In and or like criteria.add(Restrictions.gt(列名,条件值)); //分页查询 pegeSize 每页个数 pageNumber 页码 criteria.setMaxResults(pageSize); criteria.setFirastResults(pageSize*(pageNumber-1)); //查询所有 List<实体类> list = criteria.list();
7.3 HQL查询(Hibernate Query Language)
相比于SQL查询,不需要关注表,只需要关注类和属性即可。 [Select 属性名] from 类名 where条件(属性=值1) //1获取HQL对象 Query query = session.createQuery(HQL语句); List<> list = query.list();
7.4 SQL查询(Hibernate Query Language)
//1 h获取SQL对象,同时将获取到的列绑定到对应的类的属性上 SQLquery sql = session.createSQLQuery(sql).addEntity(类名.class);
7.5 对象导航
需要用到多表关联操作,暂且不做。
相关文章推荐
- Bitmap copy 参数
- iOS Debug 速查表
- MD5加密
- java 获取mac地址
- springmvc mybatis maven 整合 事例
- 【PAT】【GPLT】【2016 天梯】 L1-019. 谁先倒
- 继承特性
- WINPE自启动脚本Winpeshl.ini 和Startnet.cmd
- python实现多线程的方式及多条命令并发执行
- css position, display, float 内联元素、块级元素
- 高并发性能提升和超卖的解决方案
- GAMIT 软件中 trackRT 模块的安装
- 【leetcode】191. Number of 1 Bits
- UniEAP Platform开发环境搭建
- c#转换ASCII,很不错
- 乐视乐2怎么恢复误删照片
- jQuery控制div实现随滚动条滚动效果
- UML类图几种关系的总结
- 笔记之解决ScrollView起始位置不是最顶部的问题
- java的if else语句入门