Hibernate (开放源代码的对象关系映射框架): Hibernate是一个开放源代码的 对象关系映射框架 ,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 全自动的ORM框架 ,hibernate可以 自动生成SQL语句,自动执行 ,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
<!-- more -->
缓存方面
Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓 存方案,创建适配器来完全覆盖缓存行为。
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
准备好User实体类和数据库记录
User.java
public class User { private Integer id; private String userName; private String passWord; //Get、Set方法,此处省略。 }
mysql数据库:
Hibernate基础Maven依赖:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- 添加hibernate的依赖 开始--> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.2.Final</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <!-- <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.1</version> </dependency> <!– Hibernate library dependecy end –> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency>--> <!-- 添加hibernate的依赖 结束--> <!-- mysql数据库的驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--<property name="hibernate.bytecode.use_reflection_optimizer">false</property>--> <!--指定数据库的驱动程序--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--指定连接数据库的口令--> <property name="hibernate.connection.password">admin</property> <!--指定连接数据库的URL--> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernatetraning</property> <!--指定连接数据库的用户名--> <property name="hibernate.connection.username">root</property> <!--数据库方言,用于指定使用的sql从属于哪个数据库--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--如果为true,表示在程序运行时会在控制台输出SQL语句,有利于跟踪Hibernate的运行状态,默认为false。应用开发阶段设置为true,发布阶段应设置为false提高运行性能--> <property name="show_sql">true</property> <!-- <property name="hibernate.hbm2ddl.auto">update</property>--> <mapping resource="mapper/User.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 4.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.entity.User" table="tbl_user"> <!-- 在User里面 id 的set 和 get 方法里 也要设置为Integer类型的,不然会报错 --> <id name="id" column="id" type="java.lang.Integer"> <generator class="assigned"/> </id> <property name="userName" column="username" type="java.lang.String" length="20" /> <property name="passWord" column="password" type="java.lang.String" length="20"/> </class> </hibernate-mapping>
Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); //测试session是否创建,以及是否可以从user映射的表里获取记录 Session session = sessionFactory.openSession(); //System.out.println("session=="+session); User user = (User)session.get(User.class,1); System.out.println(user); //关闭会话工厂,项目自动停止。生产环境中千万不要写这句。 //sessionFactory.close();
控制台输出:User{id=1, userName='Jack', passWord='123'}
Hibernate是自动化程度更高ORM(Object-Relational Mapping)框架,不是面向SQL的持久层框架,以更加OO方式来编写数据读写代码。
Hibernate中的对象有3中状态,瞬时对象(Transient Objects)、持久化对象(Persistent Objects)和离线对象(Detached Objects也叫做脱管对象)。
HibernateUtils.java
工具类 public class HibernateUtils { private static SessionFactory sessionFactory = null; static { try { Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); }catch (HibernateException e){ System.out.println("SessionFactory初始化失败"); e.printStackTrace(); } } public static SessionFactory getSessionFactory() throws Exception{ if (sessionFactory != null){ return sessionFactory; }else { throw new Exception("sessionFactory为空,请检查配置文件"); } } public static Session getSession(){ Session session = null; try { if (sessionFactory != null){ session = sessionFactory.openSession(); } }catch (HibernateException e){ e.printStackTrace(); } return session; } public static void closeSession(Session session){ try { if (session != null && session.isOpen()){ session.close(); } }catch (HibernateException e){ e.printStackTrace(); } } }
测试代码:
Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user1 = new User(); user1.setId(2); user1.setUserName("Frank"); user1.setPassWord("111"); // 当前user1在数据库中没有记录进行关联,所有此时user1是瞬时对象。 // 将user1持久化 session.save(user1); tx.commit(); User user2 = (User)session.get(User.class, 2); System.out.println(user2); // 当前user2在数据库有唯一一条记录对应,所有此时user2是持久化对象。
hibernate.hbm2ddl.auto属性值(从类自动生成数据库DDL操作)
<property name="hibernate.hbm2ddl.auto">update</property>