hibernate初识1——hibernate基本认识及hibernate基本配置

一、什么是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>
<!--表明根据实体类自动更新表结构-->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="current_session_context_class">thread</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    

猜你喜欢

转载自blog.csdn.net/KingMipple/article/details/80526459
今日推荐