zoukankan      html  css  js  c++  java
  • Hibernate框架学习(一)——入门

    一、框架是什么

    1、框架是用来提高开发效率的

    2、封装好了一些功能,我们需要使用这些功能时,调用即可,不需要手动实现

    3、框架可以理解成一个半成品的项目,只要懂得如何驾驭这些功能即可

    二、hibernate框架是什么

    三、hibernate

    1、操作数据库的时候,可以以面向对象的方式来完成,不需要书写SQL语句

    2、hibernate是一款orm框架

      1)orm:object relating mapping.对象关系映射

      2)

      3)orm分4级

        hibernate属于4级:完全面向对象操作数据库

        mybatis属于2级

        dbutils属于1级

    四、hibernate框架的搭建

    1、下载Hibernate5

    https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

     下载之后解压目录结构如下:

    documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档

    lib文件夹:存放Hibernate编译和运行所依赖的Jar包,其中required子目录下包含了运行Hibernate5项目必须的jar包

    project文件夹:存放Hibernate各种相关的源代码

    2、创建数据库和表

    3、引入Hibernate的开发包

    数据库安装包:

    Hibernate/lib/required/*.jar:

    日志记录的包:

    4、创建实体(持久化类)

    Hibernate使用普通Java对象(Plain Old Java Object),即POJO的编程模式来进行持久化,POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问,对外部隐藏了内部的实现细节。

     1 package cn.itheima.domain;
     2 
     3 public class Customer {
     4     private Long cust_id;
     5     private String cust_name;
     6     private String cust_source;
     7     private String cust_industry;
     8     private String cust_level;
     9     private String cust_linkman;
    10     private String cust_phone;
    11     private String cust_mobile;
    12     ......
    13 }

    5、创建映射文件

    实体类Customer目前不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的哪个属性对应数据库的表中的哪个字段,这些都需要在映射文件中配置。

    先导入约束(window--->Preferences--->XML--->XML Catalog--->User Specified Entries窗口,点击Add按钮)

    在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3      "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     4      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping>
     6     <!-- 建立类和表的一个映射关系 -->
     7     <!-- 
     8         class标签:用来建立类和表的映射
     9             *name属性:类中的全路径
    10             *table属性:表名(如果类名和表名一致,那么table属性可以省略)
    11             *catalog属性:数据库名称,可以省略
    12      -->
    13     <class name="cn.itheima.domain.Customer" table="cst_customer">
    14     
    15         <!-- 建立类中的属性与表中的主键的映射 -->
    16         <!-- 
    17             id标签:用来建立类中的属性与表中的主键字段对应
    18                 *name属性:类中的属性名
    19                 *column属性:表中字段名(如果类中的属性名和表中字段名一致,那么column属性可以省略)
    20                  *length属性:字段的长度
    21                  *type属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型
    22          -->
    23         
    24         <id name="cust_id" column="cust_id">
    25             <!-- 主键生成策略 -->
    26             <generator class="native"></generator>
    27         </id>
    28         
    29         <!-- 建立类中普通属性与表中的字段的映射 -->
    30         <!-- 
    31             property标签:用来建立类中的普通属性与表中的字段的对应
    32             *name属性:类中的属性名
    33             *column属性:表中字段名(如果类中的属性名和表中字段名一致,那么column属性可以省略)
    34              *length属性:字段的长度
    35              *type属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型     
    36          -->
    37          
    38         <property name="cust_name" column="cust_name"></property>
    39         <property name="cust_source" column="cust_source"></property>
    40         <property name="cust_industry" column="cust_industry"></property>
    41         <property name="cust_level" column="cust_level"></property>
    42         <property name="cust_linkman" column="cust_linkman"></property>
    43         <property name="cust_phone" column="cust_phone"></property>
    44         <property name="cust_mobile" column="cust_mobile"></property>
    45     </class>
    46 </hibernate-mapping>

    6、创建Hibernate的核心配置文件(必选配置4+1、可选配置3、orm元数据引入)

    Hibernate的配置文件主要用来配置数据库连接以及Hibernate运行时所需要的各个属性的值。在src下创建一个名称为hibernate.cfg.xml文件。

     在解压过后的Hibernate5目录下,点击project,选择etc文件,打开hibernate.properties,分别查找(Ctrl+f)MYSQL,show,hbm2

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6     <session-factory>
     7     <!-- 
     8         #hibernate.dialect org.hibernate.dialect.MySQLDialect
     9         #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
    10         #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
    11         #hibernate.connection.driver_class com.mysql.jdbc.Driver
    12         #hibernate.connection.url jdbc:mysql:///test
    13         #hibernate.connection.username gavin
    14         #hibernate.connection.password    
    15      -->
    16          <!-- 数据库驱动 -->
    17         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    18         <!-- 数据库URL -->
    19         <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
    20          <!-- 数据库连接用户名 -->
    21         <property name="hibernate.connection.username">root</property>
    22          <!-- 数据库连接密码 -->
    23         <property name="hibernate.connection.password">123456</property>
    24         <!-- 数据库方言
    25             不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
    26             sql99标准: DDL 定义语言  库表的增删改查
    27                       DCL 控制语言  事务 权限
    28                       DML 操纵语言  增删改查
    29             注意: MYSQL在选择方言时,请选择最短的方言.
    30          -->
    31         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    32         
    33     <!-- #hibernate.show_sql true 
    34          #hibernate.format_sql true
    35     -->
    36         <!-- 将hibernate生成的sql语句打印到控制台 -->
    37         <property name="#hibernate.show_sql">true</property>
    38         <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
    39         <property name="#hibernate.format_sql">true</property>
    40         
    41     <!-- 
    42         ## auto schema export  自动导出表结构. 自动建表
    43         #hibernate.hbm2ddl.auto create        自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
    44         #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
    45         #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
    46         #hibernate.hbm2ddl.auto validate    校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
    47      -->
    48         <property name="hibernate.hbm2ddl.auto">update</property>
    49         <!-- 引入orm元数据
    50             路径书写: 填写src下的路径
    51          -->
    52         <mapping resource="cn/itheima/domain/Customer.hbm.xml"/>
    53     </session-factory>
    54 </hibernate-configuration>

    7、书写测试代码

     1 package cn.itheima.a_hello;
     2 
     3 import org.hibernate.Transaction;
     4 import org.hibernate.Session;
     5 import org.hibernate.SessionFactory;
     6 import org.hibernate.cfg.Configuration;
     7 import org.junit.Test;
     8 
     9 import cn.itheima.domain.Customer;
    10 
    11 //测试Hibernate框架
    12 public class Demo {
    13 
    14     @Test
    15     //保存客户
    16     public void fun1(){
    17         Configuration  conf=new Configuration().configure();
    18         
    19         SessionFactory sessionFactory=conf.buildSessionFactory();
    20         Session session=sessionFactory.openSession();
    21         Transaction tx=session.beginTransaction();
    22         //===============================
    23         Customer c=new Customer();
    24         c.setCust_name("百度公司");
    25         
    26         session.save(c);//执行保存
    27         //===============================
    28         tx.commit();
    29         session.close();
    30         sessionFactory.close();
    31     }
    32 }

    遇到的问题:

    1)报错org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found : cn.itheima.domain.Custom

    该异常为:hibernate的映射找不到异常,即映射资源找不到

    修改配置文件的路径(hibernate.cfg.xml中的Customer.hbm.xml文件),这样就可以加载到映射配置文件。

    2)报错org.hibernate.exception.GenericJDBCException: could not execute statement

    数据库中的表的id属性,设置了主键,但是忘记了将自动递增选项勾上

    3)hibernate写入mysql中文乱码

    在项目的hibernate的配置文件hibernate.cfg.xml里修改name为“hibernate.connection.url"的property的值为:

    运行成功后,表cst_customer中多了一条记录,如下:

  • 相关阅读:
    浏览器缓存机制
    linux mail命令用法
    linux下Memcached安装以及PHP的调用
    JAVA和C# 3DES加密解密
    C++中函数调用时的三种参数传递方式详解

    const的用法,特别是用在函数前面与后面的区别!
    海底捞的“七宗罪”
    解决Qt5.7.0 cannot find -lGL
    怎么删除桌面右键"打开好桌道壁纸"
  • 原文地址:https://www.cnblogs.com/cxq1126/p/8361208.html
Copyright © 2011-2022 走看看