zoukankan      html  css  js  c++  java
  • Hibernate初了解

    Hibernate是一个开放源代码的对象关系映射框架,

    它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,

    最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架(Object Relational Mapping)

    传统方式开发的时候,我们直接编写SQL语句来执行,

    而Hibernate将Java中的实体类与数据库的关系表建立一个映射,这样就可以操作Java中对象,从而操作数据库。

    为什么要使用Hibernate?

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

    搭建Hibernate环境

    1,首先下包导包,以下采用Hibernate 3最终版本,包下载地址:http://sourceforge.net/projects/hibernate/files/hibernate3

       对应的jar包:

    * hibernate3.jar
      * HIBERNATE_HOME/lib/required/*.jar
      * HIBERNATE_HOME/lib/jpa/hibernate-jpa-2.0-api-1.0.1.Final.jar
      * 导入日志记录的包:
        * log4j-1.2.16.jar
        * slf4j-log4j12-1.7.2.jar
      * 导入mysql数据库驱动

    2,创建表:(关系型数据库)

    1 create database hibernate3_day01;
    2 use hibernate3_day01;
    3 create table customer(
    4     id int primary key auto_increment,
    5     name varchar(20),
    6     age int
    7 );

    3,创建一个实体类:(面向对象)

     1 public class Customer {
     2     private int id;
     3     private String name;
     4     private int age;
     5     public int getId() {
     6         return id;
     7     }
     8     public void setId(int id) {
     9         this.id = id;
    10     }
    11     public String getName() {
    12         return name;
    13     }
    14     public void setName(String name) {
    15         this.name = name;
    16     }
    17     public int getAge() {
    18         return age;
    19     }
    20     public void setAge(int age) {
    21         this.age = age;
    22     }
    23 }

    这边int类型建议使用包装类型Integer,因为int默认值为0,而Integer默认值为null,方便确认数据情况

    接下就是把数据库表和实体类建立映射关系

    4,创建ORM的映射:

    映射文件一般来说只要是个xml格式文件就可以,但为了观看清晰,建议命名:实体类名称.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!-- 引入约束 -->
     3 <!DOCTYPE hibernate-mapping PUBLIC
     4         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     5         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     6 
     7 <hibernate-mapping>
     8     <!-- 建立类与表的映射 -->
     9     <!-- class标签:用于映射类与表的关系 name :类的全路径  table:表名称 -->
    10     <class name="com.emuii.bean.Customer" table="customer">
    11         <!-- 建立类中属性与表中的字段映射 -->
    12         <!-- 唯一标识 -->
    13         <!-- 使用id的标签 配置唯一属性 -->
    14         <!-- 在<id>标签中配置一个主键的生成策略. -->
    15         <id name="id" column="id">
    16             <generator class="native"/>
    17         </id>
    18 
    19         <!-- 普通属性 -->
    20         <!-- property标签:映射类中的普通属性 name:类中的属性名称, column:表中字段名称 -->
    21         <!--
    22             type:三种写法
    23                 * Java类型        :java.lang.String
    24                 * Hibernate类型    :string
    25                 * SQL类型        :不能直接使用type属性,需要子标签<column>
    26                     * <column name="name" sql-type="varchar(20)"/>
    27          -->
    28         <!--<property name="id">
    29             <column name="id" sql-type="int" />
    30         </property>-->
    31         <property name="name" column="name" type="string" length="20"/>
    32         <property name="age" column="age"/>
    33     </class>
    34 
    35 </hibernate-mapping>

    主键有自然主键和代理主键。

    自然主键:创建一个人员表,人员表中某条记录唯一确定,人都有身份证号,我们可以使用身份证号作为主键(身份证号本身就是人员的一个属性.作为主键)

    代理主键:创建一个人员表,人员表中某条记录唯一确定,但是没有使用身份证号作为主键,新建字段(用新建的字段作为主键,只是一个标识作用)

    在hibernate中我们尽量让hibernate自己去维护主键

    其中hibernate主键的生成策略展示以下几种:

    increment    :自动增长.适合 short int long...不是使用数据库的自动增长机制.使用Hibernate框架提供的自动增长方式。在集群下不要使用,因为有线程安全问题,其插入是先select max(id) from 表; 在最大值的基础上+1.(多线程的问题.)
      identity     :自动增长.适合 short int long...采用数据库的自动增长机制.不适合于Oracle数据库.
      sequence :序列.适用于 short int long ... 应用在Oracle上 .
      uuid          :适用于字符串类型的主键.采用随机的字符串作为主键.
      native       :本地策略.底层数据库不同.自动选择适用identity 还是 sequence.
      assigned  :Hibernate框架不维护主键,主键由程序自动生成.
      foreign      :主键的外来的.(应用在多表一对一的关系.)

    上表采用的是    navite

    <!-- 在<id>标签中配置一个主键的生成策略. -->
    15         <id name="id" column="id">
    16             <generator class="native"/>
    17         </id>

    5,创建Hibernate的核心配置文件在src下,命名 hibernate.cfg.xml

     核心配置有两种常用方式:属性文件和XML格式文件。

    属性文件:hibernate.properties 其内格式是  key =  value

    eg: hibernate.connection.driver_class=com.mysql.jdbc.Driver

    另外属性配置文件只能手动加载,

    生成Configuration对象,configuration.addResource("属性配置文件");

    下面展示xml格式的

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 
     3 <!DOCTYPE hibernate-configuration PUBLIC
     4         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     5         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     6 
     7 
     8 <hibernate-configuration>
     9     <session-factory>
    10         <!--必须去配置的属性-->
    11         <!--配置数据库连接的基本信息-->
    12         <property name="hibernate.connection.driver_class">
    13             com.mysql.jdbc.Driver
    14         </property>
    15         <property name="hibernate.connection.url">
    16             jdbc:mysql:///hibernate3
    17         </property>
    18         <property name="hibernate.connection.username">root</property>
    19         <property name="hibernate.connection.password">123</property>
    20 
    21         <!--生成hibernate的方言-->
    22         <!--生成底层SQL不同的-->
    23         <property name="hibernate.dialect">
    24             org.hibernate.dialect.MySQLDialect
    25         </property>
    26 
    27         <!-- C3P0连接池设定-->
    28         <!-- 使用c3po连接池  配置连接池提供的供应商-->
    29         <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider                                                                                                                                        </property>
    30         <!--在连接池中可用的数据库连接的最少数目 -->
    31         <property name="c3p0.min_size">5</property>
    32         <!--在连接池中所有数据库连接的最大数目  -->
    33         <property name="c3p0.max_size">20</property>
    34         <!--设定数据库连接的过期时间,以秒为单位,
    35         如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
    36         <property name="c3p0.timeout">120</property>
    37         <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
    38         <property name="c3p0.idle_test_period">3000</property>
    39 
    40         <!-- 可选的属性 -->
    41         <!-- 显示SQL一条到底,不美观 -->
    42         <property name="hibernate.show_sql">true</property>
    43         <!-- 格式化SQL让语句看起来更美观 -->
    44         <property name="hibernate.format_sql">true</property>
    45         <!--自动提交,一般为false-->
    46         <property name="hibernate.connection.autocommit">false</property>
    47         <!-- hbm:映射 to DDL: create drop alter -->
    48         <!--create: 每次执行创建一个新表(如果以前有该表,删除重建)-->
    49         <!--create-drop: 每次执行的时候,创建一个新的表,程序执行结束后将这个表,删除掉了-->
    50         <!--update: 如果数据库中没有表,创建一个新的表,如果有了,直接使用这个表.可以更新表的结构-->
    51         <!--validate: 会使用原有的表.完成校验.校验映射文件与表中配置的字段是否一致.不一致报错-->
    52         <property name="hibernate.hbm2ddl.auto">update</property>
    53 
    54         <!-- 通知Hibernate加载那些映射文件 -->
    55         <mapping resource="com/emuii/bean/Customer.hbm.xml" />
    56     </session-factory>
    57 </hibernate-configuration>

     其中可选属性一条是52 <property name="hibernate.hbm2ddl.auto">update</property>参数详情xml已经注释。

    如果没在xml中加载映射文件,同样地和加载属性配置文件一样,需要手动加载configuration.addResource("com/emuii/bean/Customer.hbm.xml");

    另外hibernate默认连接方式不是c3p0,这边要自己配置,如上。

    6,接下来就是测试,向数据库中插入一条记录

     1 @Test
     2 //向数据库中插入一条记录
     3 public void demo1() {
     4 
     5     //1,hibernate框架加载核心配置文件(有数据库连接信息)
     6     Configuration configuration = new Configuration().configure();
     7 
     8     //2,创建一个SessionFactory(获得session-相当连接对象)
     9     SessionFactory sessionFactory = configuration.buildSessionFactory();
    10 
    11     //3,获得session对象
    12     Session session = sessionFactory.openSession();
    13 
    14     //4,默认的情况下事务是不自动提交的
    15     Transaction tx = session.beginTransaction();
    16 
    17     //5,业务逻辑操作
    18 
    19     //向数据库中插入一条记录
    20     Customer customer = new Customer();
    21     customer.setName("司欧克");
    22     customer.setAge(16);
    23 
    24     //保存记录
    25     session.save(customer);
    26 
    27     //6,事务提交
    28     tx.commit();
    29 
    30     //7,释放资源
    31     session.close();
    32     sessionFactory.close();
    33 }

    查看数据库应该可以发现多了一条记录。

  • 相关阅读:
    HttpClientUtil
    JacksonUtils
    spring-security oauth2.0简单集成
    python连接mysql
    钉钉机器人消息体
    Android Studio gradle
    Android Studio从Eclipse导项目
    Docker
    Unity WebGL
    主席树
  • 原文地址:https://www.cnblogs.com/lesliehe/p/7992618.html
Copyright © 2011-2022 走看看