一、什么是hibernate
一个开放源代码的对象关系映射框架,对jdbc进行了轻量封装,能够对数据库与实体类进行映射,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。少去了建表以及写sql语句的过程,面对对象的编程思维可以使我们能够更便捷的操作数据库。
ps:orm框架:对象-关系映射(OBJECT/RELATIONAL/MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。
二、使用hibernate的好处
1、Hibernate不仅负责从Java类映射到数据库表(从Java数据类型到SQL数据类型),而且还提供了数据查询和检索功能。
2、它可以显著减少开发时间,可以避免手动编写SQL语句,实现自动生成SQL语句,自动执行!
3、Hibernate依然可以使用SQL对数据操作,保证你的技术和知识是有效的一如既往
4、最为关键的一点,Hibernate是ORM模型框架,通过操作实体类(持久化类)进而操作数据库!这样Java程序员可以随心所欲的使用面向对象编程思想来操作纵数据库
三、hibernate使用
1、配置hibernate核心配置文件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">
头部信息来源
数据库配置
<!-- 1、连接数据库参数 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_1</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">111</property>
数据库方言
<!-- 2、hibernate方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
配置依据
数据库扩展参数
<!-- 3、hibernate扩展参数 --> <!--sql语句是否显示在console窗口--> <property name="hibernate.show_sql">true</property> <!--sql语句是否按格式显示--> <property name="hibernate.format_sql">true</property>
对应的实体类
<mapping resource="com/qfedu/demo/hibernate/pojo/Customer.hbm.xml" />
一般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> <!-- 1、连接数据库参数 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibdemo</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <!-- 2、hibernate方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 3、hibernate扩展参数 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="current_session_context_class">thread</property> <!-- 4、*.hbm.xml文件 --> <mapping resource="com/qfedu/demo/hibernate/pojo/Customer.hbm.xml" /> </session-factory> </hibernate-configuration>
2、创建实体类
package com.qfedu.demo.hibernate.pojo; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; public class Customer { private final static Logger LOG = LogManager.getLogger(Customer.class); private Long id; private String name; private String gender; private Integer age; private String level; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getLevel() { return level; } public void setLevel(String level) { this.level = level; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", level=" + level + "]"; } }
3、添加Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.qfedu.demo.hibernate.pojo"> <!-- name:类名 table:表名 --> <class name="Customer" table="customer"> <!-- 主键 --> <id name="id" column="c_id"> <generator class="native"></generator> </id> <!-- 其他属性 --> <property name="name" column="c_name"></property> <property name="gender" column="c_gender"></property> <property name="age" column="c_age"></property> <property name="level" column="c_level"></property> </class> </hibernate-mapping>
4、测试
@Test public void test() { Customer customer = new Customer(); customer.setName("老王"); customer.setAge(40); customer.setGender("男"); customer.setLevel("VIP"); // 3.创建Session对象 Session session = HibernateUtil.openSession(); // 4.开启事务 Transaction tx = session.beginTransaction(); // 5.执行添加操作 session.save(customer); //System.out.println(customer.getId());// 自动注入新生成的id // 6.提交事务 tx.commit(); // 7.关闭资源 session.close(); // sessionFactory.close(); HibernateUtil.close(); }
执行后发现数据库添加了数据
ps:junit测试时候会报如下警告
这并不会影响代码执行,强迫症可以选择在hibernate.cfg.xml的hibernate.connection.url的value中添入?useSSL=true,false也可以
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?useSSL=false</property>
四、hibernate中需要注意的地方
1、hibernate配置文件中各个标签的作用
a.Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象
b. SessionFactory接口:产生Session实例工厂
c.Session接口:用来操作持久化对象。它有get(),load(),save(),update()和delete()等方法用来对PO进行加载,保存,更新及删除等操作。它是Hibernate的核心接口
d.Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成
e.Query接口:用来对持久化对象进行查询操作。它可以从Session的createQuery()方法生成
2、实体类配置信息解析
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.qfedu.demo.hibernate.pojo"> <!-- name:类名 table:表名 --> <class name="Customer" table="customer"><!--表名映射的类名与对应的表名--> <!-- 主键 --> <id name="id" column="c_id"> <generator class="native"></generator> </id> <!-- 乐观锁 --> <version name="version" /> <!-- 其他属性 --> <property name="name" column="c_name"></property> <property name="gender" column="c_gender"></property> <property name="age" column="c_age"></property> <property name="level" column="c_level"></property> </class> </hibernate-mapping>
3、session对象的唯一性
如果由SessionFactory对象来openSession则不能保证接下来同一个线程使用的session是同一个session,所以就无法利用session来获取已经持久化的数据,所以需要其他方式来保证session的唯一性
在hibernate.cfg.xml中设置
<property name="current_session_context_class">thread</property>
在HibernateUtil工具类中设置获取session的方法
package com.qfedu.demo.hibernate; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private final static Logger LOG = LogManager.getLogger(HibernateUtil.class); private static SessionFactory sessionFactory; private static Map map = new ConcurrentHashMap (); static { // 1.读取hibernate.cfg.xml文件 Configuration cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } public static Session openSession () { return sessionFactory.openSession(); } /** * 模拟Hibernate获取当前线程绑定的Session * @return */ public static Session getCurrentSession2 () { Session session = (Session)map.get(Thread.currentThread()); if (session == null) { session = openSession (); map.put(Thread.currentThread(), session); } return session; } public static Session getCurrentSession () { return sessionFactory.getCurrentSession(); } public static void close () { sessionFactory.close(); } }
对于hibernate.cfg.xml中的配置信息可以看一下一位大佬的博文:https://www.cnblogs.com/henuyuxiang/p/6676824.html