Hibernate入门

    Hibernate是一个轻量级的ORMapping框架.
    ORMapping基本对应规则:
    1:类跟表相对应
    2:类的属性跟表的字段相对应
    3:类的实例与表中具体的一条记录相对应
    4:一个类可以对应多个表,一个表也可以对应对个类
    5:DB中的表可以没有主键,但是Object中必须设置主键字段
    6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系 
    7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样
    Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。


    Hibernate的核心组件
    在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层。它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。
    除配置文件,映射文件和持久化类外,Hibernate的核心组件包括以下几部分:
    1)Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
    2)SessionFactory(org.hibernate.SessionFactory)接口:针对单个数据库映射关系经过编译后的内存镜像,是重量级线程安全的(不可变)。 它是产生Session实例的工厂,本身要用到ConnectionProvider。
    3)Session(org.hibernate.Session)接口:表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了JDBC连接,也是Transaction的工厂。session会关联一个connection,session是持久化的管理器,非线程安全的。其生命周期最好跟事务一致,事务完成就将其关闭。它有get(),load(),save(),update()和delete()等方法用来对PO进行加载,保存,更新及删除等操作。它是Hibernate的核心接口。
   4)Query(org.hibernate.Query)接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
   5)Transaction(org.hibernate.Transaction)接口:用来管理Hibernate事务,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。
   6)ConnectionProvider (org.hibernate.connection.ConnectionProvider):生成JDBC连接的工厂(有连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。
   7)TransactionFactory (org.hibernate.TransactionFactory):生成Transaction对象实例的工厂。

    Hibernate的运行过程如下:
    A:应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
    B:然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将 提交这些操作结果到数据库中。


    Hibernate简单示例:hibernate-release-4.3.10.Final\lib\required\*.jar、mysql-connector-java-5.1.6-bin.jar

hibernate.cfg.xml配置

<!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.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库方言信息,可以指定不同数据库的分页 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

		<property name="connection.url">jdbc:mysql://127.0.0.1:3306/zero</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123456</property>
		<property name="connectio.useUnicode">true</property>
		<property name="connection.characterEncoding">utf-8</property>

		<!-- 显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- <property name="hibernate.format_sql">true</property> -->
		
		<mapping resource="com/zero/hibernate/vo/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>
vo类:
public class User {
	private int id;
	private String name;
	private String password;
	private Date birthday;

	public User() {
	}

	public User(String name, String password, Date birthday) {
		this.name = name;
		this.password = password;
		this.birthday = birthday;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping>
	<class name="com.zero.hibernate.vo.User" table="t_user">
		<id name="id" column="userID">
			<generator class="native" /><!-- 主键 -->
			<!-- native/uuid -->
		</id>
		<property name="name" />
		<property name="password" />
		<property name="birthday" />
	</class>
</hibernate-mapping>

测试:

public class TestDB {
	public static void main(String[] args) {
		// init();
		addUser();
		Query saQuery = null;
	}

	public static void init() {
		// 默认读取hibernate.cfg.xml
		Configuration cfg = new Configuration().configure();

		// 将hbm生成ddl,创建数据库
		SchemaExport export = new SchemaExport(cfg);
		export.create(true, true);
	}

	public static void addUser() {
		// 创建SessionFactory
		SessionFactory factory = null;

		/** 此方法在Hibernate4中被标记为过时 */
		// factory = new Configuration().configure().buildSessionFactory();

		Configuration cfg = new Configuration().configure();
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
				.applySettings(cfg.getProperties()).buildServiceRegistry();
		factory = cfg.buildSessionFactory(serviceRegistry);

		// 取得session
		Session session = null;
		try {
			session = factory.openSession();
			session.beginTransaction();
			User user = new User("zero", "123456", new Date());

			// 保存数据
			session.save(user);
			// 提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			if (session != null) {
				if (session.isOpen()) {
					session.close();
				}
			}
		}
	}
}


你可能感兴趣的:(Hibernate入门)