Hibernate API简介
Hibernate 核心接口:
Configuration:
概述:Configuration 类负责管理Hibernate 的配置信息。启动Hibernate、创建SessionFactory对象。
-
Hibernate运行的底层配置信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。
-
Hibernate对象关系映射文件(*.hbm.xml)。
Hibernate配置的两种方法:
- 属性文件(hibernate.properties)。
调用代码:Configuration cfg = new Configuration();
- XML文件(hibernate.cfg.xml)。
调用代码:Configuration cfg = new Configuration().configure();
Configrure()方法默认读hibernate.cfg.xml
<!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.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hellohibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">12345</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- 保证每个读写线程有唯一的session实例 -->
<property name="show_sql">true</property>
<mapping resource="cn/hrbust/pojo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
SessionFactory:
概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。
-
SessionFactory是线程安全的(Thread-Safe),可以让多个执行线程同时存取SessionFactory而不会有数据共享的问题。
-
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
-
需要注意的是SessionFactory是重量级的,因为一 般情况下,一个项目通常只需要一个SessionFactory就够(单例模式),当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
调用代码:SessionFactory sessionFactory = cfg.buildSessionFactory();
Session(会话):
概述: Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流)
-
Session也称为持久化管理器,因为它是与持久化有关的操作接口。
-
Session不是线程安全的,应该避免多个线程共享同一个Session实例。
-
Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
-
保证在一个线程中仅存在一个Session实例
-
getCurrentSession (Hibernate 3+)
getCurrentSession方法,保证了线程中Session的唯一性;
调用代码: Session session = sessionFactory.getCurrentSession();
使用getCurrentSession需要在配置文件中加入
thread
-
可以采用ThreadLocal的办法. (Hibernate 2)
-
把Session对象放在方法内部定义.
-
Transaction(事务):
概述: Transaction接口负责事务相关的操作。
它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。
调用代码:Transaction tx = session.beginTransaction();
tx.commit(); //提交事务
…
tx.rollback(); //回滚事务
注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。
Query:
概述: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。
调用代码:Query query = session.createQuery(“from User”);
单态模式(静态代码块):
package cn.hrbust.dao;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
//SessionFactory单态模式
public class HibernateUtil {
private static SessionFactory sf=null;
private static Configuration cfg=null;
// 静态代码块,在类加载的时候只能执行一次
static {
try {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sf;
}
public static void closeSessionFactory(){
sf.close();
}
}
main:
public static void main(String[] args) {
Configuration cfg =null;
SessionFactory sf=null;
Session session=null;
Transaction ts=null;
User u=new User();
u.setName("李四");
u.setGender("男");
u.setAge(21);
u.setBirthday(Date.valueOf("2001-1-1"));
try {
sf=HibernateUtil.getSessionFactory();//SessionFactory单态模式
session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts=session.beginTransaction();
session.save(u);
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts !=null) {
ts.rollback();
}
}finally {
//session.close();
//sf.close();
}
}
单元测试:
查询用户对象:
//查询用户对象
public void testQuerySUser(){
Configuration cfg =null;
SessionFactory sf=null;
Session session=null;
Transaction ts=null;
try {
sf=HibernateUtil.getSessionFactory();//SessionFactory单态模式
session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts=session.beginTransaction();
Query query=session.createQuery("from User");
List<User> users=query.list();
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.getName()+" "+u.getAge());
// }
for(User u: users)
{
System.out.println(u.getName()+" "+u.getAge());
}
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts !=null) {
ts.rollback();
}
}finally {
//session.close();
//sf.close();
}
}
结果:
保存用户对象:
//保存用户对象
public void testSavaUser(){
Configuration cfg =null;
SessionFactory sf=null;
Session session=null;
Transaction ts=null;
User u=new User();
u.setName("张三");
u.setGender("女");
u.setAge(21);
u.setBirthday(Date.valueOf("2002-1-1"));
try {
sf=HibernateUtil.getSessionFactory();//SessionFactory单态模式
session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts=session.beginTransaction();
/*
* Query query=session.createNamedQuery("from User"); List users=(List)
* query.list();
*/
session.save(u);
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts !=null) {
ts.rollback();
}
}finally {
//session.close();
//sf.close();
}
}
结果:
自动表生成:
ExportSchema.java:
package cn.hrbust.dao;
import java.util.EnumSet;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
public class ExportSchema {
public static void main(String[] args) {
// TODO Auto-generated method stub
//服务注册对象
ServiceRegistry sr= new StandardServiceRegistryBuilder().configure().build();
Metadata metadata =new MetadataSources(sr).buildMetadata();
//创建Schema,表的对象,目的是根据数据生成表
SchemaExport se=new SchemaExport();
se.create(EnumSet.of(TargetType.DATABASE), metadata);
}
}
User.hbm.xml:
<?xml version="1.0"?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!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="cn.hrbust.pojo.User" table="improve">
<id name="id">
<generator class="identity"/>
</id>
<property name="name" column="username"/>
<property name="gender" column="sex"/>
<property name="age" column="age"/>
<property name="birthday" column="borndate"/>
</class>
</hibernate-mapping>
结果:
问题:
1.WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
解决办法:
在url的配置中加入?useSSL=false
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hellohibernate?useSSL=false</property>
链接: link.
2.不能自动创建表
解决办法:
org.hibernate.dialect.MySQL5Dialect