zoukankan      html  css  js  c++  java
  • Hibernate初认识以及HelloWorld

      一、Hibernate初认识    

          1、 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

          2、对于对象持久化的理解: 

    a.狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
    b.广义的理解,“持久化”包括和数据库相关的各种操作:
    –保存:把对象永久保存到数据库中。
    –更新:更新数据库中对象(记录)的状态。
    –删除:从数据库中删除一个对象。
    –查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。

    加载:根据特定的OID,把一个对象从数据库加载到内存中。

           3、 ORM(Object/Relation Mapping)对象/关系映    

        –ORM 主要解决对象-关系的映射

        

    面向对象           面向关系
    对象 表的行(记录)
    属性 表的列(z字段)


       –ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,把对数据库的操作转化为对对象的操作

      –ORM 采用元数据来描述对象-关系映射细节,元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中.

      二、Hibernate初使用之HelloWrld

            1、创建一个Java工程,工程下面新建文件夹lib,在lib中加入Hibernate必须的jar包以及MySql的jar包

            2、在src下新建Hibernate的配置文件:hibernate.cfg.xml ,配置信息如下,相关配置介绍见注释:

    <?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="connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="connection.username">root</property>
           <property name="connection.password">root123</property>
           <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>      
           <!-- 配置Hibernate基本信息 -->
           <!-- 配置MySQL数据库方言 -->
           <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
           <!-- 控制台是否打印SQL -->
           <property name="show_sql">true</property>
           <!-- 是否对SQL格式化 -->
           <property name="format_sql">true</property>
           <!-- 指定自动生成表的策略 -->
           <property name="hbm2ddl.auto">update</property>
           <!-- 指定关联的hbm.xml文件 -->
           <mapping resource="com/elgin/hibernate/model/UserModel.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

    3. 创建持久化的Java类,Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因,示例代码如下:

    提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance()来实例化持久化类

    提供一个标识属性(identifier property):通常映射为数据库表的主键字段.如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()

    为类的持久化类字段声明访问方法(get/set):Hibernate对JavaBeans风格的属性实行持久化。

    使用非 final:在运行时生成代理是Hibernate的一个重要的功能.如果持久化类没有实现任何接口,Hibnernate使用CGLIB生成代理.如果使用的是final类,则无法生成CGLIB代理.

    重写 eqaulshashCode方法:如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法

    package com.elgin.hibernate.model;
    public class UserModel {
    	private int id;
    	private String username;
    	private String password;
    	private String phone;
    	private String email;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	public String getPhone() {
    		return phone;
    	}
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public UserModel() {
    	}
    	public UserModel(String username, String password, String phone, String email) {
    		super();
    		this.username = username;
    		this.password = password;
    		this.phone = phone;
    		this.email = email;
    	}
    	@Override
    	public String toString() {
    		return "UserModel [id=" + id + ", username=" + username + ", password=" + password + ", phone=" + phone
    				+ ", email=" + email + "]";
    	}

    4.  创建对象-关系映射文件:UserModel.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">
    <!-- Generated 2015-7-15 23:28:28 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>
        <class name="com.elgin.hibernate.model.UserModel" table="USERMODEL">
            <id name="id" type="int">
                <column name="ID" />
                <!-- 主键生成方式,native:使用数据库本地方式 -->
                <generator class="native" />
            </id>
            <property name="username" type="java.lang.String">
                <column name="USERNAME" />
            </property>
            <property name="password" type="java.lang.String">
                <column name="PASSWORD" />
            </property>
            <property name="phone" type="java.lang.String">
                <column name="PHONE" />
            </property>
            <property name="email" type="java.lang.String">
                <column name="EMAIL" />
            </property>
        </class>
    </hibernate-mapping>


    5.  编写Junit测试类HibernateTest来对Hibernate进行测试:

     首先bulidpath,在工程中加入Junit4的类库,方便通过单元测试类对Hibernate进行测试。     

    package com.elgin.hibernate.test;
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.junit.Test;
    
    import com.elgin.hibernate.model.UserModel;
    
    public class HibernateTest {
       
    	@Test
    	public void test(){
    		
    		//1.创建sessionFactory对象
    		SessionFactory sessionFactory=null;
    		
    	        //a> 创建Configuraton对象:关联hibernate配置文件和对象映射信息
    		Configuration configuration=new Configuration().configure();
    		// 4.0之前这么创建
    		//sessionFactory=configuration.buildSessionFactory();
    		//b> 创建一个serviceRegistry对象:hibernate 4.x新添加对象
    		//   hibernate的任何配置和服务必须要在此对象中注册才能使用
    		ServiceRegistry serviceRegistry=
    				new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    		                                    .buildServiceRegistry();
    		
    		sessionFactory=configuration.buildSessionFactory(serviceRegistry);
    		//2.创建一个session对象
    		Session session=sessionFactory.openSession();
    		//3.开启事务
    		Transaction transaction=session.beginTransaction();
    		//4.执行保存操作
    		UserModel user=new UserModel("Java", "123qwe", "13626345190", "ddddd@126.com");
    		session.save(user);
    		//5.提交事务
    		transaction.commit();
    		//6.关闭session
    		session.close();
    		//7.关闭sessionFactory
    		sessionFactory.close();
    		
    	}
    }

      结束之后,用Junit Tester  运行,测试成功,并且在控制台打印出如下SQL语句:

      

    Hibernate: 
        insert 
        into
            USERMODEL
            (USERNAME, PASSWORD, PHONE, EMAIL) 
        values
            (?, ?, ?, ?)

       打开navicat,可以看到在库hibernate下已经自动生成了表usermodel,打开之后发现存在我们之前存入的数据。

      三、过程中出现的问题:

             我在开始配置完毕之后,启动之后发现报错,错误信息如下:

    ERROR: HHH000388: Unsuccessful: create table USERMODEL (ID integer not null auto_increment, USERNAME varchar(255), PASSWORD varchar(255), PHONE varchar(255), EMAIL varchar(255), primary key (ID)) type=InnoDB

    七月 16, 2015 8:46:55 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute

    ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=InnoDB' at line 8

              百度之后发现:因为type=InnoDB在5.0以前是可以使用的,但5.1之后就不行了。如果我们把type=InnoDB改为engine=InnoDB就不会有这个问题。但是,我想使用Hibernate,自动帮我建表,怎么办呢。这就与我们指定的数据库方言(dialect)有关了,之前数据库方言的配置是:

             <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

             于是将此配置修改为上述配置文件中的配置,即

             <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

             修改之后重新运行,运行正确,生成了表,也插入了数据。

           注:Hibernate版本为4.2.5,MySQL为5.6.20


  • 相关阅读:
    Linux下多进程编程消息队列
    Linux下多线程编程之——线程专有数据
    Linux下多线程编程之——线程互斥
    Linux下多线程编程之——线程竞争
    Linux下多线程编程之——线程取消
    Linux下多线程编程之——线程分离
    Linux下多线程编程之——多线程委托模型
    Postman 提交测试的时候提示 Bad Request
    Confluence 6 其他页面操作和页面大小
    Confluence 6 页面的组织和移动概述
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293782.html
Copyright © 2011-2022 走看看