zoukankan      html  css  js  c++  java
  • Hibernate学习(一)

    搭建环境

    1、创建普通的Java工程

    2、添加相应的jar包,下载链接:https://files.cnblogs.com/files/AmyZheng/required.rar

    第一个实例

    1、引用jar包

    2、创建数据库和表

    DROP TABLE IF EXISTS t_customer ;
    
    CREATE TABLE t_customer (
        id  INT(5) PRIMARY KEY ,
        email  VARCHAR(60)  UNIQUE NOT NULL,
        password VARCHAR(32) NOT NULL ,
        nickname VARCHAR(150) ,
        gender VARCHAR(3) ,
        birthdate DATE ,
        married     CHAR(1)
    );

    3、创建一个Customer类

    package ecut.orm.entity;
    
    import java.util.Date;
    
    /**
     * source命令加上 .sql的完整路径导入来创建表
     * 实体类 Customer <================> 数据库表: t_customer
     *            属性            <================>        列
     *        id                 <================>       id
     *        emial             <================>         email
     *        password     <================>         password
     *        nickname         <================>         nickname
     *        gender         <================>         gender
     *        birthdate     <================>         birthdate
     *        married         <================>         married
     *        
     *        从对象到关系型数据库之间的映射(对应关系) object relation mapping
     *   new Customer();         <==========>    一条记录 (关系)
     *   
     *   hibernate作用 :把对象存入数据库变成记录或者从数据库查询一条记录包装成一对象个(orm框架)
     *   
     */
    public class Customer {
    
        // 对象标识符 ( Object Identifier,id的值是对象标识符 ) 属性 ( 对应数据库主键 )
        private Integer id;
        
        private String email;
        private String password;
        private String nickname;
        private char gender;
        private Date birthdate;
        private boolean married;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getNickname() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    
        public char getGender() {
            return gender;
        }
    
        public void setGender(char gender) {
            this.gender = gender;
        }
    
        public Date getBirthdate() {
            return birthdate;
        }
    
        public void setBirthdate(Date birthdate) {
            this.birthdate = birthdate;
        }
    
        public boolean isMarried() {
            return married;
        }
    
        public void setMarried(boolean married) {
            this.married = married;
        }
    
    }

    我们接下来要做的事情就是实现表和实体类中的映射,即类中属性要和表中的列相对应, hibernate的作用就是把对象存入数据库变成记录或者从数据库查询一条记录包装成一对象个(object relational mapping框架)。

    4、编写映射文件(以hbm.xml为后缀)

    首先将jar中的dtd文件保存在本地,依据hibernate-core-5.2.10.Final.jar中的/org/hibernate/hibernate-mapping-3.0.dtd编写Customer.hbm.xml

     让Eclipse支持映射文件的智能提示,将dtd文件复制到容易查找的目录下,在Eclipse的导航选择Widow下的preferences,选择如下目录

    点击Add,显示如下页面,Key Type选择URI

     Location 选择dtd文件所在路径,Key填http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd

     根据dtd文件的提示编写配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 映射文件告诉hibernate列与属性的对应关系  -->
    
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
    
        <!-- 指定 那个类 ( name 指定类名 ) 对应 那个表 ( table 指定表名 ) -->
        <class name="ecut.orm.entity.Customer" table="t_customer">
        
            <!-- 对于 与 数据库主键 对应的 对象标识符属性 来说,要单独使用 id 标签来映射 
                    <id name="id" type="java.lang.Integer" column="id" >即使不指定完整类名也可以通过id的类型反射来确定
                    <id name="id" type="int" column="id" >
            -->
            <id name="id" type="integer" column="id" >
                <generator class="increment" /> <!-- 由 hibernate 提供的 对象标识符 生成策略 -->
            </id>
        
            <!-- 指定 那个属性 ( name 指定属性名 )  对应 那个列 ( column 属性指定 列名 ) -->
            <property name="email" type="string" column="email" />
            <!-- 使用 type 属性指定 映射类型 ( 既不是 Java 类型,也不是 数据库类型,而是 中间类型 ( 媒婆 ) ) -->
            <property name="password" type="string" column="password" />
            <property name="nickname" type="string" column="nickname" />
            <!-- Java 中的 char 类型在 hibernate 中对应的映射类型是 character -->
            <property name="gender" type="character" column="gender" />
            <property name="birthdate" type="date"  column="birthdate" />
            <!-- Java 中的 boolean  类型在 hibernate 中对应的映射类型可以是 true_false 、yes_no(true就存y,fals 存y),bit(存0,1)-->
            <property name="married" type="yes_no" column="married" />
        
        </class>
        
    </hibernate-mapping>

     class标签内必须要有id标签,要使用 id 标签来单独映射与 数据库主键 对应的 对象标识符属性,使用property标签中通过指定name和column使数据库中的列和类中的属性相关联,且需要使用 type 属性指定 映射类型 ( 既不是 Java 类型,也不是 数据库类型,而是 中间类型 )。

    5、创建Hibernate的配置文件hibernate.cfg.xml(以cfg.xml为后缀)

    首先将jar中的dtd文件保存在本地,依据hibernate-core-5.2.10.Final.jar中的/org/hibernate/hibernate-configuration-3.0.dtd编写hibernate.cfg.xml

     根据上面映射文件一样的方式,让Eclipse支持struts.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 name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <!-- & 符号需要转义 为&amp; -->
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF8</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">123456</property>
    
            <!--  通用性的工具,对所有的数据库都是通用的,所以还需要根据所用数据库的类型指定数据方言类(在hibernate core 包中的dialect中)-->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            
            <!-- 指示是否显示 执行过的 SQL 语句 -->
            <property name="show_sql">true</property>
            <!-- 指示是否对 SQL 语句进行格式化输出 -->
            <property name="format_sql">true</property>
            <!--导入映射文件  -->
            <mapping resource="ecut/orm/entity/Customer.hbm.xml"/>
            
        </session-factory>
    
    </hibernate-configuration>

    在hibernate配置文件配置数据库相关信息,并指定数据方言,最重要要的是导入映射文件。

    6、编写测试类

    DML语句的测试案例:

    package ecut.orm.test;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    import ecut.orm.entity.Customer;
    
    public class TestSaveCustomer {
    
        public static void main(String[] args) {
            
            // 对象 <======>  记录
            Customer c = new Customer();
            
            // c.setId( 100 ); // 不要指定 对象标识符 ,而是期望由 Hibernate 维护
            c.setEmail( "sanfeng@qq.com" );
            c.setPassword( "hello2017" );
            
            Date birthdate = null ;
            c.setBirthdate( birthdate );
            c.setGender( '男' );
            
            c.setNickname( "君宝" );
            c.setMarried( false );
            
            // 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
            Configuration config = new Configuration();
            // 读取配置文件
            config.configure("ecut/orm/hibernate.cfg.xml");
            //config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件
            
            // 使用 Configuration 创建 SessionFactory
            SessionFactory factory = config.buildSessionFactory();
            
            // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
            Session session = factory.openSession();
            
            System.out.println( session );
            
            // 如果执行的是 DML 语句,则需要 开启事务
            session.getTransaction().begin();
            
            // 保存指定的对象 到数据库中
            Serializable s = session.save( c ); // DML(数据操纵语言) : insert 、update 、delete 
            System.out.println( "返回 : " + s );
            
            // 如果执行的是 DML 语句,则需要 提交事务
            session.getTransaction().commit();
            
            session.close();
            
            factory.close();
            
        }
    
    }

    通过Configuration类读取配置文件hibernate.cfg.xml,再通过这个Configuration 对象创建 SessionFactory,再创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 ),通过这个session对象完成数据库操作。如果执行的是DML语句还需要开启事务。

    查询的测试案例:

    package ecut.orm.test;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    import ecut.orm.entity.Customer;
    public class TestGetCustomer {
    
        public static void main(String[] args) {
            
            // 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
            Configuration config = new Configuration();
            // 读取配置文件
            config.configure("ecut/orm/hibernate.cfg.xml");
            //config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件
            
            // 使用 Configuration 创建 SessionFactory
            SessionFactory factory = config.buildSessionFactory();
            
            // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
            Session session = factory.openSession();
            
            System.out.println( session );
            
            Customer c  = session.get( Customer.class ,  2 );
            
            System.out.println( c.getEmail() );
            
            session.close();
            
            factory.close();
            
        }
    
    }

    转载请于明显处标明出处:

    https://www.cnblogs.com/AmyZheng/p/9300838.html

  • 相关阅读:
    bzoj2763 [JLOI]飞行路线 分层图最短路
    [模板]分块/可修改莫队 (数颜色种类)
    gcd步数
    洛谷2378 因式分解 字符串
    bzoj1090 字符串折叠
    洛谷1034 NOIP2002 矩形覆盖
    Codeforces#441 Div.2 四*题
    SPFA的小优化
    洛谷1073 NOIP2009 最优贸易
    bzoj2100 [Usaco2010 DEC]Apple Delivery苹果贸易
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9300838.html
Copyright © 2011-2022 走看看