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>
     原子性:
  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/999-/p/6364584.html
Copyright © 2011-2022 走看看