hibernate02环境的搭建详解编程语言

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

 

创建一个java项目

hibernate02环境的搭建详解编程语言

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

hibernate02环境的搭建详解编程语言

hibernate02环境的搭建详解编程语言

hibernate02环境的搭建详解编程语言

hibernate02环境的搭建详解编程语言

把jar包放入项目中并引用

hibernate02环境的搭建详解编程语言

 

 创建对应的学生类

/** 
 * 学生的实体类 
 */ 
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 + "]"; 
    } 
 
}

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

hibernate02环境的搭建详解编程语言

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

hibernate02环境的搭建详解编程语言

 

hibernate02环境的搭建详解编程语言

修改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核心的配置文件并修改内容 

 

hibernate02环境的搭建详解编程语言

 

修改后的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>

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12118.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论