hibernate教学01基本的搭建和注意的事项

Hibernate学习

1. 入门和基本的操作


  1. 知识点回顾 web 三层架构和 mvc 思想

    ​ 三层的结构

     1. dao层 
       	1. 对于数据库的操作crud
     2. service层
     3. 控制层(视图层)
    

    ​ mvc的思想

    ​ m:代表的是模型

    ​ c:代表的是控制器

    ​ v:代表的是视图

  2. hibernate 的概述

    1. 什么是框架
      1. 我们在编写一个程序的时候 我们使用框架可以帮我们简化一部分的操作
    2. 什么是hibernate
      1. hibernate是使用在我们三层架构中的层的框架
      2. 在dao层我们主要实现的是对于数据库的增删改查,我们是使用hibernate的目的,hibernate的底层的代码实际上就是jdbc(封装思想)
      3. 使用hibernate的好处,需要书写复杂的jdbc的代码,不需要书写很多的sql就可以实现功能(即使有点也是缺点)
      4. hibernate是一个开源的项目
    3. 什么是orm
      1. hibernate使用的是orm思想对于数据库完成crud的操作
      2. 在javaweb阶段学习的javaBean 他有一种更加正确的叫法 实体类
      3. orm指的是:对象关系映射
      4. 让实体类和数据库中的表产生一一对应的关系 实体类中的属性对应数据表中的字段
      5. 我这个时候就不需要直接操作数据库中的表而是直接操作实体类
  3. hibernate的入门案例

    1. 首先我们需要搭建环境

      1. <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
        
            <groupId>org.example</groupId>
            <artifactId>Hibernate_xuexi</artifactId>
            <version>1.0-SNAPSHOT</version>
            <dependencies>
                <dependency>
                    <groupId>org.dom4j</groupId>
                    <artifactId>dom4j</artifactId>
                    <version>2.1.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.geronimo.specs</groupId>
                    <artifactId>geronimo-jta_1.1_spec</artifactId>
                    <version>1.1.1</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate.common</groupId>
                    <artifactId>hibernate-commons-annotations</artifactId>
                    <version>5.0.4.Final</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>5.3.7.Final</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate.javax.persistence</groupId>
                    <artifactId>hibernate-jpa-2.1-api</artifactId>
                    <version>1.0.2</version>
                </dependency>
                <dependency>
                    <groupId>org.jboss</groupId>
                    <artifactId>jandex</artifactId>
                    <version>2.0.5.Final</version>
                </dependency>
                <dependency>
                    <groupId>org.javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>3.23.2-GA</version>
                </dependency>
                <dependency>
                    <groupId>org.jboss.logging</groupId>
                    <artifactId>jboss-logging</artifactId>
                    <version>3.3.2.Final</version>
                </dependency>
                <dependency>
                    <groupId>antlr</groupId>
                    <artifactId>antlr</artifactId>
                    <version>2.7.7</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-entitymanager</artifactId>
                    <version>6.0.0.Alpha6</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.45</version>
                </dependency>
                <dependency>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                    <version>1.2.14</version>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                    <version>1.7.30</version>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                    <version>2.0.0-alpha1</version>
                </dependency>
            </dependencies>
        
        </project>
        
    2. 创建实体类

      1. package cn.itcast.enpity;
        
        public class User {
            /*
            Hibernate 要求实体类中有一个唯一的值 (一般是id)
             */
            private int uid;
            private String userName;
            private String address;
            private String password;
        
            public int getUid() {
                return uid;
            }
        
            public String getUserName() {
                return userName;
            }
        
            public String getAddress() {
                return address;
            }
        
            public String getPassword() {
                return password;
            }
        
            public void setUid(int uid) {
                this.uid = uid;
            }
        
            public void setUserName(String userName) {
                this.userName = userName;
            }
        
            public void setAddress(String address) {
                this.address = address;
            }
        
            public void setPassword(String password) {
                this.password = password;
            }
        }
        
        
    3. 不需要我们手动的创建数据表hibernate可以帮我们创建数据表

    4. 需要配置实体类和你的数据表的一一对应的关系(mapping):使用配置文件来实现的

      1. 创建xml的配置文件

      2. 创建的位置建议创建在你的实体类的位置创建

      3. 建议的名字 实体类名称.hbm.xml

      4. 首先我们需要引入约束

      5. 配置一对一的关系

      6. <?xml version="1.0" encoding="UTF-8" ?>
        <!--
            引入的是一个公共的基站
            名字是"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            url地址是:"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        -->
        <!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="cn.itcast.enpity.User" table="t_user">
        <!--
                配置实体类中的ID和表中的ID相互的对应
                hibernate要求实体类中有一个属性作为唯一的一个值
                hibernate要求我们表里面的一个字段作为唯一的值
        -->
        <!--
            id标签:
            属性1 name属性: 实体中id的名字
            属性2 column属性: 生成的表中字段的名称
        -->
                <id name="uid" column="uid">
        <!--
            需要设置数据库id的增长的策略
            native:可以设置为主键和自动增长
        -->
                    <generator class="native"></generator>
                </id>
        <!--        配置其他的属性和数据表的对应的关系-->
        <!--
                属性1 name属性: 实体中id的名字
            属性2 column属性: 生成的表中字段的名称
        -->
                <property name="userName" column="user_name"></property>
                <property name="password" column="password"></property>
                <property name="address" column="address"></property>
            </class>
        </hibernate-mapping>
        
  4. hibernate的配置文

    1. 创建Hinernate的核心的配置文件

    2. 核心配置文件的名称和位置是固定的

    3. 位置文件的位置必须在src的下面

    4. 名称必须叫hibernate.cfg.xml

    5. hibernate 在加载的过程中只会加载核心的配置文件

    6. 引入约束

      1. <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
        
    7. 主要配置3个方面

      1. 指定数据库()
      2. 配置hibernate的信息
      3. 指定映射文件
    8. 详细的配置

      1. <?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>
                <property name="hibernate.connection.url">jdbc:mysql://49.232.126.85:13306/xzytest</property>
                <property name="hibernate.connection.username">root</property>
                <property name="hibernate.connection.password">Devmysql8888!</property>
        <!--        hibernate的信息(可选)-->
        <!--        展示底层的sql语句-->
                <property name="hibernate.show_sql">true</property>
        <!--        对于我们底层的sql语句格式化(知识显示的格式不同)-->
                <property name="hibernate.format_sql">true</property>
        <!--        hibernate我们可以配置自动的创建表-->
        <!--
                update 表示的是如果我们已经有了数据表会帮助我们更新数据表
                没有数据表他会帮助我们创建数据表
        -->
                <property name="hibernate.hbm2ddl.auto">update</property>
        <!--
            配置数据库的方言
            比如说 limit关键字只可以使用在MySQL中而其他的数据是没有这个关键字的
            在oracle中实现分页的关键字是rownumber
            让我们hibernate框架识别不同的数据库的特有的语句
        -->
                <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--        指定映射文件(必须的)-->
                <mapping resource="cn/itcast/enpity/User.hbm.xml"></mapping>
            </session-factory>
        </hibernate-configuration>
        
      2. 测试添加的操作

        1. 加载核心的配置文件
        2. 创建一个SessionFactory对象()
        3. 使用sessionFactory可以创建session对象
        4. 开启事物(多个操作要不都成功要不都失败)
        5. 写具体的逻辑实现crud的操作
        6. 提交事物
        7. 关闭资源

        代码实现:

        package cn.itcast.hibernate.test;
        
        import cn.itcast.enpity.User;
        import org.hibernate.Session;
        import org.hibernate.SessionFactory;
        import org.hibernate.Transaction;
        import org.hibernate.cfg.Configuration;
        import org.junit.Test;
        
        public class HibernateTest {
            @Test
            public void test1(){
        //        1. 加载核心的配置文件
        //        在hibernate中给我们封装了这么一个对象
        //        做的事情是这个对象会在src下寻找hibernate.cfg.xml文件
                Configuration cfg = new Configuration();
        //        调用方法加载配置文件
                cfg.configure();
        //        2. 创建一个SessionFactory对象()
        //        读取核心的配置文件,创建sessionFactory对象
        //        同时会根据你的映射的关系创建出你的数据表
                SessionFactory sessionFactory = cfg.buildSessionFactory();
        //        3. 使用sessionFactory可以创建session对象
        //        我们可以把这个session对象理解为我们向数据库创建连接
                Session session = sessionFactory.openSession();
        //        4. 开启事物(多个操作要不都成功要不都失败)
                Transaction transaction = session.beginTransaction();
        //        5. 写具体的逻辑实现crud的操作
                //添加的思想
        //        创建实体类的对象
                User user = new User();
                user.setUserName("xxx");
                user.setAddress("xxx xxxx");
                user.setPassword("zhubajei147258");
        //        调用sessio的方法实现添加
                session.save(user);
        //        6. 提交事物
                transaction.commit();
        //        7. 关闭资源
                session.close();
                sessionFactory.close();
        
            }
        
        }
        
        
        
      3. 如果插入中文乱码的解决的方法

        1. package cn.itcast.dialect;
          
          import org.hibernate.dialect.MySQL5Dialect;
          
          public class MysqlDialect extends MySQL5Dialect {
              @Override
              public String getTableTypeString() {
                  return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
              }
          }
          

    映射文件需要注意的问题:

     1. 文件名和位置没有特殊的要求
     2. class标签name属性编写的是全路径
     3. id标签和property标签name属性编写的是类的属性 column是可以省略不写的,,默认表的字段=类的属性
     4. property标签的type属性表示的是,生成字段的数据类型(这表示你可以手动的指定)
    
    创建实体类的时候hibernate建议我们使用的是包装类 不建议使用基本的数据类型
     1. int---Integer
     2. cahr--Character
     3. 其他的都是首字母大写
    
    为什么使用包装类不用基本数据类型

    比如学生什么分数问题 如果我们让分数为0分代表的是个人的考试得到的分数 但是无法表示缺考的 基本数据类型是不可以赋值为null的

