zoukankan      html  css  js  c++  java
  • hibernate第一天

    首先介绍一下javaEE开发的三层架构

      Web层    也被称为表现层    它是表现层的一个设计模型:也就是大家常用的MVC开发模式

      Service层   它是和需求相关的

      DAO层   它只和数据库打交道,对数据库进行增删改查(CURD)、

      Hibernate是持久层的框架   只能对数据库进行增删改查

      框架的底层其实就是web

      框架其实就是一个骨架,准备了大量代码:框架的目的就是抽取一些重复性结构的代码,减少程序的开发量 

           而hibernate主要就是替换DAO层的框架,hibernate操作简单,通过保存一个实体对象,自动将数据保存到数据库,形  两个步骤:描述一个实体对象,对应数据库的表

             描述实体的属性,对应数据库表中的字段

      Hibernate的环境搭建

       1、 创建一个项目,导入相关jar包,hibernate的必须包  mysql的jar包  日志包(非必须的包,日志包就是在控制台上打印执行的sql语句)

        2、创建实体类和对应的数据库

        3、创建一个映射文件  名称为(实体类.hbm.xml)

          描述实体类和数据库的关系

          描述实体类中字段和数据库表中字段的关系

          配置核心文件   文件需要在src下创建hibernate.cfg.xml

            配置文件中 基本配置   

                    基本四项(数据库驱动  连接串  用户名 和密码)、

            ·        其他配置

                    加载映射文件

            下面是一个示例配置

                  

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 约束 :规定xml的写法-->
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.itheima.domain" >
        <!--
            记忆性知识 
            1.配置 实体和数据库表的关系 
                <class> 描述实体和数据库表的关系 
                    name="" 实体的全限定类名  因为用到反射
                    table="" 对应的数据表名称
                    lazy 最后一节课
        
            非记忆性知识:
                catalog="" 数据库名称
                package="" 包的名称 如果有了此配置  以后在该包下的所有类 不需要写全限定类名 只需要类的名称
                    但是如果不是该包下的内容  需要配置全限定名
                length="" 表示字段的长度
                type=""  表示字段的类型
                    1.hibernate的类型  string 
                    2.java的类型 java.lang.String
                    3.数据库类型 varchar()
                        <column name="cust_name" sql-type="数据库类型"></column> 
                    但如果没写 默认使用实体类类的类型
            
        -->
        <class name="Customer" table="cst_customer" >
            <!-- 
                2.配置 实体字段和数据库表字段的关系 
                    2.1 特殊字段 id 
                        <id></id>
                            name="" 实体的属性名称 get/set方法 去掉get首字母小写
                            column="" 数据库表字段的名称
                            column="" 配置可以省略 前提是实体的字段名称 和数据库的字段名称必须保持一致
                            但开发中 实体字段使用驼峰式命名规则 cust_name ==>> custName
                            今天省略
                            
                            <generator class="native"></generator>
                            主键生成策略 class="native" 策略名称
                                native 表示使用数据库默认的本地策略
                                    oracle和mysql的主键生成策略不一样 
                                    mysql auto_increament 自动增长
                                    oralce sequence 序列
                                    native 自动根据数据库 自动匹配
                    2.2 普通字段
            -->
            <id name="cust_id" column="cust_id">
                <generator class="native"></generator>
            </id>
            
            <!-- 普通字段  -->
            <property name="cust_name" >
                <!-- <column name="cust_name" sql-type="数据库类型"></column> -->
            </property>
            <property name="cust_source" column="cust_source"></property>
            <property name="cust_industry" column="cust_industry"></property>
            <property name="cust_level" ></property>
            <property name="cust_phone" ></property>
            <property name="cust_mobile" ></property>
        </class>
    </hibernate-mapping>
      

    核心配置文件中的其他配置
        

    <?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 session的工厂  创建session对象

    此处的session 指的是java和 数据库的会话 

    session作用 : session内部封装了操作数据的api 等效以前的connction

     -->

    <session-factory>

    <!-- 1.基本四项 -->

    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

    <property name="hibernate.connection.url">jdbc:mysql:///ee291_hibernate_day01</property>

    <property name="hibernate.connection.username">root</property>

    <property name="hibernate.connection.password">root</property>

     

    <!-- 2.其他配置 从配置文件中找  都是优化内容-->

    <!-- 配置方言

    不同数据库的基本语法一致 但不同的数据库有自己的特色

    为了方便hibernate生成不同sql使用

     -->

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

    <!-- 在控制台上是否打印sql -->

    <property name="hibernate.show_sql">true</property>

    <!-- 格式化sql -->

    <property name="hibernate.format_sql">true</property>

    <!-- ddl : 数据库定义语言 怎么创建表 怎么删除表 怎么给表加字段 

    没用(测试使用 测试表结构)

    create-drop :

    先判断数据库存不存在表 如果存在删除 创建新表(根据xml来) 操作数据 操作完以后删除表

    数据库没有表 创建表的时候 xml没有指定长度 默认采用该字段的最大长度

    create

    先判断数据库存不存在表 如果存在删除 创建新表(根据xml来) 操作数据

    数据库有表且只有一条记录

    重要(上线使用)

    update   : 以xml为主 修改数据库(还是以数据库为主 先创建数据库 再写实体类)

    validate : 以数据库为主 如果不一致的情况数据库报错

    -->

    <property name="hibernate.hbm2ddl.auto">update</property>

     

    <!-- c3p0连接池 

    配置后报错

    org.hibernate.service.spi.ServiceException: Unable to create requested service

    [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]

    原因是 没有导入c3p0的连接池包

     

    org.hibernate.connection.C3P0ConnectionProvider 不是一个类 而是一个字符串

    org.hibernate.c3p0.internal.C3P0ConnectionProvider 这是一个类

    为什么俩个都可以? 字符串是以前hibernate的早期版本 处理版本兼容问题

    -->

    <!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->

    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>

     

     

     

    <!-- 3.加载映射 -->

    <mapping resource="com/itheima/domain/Customer.hbm.xml" />

    </session-factory>

     

     

    </hibernate-configuration>

     

     

    一个简单的demo

        

    public void demo2(){

         详解: 

      Configuration 加载配置文件

     *  new Configuration() 表示加载hibernate.properties文件

     *   .configure() 加载hibernate.cfg.xml

     *   .configure(路径) 加载hibernate.cfg.xml

     *   buildSessionFactory() 构建session工厂

     *   configuration.addResource(resourceName) 加载映射文件 在核心配置文件中加载过了

     *  configuration.addClass(Class)   加载实体类.class  要求 映射文件的名称必须是 实体类名.hbm.xml

     

     

      *SessionFactory 由Configuration加载核心配置文件创建(基本四项)

     * SessionFactory 作用 创建session对象

     * SessionFactory 加载需要浪费大量资源 工厂一般不关闭

        

        

        Configuration configuration = new Configuration().configure();

        SessionFactory sessionFactory = configuration.buildSessionFactory();

        Transaction transaction = session.beginTransaction();//开启事务

     

        Customer customer = new Customer();

        customer.setCust_name("门三三石22");

        session.save(customer);

     

        transaction.commit(); //事务提交

        session.close();

        sessionFactory.close();

        

      session对象内部封装了一套对数据库的增删改查的方法

     

      

      1.查询 get(Object)

     *  2.增加 save(Object)

     * 3.修改 update(Object)

     * 4.删除 delete(Object)

      只需要将需要操作的对象传入即可

      详细的操作可以在hibernate的doc文件中查找其具体操作方法

      

     

    }

  • 相关阅读:
    JavaScript 字符串常用操作
    Redis分布式锁
    CSS布局之-水平垂直居中
    vuejs学习笔记(1)--属性,事件绑定,ajax
    Angular.js学习笔记 (一)
    几年前写的一个支持多数据库切换的设计
    bundle中vim相关快捷键的使用
    使用Bundle进行VIM插件的管理
    javascript代码在线测试
    线程池的创建
  • 原文地址:https://www.cnblogs.com/dubin382460/p/7989369.html
Copyright © 2011-2022 走看看