Hibernate入门(一)
2018-06-18 03:45:46来源:未知 阅读 ()
-
O: Object对象,面向对象语言领域,Java中的JavaBean
-
R: 关系数据库领域的Relational(数据库中表的结构)
-
M: 映射Mapping(XML的配置文件)
二、Hibernate入门
1、下载Hibernate环境资源
http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download
2、Hibernate官网
http://hibernate.org/orm/
3、创建java项目,导入jar包
- 数据库驱动包
4、编写数据bean
- User.class
public class User { private Integer uid; private String uname; private int uage; public Integer getUid() { return uid;} public void setUid(Integer uid) {this.uid = uid;} ...... }
注意:
5、配置映射文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 导入约束 --> 3 <!DOCTYPE hibernate-mapping PUBLIC 4 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 5 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 6 <hibernate-mapping> 7 <!-- 一、class标签用于表示JavaBean和表的映射关系:name是类名(全限定名),table是数据库表的表名 --> 8 <class name="com.pri.bean.User" table="user"> 9 <!-- 1、id用来配置主键:name是JavaBean里的字段名,column是表中的主键列名 --> 10 <id name="uid" column="uid"> 11 <!-- 1.1 generator主键生成策略 --> 12 <generator class="native"></generator> 13 </id> 14 15 <!-- 2.配置普通的字段对应关系 --> 16 <property name="uname" column="uname"/> 17 <property name="uage" column="uage"/> 18 </class> 19 </hibernate-mapping>
? 1.命名规范问题:hibernate命名以类.hbm.xml方法命名。
? 2.新建位置规范:通常和java类放到同一个包中。
? 3.dtd头的导入:在 下的org/hibernate包中有对应的dtd头
? 4.在配置关系过程中,几乎所有的name属性指向的都是Java类,column和table指向数据库表。
6、配置核心文件hibernate.cfg.xml
在下载的资源包中有模板: hibernate-release-5.0.7.Final/project/etc/hibernate.cfg.xml
同一文件夹中:hibernate.properties文件则为相关属性及属性值说明,在配置相关属性时,可从中查找。
<?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> <!-- 一、必配项 --> <!-- 1.1 数据库的四个基本项 和 数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///test01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <!-- 二、选配项 --> <!-- 2.1 配置第三方连接池 需要导hibernate-release-5.0.7.Final/lib/optional/c3p0/中的jar包 --> <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <!-- 连接池最大连接数为 10个 -->
<property name="hibernate.c3p0.max_size">10</property>
<!-- 2.1 日志显示sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 日志格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- 2.3 配置是否由Hibernate生成表
? create-drop:每次都会创建一个新的表,执行程序结束后删除这个表.
? create:每次都会创建一个新的表.
? update:有(表, 列)就使用, 没有(表, 列)就创建
? validate:只会使用原有的表.对映射关系进行校验.
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 三、加载映射关系配置 --> <mapping resource="com/pri/bean/User.hbm.xml"/> </session-factory> </hibernate-configuration>
? hibernate.cfg.xml放到src目录中,也就是classpath路径(类根路径)
7、编写程序访问数据库
- HibernateDemo.java
1 public class UserDao{ 2 @Test 3 public void addUser(){ 4 //1、创建Configuration对象 5 Configuration configuration = new Configuration(); 6 //2、加载配置 7 configuration.configure(); 8 //3、获得SessionFactory工厂 9 SessionFactory sessionFactory = configuration.buildSessionFactory(); 10 //4、从SessionFactory中打开session 11 Session session = sessionFactory.openSession(); 12 //5、开启事务 13 Transaction transaction = session.beginTransaction(); 14 //6、操作数据库 15 User user = new User(); 16 user.setUname("张三"); 17 user.setUage(18); 18 session.save(user); 19 //7、提交或者回滚事务 20 transaction.commit(); 21 //8、关闭资源 22 session.close(); 23 sessionFactory.close(); 24 } 25 }
三、Hibernate核心java类详解
1、Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
- 作用:
配置对象,用来加载Hibernate的核心配置文件。
Hibernate框架通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性。
可以创建SessionFactory对象。
- Java代码
Configuration configuration = new Configuration();
configuration.configure();
2、SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
- 作用:
获取session
SessionFactory中相当于是连接池,内部获得Session.
SessionFactory并不是一个轻量级对象,内部维护连接池和hibernate的二级缓存(企业很少用,redis).
一个项目一般只需要创建一个SessionFactory.
- 抽取的HibernateUtils
1 public class HibernateUtils { 2 3 private static SessionFactory sessionFactory = null; 4 private static Configuration configuration = null; 5 6 static { 7 //1.创建Configuration对象 8 configuration = new Configuration(); 9 //2.加载配置 10 configuration.configure(); 11 //3.获得SessionFactory工厂 12 sessionFactory = configuration.buildSessionFactory(); 13 } 14 15 private HibernateUtils() { 16 } 17 18 public static Session openSession(){ 19 //4.从SessionFactory中打开session 20 return sessionFactory.openSession(); 21 } 22 }
3、Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
? 内部维护Hiberante的一级缓存(优化的手段).
-
- ? Serializable save(Object obj); --保存数据,返回值是保存数据返回的id
- ? T get(Class clazz,Serializable id); --根据主键查询对象
- ? T load(Class clazz,Serializable id); --根据主键查询对象
- ? void update(Object obj); --更新数据
- ? void delete(Object obj); --删除数据
-
- get方法的特点
- ? get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询
- ? get方法查询后返回的是真实对象的本身
- load方法的特点
- ? load方法采用的是延迟加载(懒加载lazy:什么时候使用,才会去加载)的策略:执行到这行的时候,不会发送 SQL语句,什么时候使用这个对象,才会发送SQL语句。
- ? load查询后返回的是代理对象
- get方法的特点
4、Transcation
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
-
常用API
? commit():提交事务
? rollback():回滚事务
-
特点
? Hibernate框架默认情况下事务不自动提交.需要手动提交事务
? 如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
? 每段事务操作都是隐含着异常的,需要手动添加try catch
- 测试事物没有自动提交
if(session instanceof SessionImpl){ SessionImpl sessionImpl = (SessionImpl) session; Connection connection = sessionImpl.connection(); System.out.println(connection.getAutoCommit());//false }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:验证码的制作和验证(一)
- logstash系列-入门整理 2020-06-10
- Java框架之Hibernate实战篇 2020-06-09
- Java 入门教程 2020-06-09
- RocketMQ4.4 入门进阶+实战 2020-06-08
- 因为 MongoDB 没入门,我丢了一份实习工作 2020-06-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash