您的位置:首页 > 其它

轻量级框架SSH应用与开发——Hibernate之学习总结(初阶)

2017-09-09 09:44 671 查看
Hibernate结构图



Hibernate中的主要对象

SessionFactory:Hibernate的关键对象,是单个数据库映射关系经过编译后的内存镜像,也是线程安全的。SessionFactory是生成Session的工厂,本身要应用到ConnectionProvider。可为事务之间可以重用的数据提供可选的的二级缓存。

Session:是应用程序和持久化存储层之间交互操作的一个单线程对象,所有的持久化对象必须在Session的管理下才能够进行持久化操作。此对象的生存周期很短,其隐藏看JDBC连接,也是Transaction的工厂。Session对象有一个一级缓存,执行flush之前,所有的持久化操作的数据都在缓存中Session对象处。

Transaction:提供持久化中的原子操作,具有数据库事务的概念。通过抽象,将应用程序从底层的具体的JDBC等事务中隔离开。一个Session之内可能包含多个Transaction对象,虽然事务操作是可选的,但是所有的持久化操作都应该在事务管理下进行,即使只是只读操作。

ConnectionProvider:数据库连接提供者,用于生成与数据库建立连接的JDBC对象。是生成JDBC的连接工厂,同时具有连接池的作用。这个对象无须应用程序直接访问,仅在应用程序扩展时使用。

TransactionFactory:时生成Transaction对象的工厂,实现了对事务的封装。是生成Transaction实例的工厂。该对象也无需应用程序的直接访问。



下面以Student学生类为例,演示Hibernate中的持久化对象的创建。

package test;

import java.util.Date;

public class Student {
//		遵循javabeans设计原则
//		1、公有的类
//		2、提供公有的不带参数的默认构造方法
//		3、属性私有
//		4、属性set/get封装
private int id;
private String name;
private String sex;
private int age;
private Date birthday;

public Student() {

}

public Student(int id, String name, String sex, int age, Date birthday) {
//		super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.birthday = birthday;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

}


Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-7-23 23:23:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="test.Student" table="STUDENT">
<id name="id" type="int">
<column name="ID" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<?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>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://127.0.0.1:3306/hibernate?useUnicode=true&characterEncodeing=utf8
</property>
<!-- dialect 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 注册所有映射资源文件 -->
<mapping resource="Student.hbm.xml" />
<mapping resource="Adress.hbm.xml" />

</session-factory>
</hibernate-configuration>


Hibernate配置文件常用属性

hibernate.connection.driver_class:数据库驱动类

hibernate.connection.datasource:数据源的JNDI(Java Naming and Directory Interface,Java命名和目录接口)名字

hibernate.connection.url:JNDI数据库提供者的URL

hibernate.connection.username:连接数据库的用户名

hibernate.connection.password:连接数据库的密码

hibernate.dialect:针对不同的数据库提供不同的方言类,允许Hibernate针对特定的数据库生成优化的SQL语句

hibernate.show_sql:是否输出Hibernate操作数据库使用的SQL语句

hibernate.format_sql:是否格式化输出的SQL语句

hibernate.hbm2ddl.auto:是否根据映射文件自动建立数据库表,该属性可以是create、create-drop和update三个值(create时会根据POJO映射文件创建表,但每次运行都要重新生成表;值为create-drop时,在关闭SessionFactory会自动删除创建的表;update时最常用的属性,不会删除以前的行记录。)

StudentTest.java

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import test.Student;

public class StudentTest {

private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;

@Before
public void init(){
//		创建配置对象xml
Configuration config = new Configuration().configure();
//		hibernate5创建会话工厂对象
sessionFactory = config.buildSessionFactory();
//		打开会话
session = sessionFactory.openSession();
//		开启事务
transaction = session.beginTransaction();

}

@Test
public void testSaveStudent() {
//		创建学生对象s
Student s = new Student(40,"张三","男",22,new Date());
//		保存对象进数据库
session.save(s);
}

/*@Test
public void testGetStudent() {
Student s = session.get(Student.class, 40);
System.out.println(s);
}

@Test
public void testLoadStudent() {
Student s = session.load(Student.class, 40);
System.out.println(s);
}

@Test
public void testUpdateStudent() {
Student s = session.get(Student.class, 40);
s.setAge(18);
s.setSex("女");
System.out.println(s);
}

@Test
public void testDeleteStudent() {
Student s = session.get(Student.class, 40);
session.delete(s);
}*/

@After
public void destory(){
transaction.commit();//提交事务

session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}

}


hibernate各版本创建sessionFactory示例

public class HibernateTest1 {

@Test
public void test1(){
//1. 创建一个SessionFactory对象
SessionFactory sessionFactory=null;
//1.1 创建Configuration对象:对应包含hibernate的基本配置信息(cfg)和对象关系映射信息(hbm)
Configuration configuration=new Configuration().configure();

//hibernate 3.x版本的SessionFactory的创建方式,4.X被Deprecated,5.x又再次回归。
//new Configuration().buildSessionFactory();

//1.2 创建一个ServiceRegistry对象:这个对象是从Hibernate 4.x开始新增加入的
//hibernate的任务配置和服务需要在该对象中注册后才能有效。
//hibernate 4.x版本中的ServiceRegistry创建方式:ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getPrope
adf1
rties()).buildServiceRegistry();
//hibernate 5.x版本中的ServiceRegistry创建方式:
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

System.out.println(CuntomerBean.class.getCanonicalName());
Metadata metadata = new MetadataSources(serviceRegistry).addAnnotatedClass(CuntomerBean.class)
.addAnnotatedClassName(CuntomerBean.class.getName()).addResource("com/happybks/hibernate/hibernatePro/beans/CuntomerBean.hbm.xml")
.getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE)
.build();

//1.3 创建sessionFactory
//hibernate 4.x版本中的sessionFactory创建方式: sessionFactory=configuration.buildSessionFactory(serviceRegistry);
//hibernate 5.x版本中的sessionFactory创建方式:
sessionFactory=metadata.getSessionFactoryBuilder().build();

//2. 创建一个Session对象
Session session=sessionFactory.openSession();

//3. 开启事务
Transaction transaction=session.beginTransaction();

//4. 执行保存操作。把对象保存到数据库
CuntomerBean bean=new CuntomerBean();
bean.setName("HappyBKs");
bean.setNo(314);
bean.setMoney(20688.68);
bean.setScore(98765432123456789L);
bean.setRegisterDate(new Date(new java.util.Date().getTime()));
bean.setLoginTime(Timestamp.valueOf("2017-01-08 12:00:00"));
session.save(bean);

//5. 提交事务。
transaction.commit();

//6. 关闭Session
session.close();

//7. 关闭SessionFactory对象。
sessionFactory.close();
}
}

hibernate各版本方言问题

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate jdbc ssh 事务