hibernate的api的使用

创建sessionFactory的过程中是非常的耗费资源的(解决的方法)

  1. 在hibernate中建议的是在整个项目中只创建1个sessionFactory对象

  2. 具体的实现

    1. 创建一个工具类

    2. 写一个静态的代码块实现

    3. 静态代码块的特点是类在加载的时候执行(但是只会执行一次)

      package cn.itcast.utils;
      
      import org.hibernate.SessionFactory;
      import org.hibernate.cfg.Configuration;
      
      public class HibernateSessionFactoryUtils {
          private static Configuration configure = null;
          private static SessionFactory sessionFactory =null;
          //静态代码块实现
          static {
              //加载核心的配置文件
              configure = new Configuration().configure();
              sessionFactory= configure.buildSessionFactory();
          }
          //提供方法返回sessionFactory
          public static SessionFactory getSessionFactory() {
              return sessionFactory;
          }
      }
      
       ```
      
      1. 中文乱码补充解决:

        1. <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
          
        2. session对象

          1. 类似于jdbc中的connection对象
          2. 调用session的不同的方法可以实现crud的操作
            1. 添加的方法(save)
            2. 修改update
            3. 删除delete
            4. 根据id查询 get方法
          3. session是一个单线程对象(无法共用
        3. 事物对象中主要有两个操作

          1. 事物的提交
          2. 事物的回滚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值