轻量级框架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中的持久化对象的创建。
Student.hbm.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
hibernate各版本创建sessionFactory示例
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各版本方言问题
相关文章推荐
- 轻量级框架SSH应用与开发——Spring之学习总结(初阶)
- 轻量级框架SSH应用与开发——Struts2之学习总结(初阶)
- Android开发学习总结(五)——Android应用目录结构分析
- Hibernate应用开发学习笔记1
- Android开发学习总结(五)——Android应用目录结构分析(转)
- spring springmvc hibernate(ssh)项目整合开发---邮件通信的应用
- SSH学习之——Spring、Struts和Hibernate整合开发
- Android <Android应用开发实战> 学习总结杂项
- Java开发实践 网络编程 学习、应用、总结
- 20169205 2016-2017-2 《移动平台应用开发实践》第5周学习总结
- Android开发实践 数据存储 学习、应用、总结
- 20169205 2016-2017-2 《移动平台应用开发实践》第6周学习总结
- Android开发学习总结(五)——Android应用目录结构分析
- 20169205 2016-2017-2 《移动平台应用开发实践》第3周学习总结
- Android开发实践 数据存储 学习、应用、总结
- Android应用开发学习总结(一)——环境搭建与基础准备
- SSH学习之——Spring、Struts和Hibernate整合开发
- 2016年11月19日学习总结----主流开发语言的特点及应用领域
- Qt Quick应用开发介绍 10-12(动态界面, 实践学习, 总结和扩展)
- Spring AOP基础(Spring 3.x企业应用开发实战第六章)学习总结