zoukankan      html  css  js  c++  java
  • hibernate02环境的搭建

    hibernate: 持久层的框架!
    是一个开放源代码的对象关系映射框架(ORM)!之前我们访问数据库使用JDBC!
    对JDBC进行了轻量级的对象封装!是一个全自动ORM框架!(底层可以自动生成sql语句)!
    使用面向对象的思想来操作数据库!

    创建一个java项目

    引入需要的hibernate需要的jar包以及连接数据库需要的驱动包

    把jar包放入项目中并引用

     创建对应的学生类

    复制代码
    /**
     * 学生的实体类
     */
    public class Student {
    
        private Integer id;
        private Integer age;
        private String name;// 和数据库中不一致 (sname)
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Student(Integer id, Integer age, String name) {
            super();
            this.id = id;
            this.age = age;
            this.name = name;
        }
    
        public Student() {
            super();
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + ", age=" + age + ", name=" + name + "]";
        }
    
    }
    复制代码

    创建对应的数据库中的学生表

    找到对应mapping映射文件,放在和实体类相同的包下!并修改其中的内容

    修改Student.hbm.xml文件之后的内容

    复制代码
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <!-- 映射文件  M   目的;实体类和 数据库中的表 产生关系 
    package:是说明我们需要映射的实体类的包名
    class  name:对应的是实体类的名称(如果省略了package属性,必须书写全类名)
    property,id  name:对应的是实体类中的属性名,如果和数据库中的字段一致,则可以省略column
     -->
    <hibernate-mapping package="cn.bdqn.bean">
      <class name="Student" table="stu">
          <id name="id">
          <!--主键生成策略  
          assigned:主键的生成值完全由用户决定,与底层数据库无关。
                  在调用session.save()之前必须指定主键值,否则会抛出异常!
          -->
            <generator class="assigned"/>
          </id>
          <!--配置其他属性的映射  -->
          <property name="age"/>
          <property name="name" column="sname"/>
      </class>
    </hibernate-mapping>
    复制代码

    找到hibernate核心的配置文件并修改内容 

    修改后的hibernate.cfg.xml文件内容

    复制代码
    <!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="connection.url">
            jdbc:oracle:thin:@localhost:1521:orcl
        </property>
        <property name="connection.username">t10</property>
        <property name="connection.password">t10</property>
        <property name="connection.driver_class">
            oracle.jdbc.OracleDriver
        </property>
        <!--方言  -->
        <property name="dialect">
            org.hibernate.dialect.Oracle9Dialect
        </property>
        <!--是否显示底层生成的sql语句  -->
        <property name="show_sql">true</property>
        <!--格式化生成的sql语句  -->
        <property name="format_sql">true</property>
        <!--加载我们配置的映射文件  全路径 -->
        <mapping resource="cn/bdqn/bean/Student.hbm.xml" />
    
    </session-factory>
    </hibernate-configuration>
    复制代码

    创建对应的测试类

    复制代码
    package cn.bdqn.test;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import cn.bdqn.bean.Student;
    
    /**
     * 
     * @author 小豆腐
     *                      以后的你,会感谢现在努力的自己!努力!坚持!不放弃!
     *                                                             
     *  hibernate核心的
     *  1个类
     *  01. 类  Configuration !对核心配置文件的读取!   
                                                          
     *  5个接口 
     *  01. SessionFactory:负责初始化hibernate需要的参数!在程序中有一个就够了!之后我们会写成单例模式!                                                         
     *  02. Session:不是我们的HttpSession(用户session)!  我们hibernate的session
     *      是用来操作对象(增删改查)!创建事务的对象!我们现在使用的session不是线程安全的!                                                       
     *  03. Transaction :进行事务的操作!
     *  04. Query :hibernate中查询的接口(sql , hql)
     *  05. Criteria  :和Query相似!但是做了一些封装!                                                       
     */
    public class StudentTest {
    
        // 新增学生信息
        @Test
        public void addStudent() {
            /**
             * 01.读取核心配置文件    因为我们需要的信息都在这个核心配置文件中(连接数据库的四要素,映射文件)    
             * configure()底层默认去src下面查询了hibernate.cfg.xml文件
             */
            Configuration configuration = new Configuration().configure();
            // 02.创建sessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 03.打开session
            Session session = sessionFactory.openSession();
            // 04.开启事务
            Transaction transaction = session.beginTransaction();
            // 05.创建一个Student对象
            Student student = new Student(400, 50, "小黄");
            // 06.持久化操作
            session.save(student);
            // 07.提交事务 的 会产生sql语句
            transaction.commit();
            // 08.关闭session
            session.close();
        }
    
        // 新增学生信息
        @Test
        public void addStudent2() {
            /**
             * 01.读取核心配置文件    因为我们需要的信息都在这个核心配置文件中(连接数据库的四要素,映射文件)    
             * configure()底层默认去src下面查询了hibernate.cfg.xml文件
             */
            Configuration configuration = new Configuration().configure();
            // 02.创建sessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 03.打开session
            Session session = sessionFactory.openSession();
            // 04.开启事务
            Transaction transaction = session.beginTransaction();
            // 05.创建一个Student对象
            Student student1 = new Student(50, 50, "小黄2");
            session.save(student1);
            Student student2 = new Student(60, 50, "小黄2");
            session.save(student2);
            Student student3 = new Student(7, "小黄2"); // 没有手动的给主键赋值,会抛出异常
            session.save(student3);
            /**
             * 07.提交事务      
             * student1  和student2  没有问题
             * 但是student3 报错了
             * 那么事务还会提交吗?  不会! ACID
    一致性: 原子性: 隔离性: 永久性:
             * 
             * 如果说 每个save()都会产生sql语句,与数据库产生交互! 这样数据库的压力大!
             * 怎么减轻?
             * 在commit()的时候,把之前的sql语句一起发送给数据库执行!
             */
            transaction.commit();
            // 08.关闭session
            session.close();
    
        }
    
    }
    复制代码

    hbm2ddl:属性值

    复制代码
    <!--是否显示底层生成的sql语句  -->
        <property name="show_sql">true</property>
        <!--格式化生成的sql语句  -->
        <property name="format_sql">true</property>
         
    
        <!--  hbm2ddl 
            01.create:每次运行都会删除上次生成的表!
            02.update:没有表会自动创建,如果有,新增数据!
            字段不一致,会按照hbm.xml文件中的column属性值 ,在数据库中新增一列
            03.validate:不会自动创建表,如果表存在,会新增数据!
            字段不一致,会抛出异常,说在数据库中没有该字段
            04.create-drop: 每次运行都会删除上次生成的表!sessionFactory关闭的时候,数据库中的表也会删除!
        -->
        <property name="hbm2ddl.auto">update</property>
    复制代码

    小结

    复制代码
    hibernate: 持久层的框架!
    是一个开放源代码的对象关系映射框架(OMR)!之前我们访问数据库使用JDBC!
    对JDBC进行了轻量级的对象封装!是一个全自动ORM框架!(底层可以自动生成sql语句)!
    使用面向对象的思想来操作数据库!
    
    Student  实体类
    Student.hbm.xml  mapping(映射文件)
    
    hibernate.cfg.xml:是整个hibernate框架的核心配置文件!
    01.管理mapping文件
    02.整个hibernate环境的配置
    03.连接数据库的四要素
    
    sql的四种语言:
    
    DDL:数据定义语言
    create    alter drop truncate
    DML: 数据操作语言
    select  insert  update delete 
    DCL: 数据控制语言
    grant  revoke
    TCL: 事务控制语言
    savepoint  
    rollback
    
    
        <!--  hbm2ddl 
        01.create:每次运行都会删除上次生成的表!
        02.update:没有表会自动创建,如果有,新增数据!
            字段不一致,会按照hbm.xml文件中的column属性值 ,在数据库中新增一列
        03.validate:不会自动创建表,如果表存在,会新增数据!
           字段不一致,会抛出异常,说在数据库中没有该字段
        04.create-drop:每次运行都会删除上次生成的表!  当sessionFactory关闭的时候,数据库中的表自动删除
         -->
        <property name="hbm2ddl.auto">update</property>
    
    
    oracle数据库创建序列
    create  sequence   sq_student_id
    minvalue 1
    maxvalue 9999999999
    start with 10
    incrment by 1
    cache 20; 
    
    
      <id name="id">
          <!--主键生成策略    
          01.assigned:
                       主键生成的值由用户决定,与底层数据库没有关系!
                      在调用session.save()之前,必须给主键赋值,否则会抛出异常!
          02.sequence:
           oracle支持的主键生成策略!hibernate会从数据库中取得当前的序列下一个值赋值给主键!
                       不需要我们给主键赋值!  
             <generator class="sequence">
              <param name="sequence">sq_student_id</param>
            </generator>
          03.identity :针对mysql数据库的主键自增
          04.increment:默认会在数据库中查询对应表中主键的最大值,(select max(id) from stu)
                        之后把值给主键!
              -->
              <generator class="increment"/>
          </id>
  • 相关阅读:
    转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
    转:git windows中文 乱码问题解决汇总
    git教程1
    刘汝佳黑书 pku等oj题目
    C/C++ qsort()快速排序用法
    char s[]字串和char *s字串有什麼区别?
    c语言‘’ ,‘0’, “0” ,0之间的区别
    带符号的char类型取值范围为什么是-128——127
    c语言memset详解
    【线性规划与网络流24题】孤岛营救问题 分层图
  • 原文地址:https://www.cnblogs.com/HHR-SUN/p/7181959.html
Copyright © 2011-2022 走看看