Hibernate(一)
1.Hibernate介绍
hibernate3.6: hibernate公司的产品.
hibernate4.3.8: jboss公司的产品.
2.作用
能让程序员以面向对象的方式来操作数据库,从而简化持久层的开发。
它底层可以跨数据库. (程序人员开发项目不用关心项目用得是什么数据库).
ORM: Object Relation Mapping 对象关系映射.
Object : 对象指得是面向对象的编程语言.
Relation: 关系指得是关系型数据库.
Mapping : 面向对象的编程语言与关系型数据库之间的映射.
3.ORM
ORM思想:它是用来解决面向对象的编程语言与关系型数据库之间的映射.ORM它是一种思想,不是具体的框架.
ORM框架:Hibernate4、TopLink、JDO等.
ORM的映射思想:
类对应表
对象对应一条数据
属性对应列名
4.JPA
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
JPA 与 ORM之间的关系:JPA是sun公司根据ORM思想制订出来的持久化层的规范. (有一套持久化的api)
JPA的实现商:Hibernate4、TopLink、JDO等.
由于JPA出现的时间比Hibernate4晚,学习Hibernate框架时,既要学习Hiberante框架,又要学习JPA.
尽量面向jpa编程,到时底层的ORM框架就可以自由切换.
JDBC: Java DataBase Connection java数据库连接的规范.
JDBC它是sun为各个数据库厂商制订的连接数据库的规范.(有一套连接数据的api,这些api都是接口).
5.核心类
Configuration 配置
专门负责加载全局的配置文件,产生SessionFactory.
ServiceRegistry 注册
SessionFactory 会话工厂
它是当前数据库在内存中镜像。一个SessionFactory对应一个数据库,所以SessionFactory只能有一个,当应用一启动就获取SessionFactory,当应用关闭时才关闭SessionFactory.
它是线程安全的.
它是创建Session的工厂。
它底层封装了数据源(连接池)。
它还有一个可选的二级缓存. (默认是关闭的).
Session 会话
它是应用程序与持久层进行交互的单线程对象。
它是线程不安全。
它存活的时间比较短.(因为它底层封装得是Connection,用完就要关闭).
它是事务工厂.
有一个必须开启的一级缓存. (一级缓存永远都是开启的).
Transaction 事务
JDBC事务(局部事务) : 只能对一个数据库中的表做事务. (web容器) tomcat jetty
JTA事务(全局事务、分布式事务) : 可以对多个数据库中的表做事务.(EJB容器)
WebSphere(IBM)、WebLogic(Oracle)、JBoss(jboss)
ConnectionProvider : 数据库连接的提供者
一般指得是数据源DataSource(连接池).
6.基本使用
注解方式:
新建项目
A.导包
向项目导入以下包:(官网下载的Hibernate项目的lib文件夹下)
B.配置文件src/hibernate.cfg.xml
在官网下载的Hibernate项目中搜索hibernate.cfg.xml,拷贝一个配置文件到src根目录下。
<!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>
<!-- 配置数据库方言,告诉Hibernate4我们用得是什么样的数据库 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 配置显示SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 配置格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 是否自动建表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置连接数据库的驱动类 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 配置连接数据库的URL (创建数据库) -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf8</property>
<!-- 配置连接数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 配置连接数据库的密码 -->
<property name="hibernate.connection.password">root</property>
<!-- 配置c3p0连接池中最大连接数 -->
<property name="hibernate.c3p0.max_size">10</property>
<!-- 配置c3p0连接池中最小连接数 -->
<property name="hibernate.c3p0.min_size">3</property>
<!-- 配置持久化类 class是注解方式-->
<mapping class="com.rong.entity.User"/>
</session-factory>
</hibernate-configuration>
C.编写实体类
1 package com.rong.entity;
2
3 import javax.persistence.Entity;
4 import javax.persistence.Id;
5
6 @Entity
7 public class User {
8 @Id
9 private int id;
10 private String name;
11 private int age;
12 public int getId() {
13 return id;
14 }
15 public void setId(int id) {
16 this.id = id;
17 }
18 public String getName() {
19 return name;
20 }
21 public void setName(String name) {
22 this.name = name;
23 }
24 public int getAge() {
25 return age;
26 }
27 public void setAge(int age) {
28 this.age = age;
29 }
30 @Override
31 public String toString() {
32 return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
33 }
34
35 }
D.测试
在本地创建数据库名为hibernate的数据库
CREATE DATABASE hibernate CHARSET utf8;
1 package com.rong.test; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 7 import org.hibernate.cfg.Configuration; 8 import org.hibernate.service.ServiceRegistry; 9 import org.junit.Test; 10 11 public class HibernateTest { 12 @Test 13 public void oneTest(){ 14 //1.获得SessionFacotry 15 Configuration configuration=new Configuration() // 默认会加载src/hibernate.properties属性文件 16 .configure();// 默认会加载src/hibernate.cfg.xml 17 ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder() 18 .applySettings(configuration.getProperties())//把配置信息交给注册 19 .build(); 20 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 21 //2.获得Session 22 Session session = sessionFactory.openSession(); 23 //3.开启事务 24 Transaction transaction = session.beginTransaction(); 25 //在数据库表操作...... 26 27 //4.提交事务 28 transaction.commit(); 29 //5.关闭资源 30 session.close(); 31 sessionFactory.close(); 32 } 33 }
E.查看数据库
数据库的user表被创建
xml配置文件方式:
A.导包
B.配置文件src/hibernate.cfg.xml
在官网下载的Hibernate项目中搜索hibernate.cfg.xml,拷贝一个配置文件到src根目录下。
<!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> <!-- 配置数据库方言,告诉Hibernate4我们用得是什么样的数据库 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 配置显示SQL语句 --> <property name="hibernate.show_sql">true</property> <!-- 配置格式化SQL语句 --> <property name="hibernate.format_sql">true</property> <!-- 是否自动建表--> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置连接数据库的驱动类 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 配置连接数据库的URL (创建数据库) --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf8</property> <!-- 配置连接数据库的用户名 --> <property name="hibernate.connection.username">root</property> <!-- 配置连接数据库的密码 --> <property name="hibernate.connection.password">root</property> <!-- 配置c3p0连接池中最大连接数 --> <property name="hibernate.c3p0.max_size">10</property> <!-- 配置c3p0连接池中最小连接数 --> <property name="hibernate.c3p0.min_size">3</property> <!-- 配置持久化类 class是注解方式 resource是映射文件方式--> <mapping class="com.rong.entity.User"/> <mapping resource="com/rong/entity/xml/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
C.编写实体类
1 package com.rong.entity.xml; 2 3 public class Student { 4 private int id; 5 private String name; 6 private int age; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public int getAge() { 20 return age; 21 } 22 public void setAge(int age) { 23 this.age = age; 24 } 25 @Override 26 public String toString() { 27 return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; 28 } 29 }
D.配置XXX.hbm.xml文件
在官网下载的Hibernate项目中搜索*.hbm.xml,拷贝一个配置文件到该实体类的目录下。如:Student类,xml文件名为Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.rong.entity.xml.Student" table="student"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <property name="age" column="age" /> </class> </hibernate-mapping>
E.测试
与注解方式一样。
F.查看数据库
7.Hibernate对象状态
瞬态 : User user = new User(); 我们程序使用,hibernate不认识
持久化状态:交给hibernate认识。
托管状态:又重新交给应用管理了。
A.查看对象状态
1 package com.rong.test;
2
3 import org.hibernate.Session;
4 import org.hibernate.SessionFactory;
5 import org.hibernate.Transaction;
6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
7 import org.hibernate.cfg.Configuration;
8 import org.hibernate.service.ServiceRegistry;
9 import org.junit.Test;
10
11 import com.rong.entity.User;
12
13 public class HibernateTest {
14 @Test
15 public void oneTest(){
16 //1.获得SessionFacotry
17 Configuration configuration=new Configuration() // 默认会加载src/hibernate.properties属性文件
18 .configure();// 默认会加载src/hibernate.cfg.xml
19 ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
20 .applySettings(configuration.getProperties())//把配置信息交给注册
21 .build();
22 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
23 //2.获得Session
24 Session session = sessionFactory.openSession();
25 //3.开启事务
26 Transaction transaction = session.beginTransaction();
27 //在数据库表操作......
28 User user=new User();//瞬态
29 user.setName("rjl");
30 //判断Session的一级缓存中是否包含这个对象。false 是瞬态 true是持久化状态
31 System.out.println(session.contains(user));//false
32
33 session.save(user);//持久化状态
34 System.out.println(session.contains(user));//true
35
36 session.clear();//脱管状态
37 System.out.println(session.contains(user));//false
38 //4.提交事务
39 transaction.commit();
40 //5.关闭资源
41 session.close();
42 sessionFactory.close();
43 }
44 }
B.对象持久化状态(存储到数据库)
save与persist的区别:
第一个区别
save方法有返回值,它的返回值是主键id
persist方法没有返回值,调用对象的getId();
第二个区别
save方法:它会立即往数据库表中插入数据,马上生成insert语句
persist方法:他会延迟往数据库表中插入数据。跟事务是否开启有关。
注意:在事务开启后执行两个方法做添加都会立即生成sql语句。
1 package com.rong.test;
2
3 import java.io.Serializable;
4
5 import org.hibernate.Session;
6 import org.hibernate.SessionFactory;
7 import org.hibernate.Transaction;
8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.junit.Test;
12
13 import com.rong.entity.User;
14
15 public class HibernateTest {
16 @Test
17 public void oneTest(){
18 //1.获得SessionFacotry
19 Configuration configuration=new Configuration() // 默认会加载src/hibernate.properties属性文件
20 .configure();// 默认会加载src/hibernate.cfg.xml
21 ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
22 .applySettings(configuration.getProperties())//把配置信息交给注册
23 .build();
24 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
25 //2.获得Session
26 Session session = sessionFactory.openSession();
27 //3.开启事务
28 Transaction transaction = session.beginTransaction();
29 //在数据库表操作......
30 User user=new User();//瞬态
31 user.setName("rjl");
32 //判断Session的一级缓存中是否包含这个对象。false 是瞬态 true是持久化状态
33 System.out.println(session.contains(user));//false
34
35 /* user.setId(1);
36 Serializable serializable = session.save(user);//持久化状态
37 System.out.println(serializable);//save方法返回user的id,返回1
38 System.out.println(session.contains(user));//true
39 */
40 /* user.setId(2);
41 user.setName("kobe");
42 session.saveOrUpdate(user);//持久化状态。
43 //数据库先查询,若不存在该记录id,则插入;否则更新。
44 System.out.println(session.contains(user));//true
45 */
46 /* user.setId(3);
47 session.persist(user);//持久化状态。
48 System.out.println(session.contains(user));//true
49 */
50 user.setId(4);
51 user.setAge(18);
52 user.setName("lyr");
53 User mergeUser = (User) session.merge(user);
54 //user还是瞬态,mergeUser才是持久化状态
55 System.out.println(session.contains(user));//false
56 System.out.println(session.contains(mergeUser));//true
57
58 //4.提交事务
59 transaction.commit();
60 //5.关闭资源
61 session.close();
62 sessionFactory.close();
63 }
64 }
C.查询
1 package com.rong.test; 2 3 import java.io.Serializable; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.Transaction; 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 9 import org.hibernate.cfg.Configuration; 10 import org.hibernate.service.ServiceRegistry; 11 import org.junit.Test; 12 13 import com.rong.entity.User; 14 15 public class HibernateTest { 16 @Test 17 public void oneTest(){ 18 //1.获得SessionFacotry 19 Configuration configuration=new Configuration() // 默认会加载src/hibernate.properties属性文件 20 .configure();// 默认会加载src/hibernate.cfg.xml 21 ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder() 22 .applySettings(configuration.getProperties())//把配置信息交给注册 23 .build(); 24 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 25 //2.获得Session 26 Session session = sessionFactory.openSession(); 27 //3.开启事务 28 Transaction transaction = session.beginTransaction(); 29 //在数据库表操作...... 30 31 //get方式通过id获取一条数据 32 //立刻发送sql语句查询 33 User user1 = (User) session.get(User.class, 3); 34 System.out.println(user1); 35 36 //load方式通过id获取一条数据 37 //load方式延迟加载数据,当使用对象当中的方法或者属性时,就会查询数据库。 38 //在使用对象的方法时,必须要保证session没有关闭 39 User user2=(User) session.load(User.class, 4); 40 System.out.println(user2); 41 //4.提交事务 42 transaction.commit(); 43 //5.关闭资源 44 session.close(); 45 sessionFactory.close(); 46 } 47 }
D.更新
1 package com.rong.test;
2
3 import org.hibernate.Session;
4 import org.hibernate.SessionFactory;
5 import org.hibernate.Transaction;
6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
7 import org.hibernate.cfg.Configuration;
8 import org.hibernate.service.ServiceRegistry;
9 import org.junit.Test;
10
11 import com.rong.entity.User;
12
13 public class HibernateTest {
14 @Test
15 public void oneTest(){
16 //1.获得SessionFacotry
17 Configuration configuration=new Configuration() // 默认会加载src/hibernate.properties属性文件
18 .configure();// 默认会加载src/hibernate.cfg.xml
19 ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
20 .applySettings(configuration.getProperties())//把配置信息交给注册
21 .build();
22 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
23 //2.获得Session
24 Session session = sessionFactory.openSession();
25 //3.开启事务
26 Transaction transaction = session.beginTransaction();
27 //在数据库表操作......
28
29 //在持久化状态下,直接修改对象的属性,就会发送update语句更新数据库
30 //建议采用此种方式
31 User user1=(User)session.get(User.class, 3);//持久化状态
32 //user1.setName("rong");
33 user1.setAge(16);
34
35 //在瞬态状态下更新数据库数据,注意:一定要全部赋值,否则其它属性会为变为默认值。
36 User user2=new User();//瞬态
37 user2.setId(4);
38 user2.setAge(20);
39 session.saveOrUpdate(user2);//持久化状态
40 //session.update(user2);//持久化状态
41 //4.提交事务
42 transaction.commit();
43 //5.关闭资源
44 session.close();
45 sessionFactory.close();
46 }
47 }
E.删除
1 package com.rong.test; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 7 import org.hibernate.cfg.Configuration; 8 import org.hibernate.service.ServiceRegistry; 9 import org.junit.Test; 10 11 import com.rong.entity.User; 12 13 public class HibernateTest { 14 @Test 15 public void oneTest(){ 16 //1.获得SessionFacotry 17 Configuration configuration=new Configuration() // 默认会加载src/hibernate.properties属性文件 18 .configure();// 默认会加载src/hibernate.cfg.xml 19 ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder() 20 .applySettings(configuration.getProperties())//把配置信息交给注册 21 .build(); 22 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 23 //2.获得Session 24 Session session = sessionFactory.openSession(); 25 //3.开启事务 26 Transaction transaction = session.beginTransaction(); 27 //在数据库表操作...... 28 29 //在持久化状态下 直接删除 30 User user1=(User) session.get(User.class, 4);//持久化状态 31 session.delete(user1); 32 33 //在瞬态状态下删除 34 User user2=new User(); 35 user2.setId(0); 36 session.delete(user2); 37 //4.提交事务 38 transaction.commit(); 39 //5.关闭资源 40 session.close(); 41 sessionFactory.close(); 42 } 43 }