hibernate(1)hibernate入门介绍

一、hibernate是什么

        Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。(摘自百度)

hibernate(1)hibernate入门介绍

从上图可知,hibernate就是简化与数据库打交道的过程,帮我们写好简单的增删查改语句。当然hibernate还有很多其他功能,这里也不加以讨论(但是在实际项目开发中,难免会有多表的联合查询或者复杂的sql语句,这可比写简单的JDBC麻烦多了,这就是为什么hibernate会被mybatis代替的原因)

 

二、为什么要用hibernate

  1. Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
  2. Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作  session.save(User);
  3. Hibernate使用java的反射机制
  4. Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。

 

三、怎么用hibernate

1、jar包

hibernate(1)hibernate入门介绍

 

2、文件结构

hibernate(1)hibernate入门介绍

Uesr.hbm.xml是对应JavaBean的映射文件,一对一

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">
<hibernate-configuration>
	<session-factory>	
	<!-- property 元素用于配置Hibernate中的属性
			键:值 
		  -->
		  <!-- hibernate.connection.driver_class : 连接数据库的驱动  -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		  <!-- hibernate.connection.username : 连接数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		  <!-- hibernate.connection.password : 连接数据库的密码 -->
		<property name="hibernate.connection.password">123456</property>
		  <!-- hibernate.connection.url : 连接数据库的地址,路径 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myuser</property>
		
		<!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
		<property name="show_sql">true</property>
		<!-- format_sql: 打印sql语句前,会将sql语句先格式化  -->
		<property name="format_sql">true</property>
		<!-- hbm2ddl.auto: 生成表结构的策略配置
			 update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 
			 		如果存在表结构,并且表结构与实体一致,那么不做修改
			 		如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
			 create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
			 create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
			 validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
		  -->
		<property name="hbm2ddl.auto">update</property>
		
		<!-- 数据库方言配置 
		 org.hibernate.dialect.MySQLDialect (选择最短的)
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- hibernate.connection.autocommit: 事务自动提交  -->
		<property name="hibernate.connection.autocommit">true</property>
		<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 引入ORM 映射文件 
			填写src之后的路径 -->
		<mapping resource="habernateOne/User.hbm.xml"/>
	
	</session-factory>
</hibernate-configuration>
	
	
	

然后写个Test文件测试以下就ok

package habernateOne;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class Test {
	public static void main(String[] args) {
		
		/*configuration详解,手动填源
		Configuration con = new Configuration().configure(resource);
		加载全局SRC hibernate.cfg.xml*/
		Configuration con = new Configuration().configure();
		
		SessionFactory sessionFactory = con.buildSessionFactory();

		// JDBC Connection
		// 由工厂生产连接对象session 这个session不是Servlet里面的
		Session session = sessionFactory.openSession();
		/* 得到同一个session
		 * sessionFactory.getCurrentSession();*/
		
		User user = new User();
		
//		增加
		user.setPassword("123");
		user.setUsername("曾理国");
		session.save(user);
		
/*		查找并更新
		User userTwo = (User) session.get(User.class, 1);
		userTwo.setPassword("1123");
		userTwo.setUsername("215");
		session.update(userTwo);*/
		
/*		修改
 * 		user.setId(id);
		user.setPassword(password);
		user.setUsername(username);
		session.update(user);*/
		
/*		删除
 * 		user.setId(id);
		session.delete(user);*/
		
		
		session.beginTransaction().commit();
		// (设置了事务自动提交之后,还要flush一下)
		/*
		 * session.flush(); session.close();
		 */
		// User user3= (User)session.load(user.getClass(), 2);

		// User user2= (User)session.load(user.getClass(), 2);
		// System.out.println(user2.toString());
		// session.beginTransaction().commit();

		// Query createQuery = session.createQuery("from User");
		// List<User> list = createQuery.list();
		// for (User user2 : list) {
		// System.out.println(user2);
		// }*/

		session.close();

	}

}