hibernate学习笔记(一)

Hibernate

1.hibnate是什么

1.Hibernate是一个开发源代码的对象关系映射框架(ORM);

2.对JDBC进行了轻量级的封装,可以将实体类和数据库中的表产生映射关系;

3.是一个全自动的ORM框架;hibernate能自动生成sql语句;

2.hibnate的概念

hibernate简要结构图,中间的hibernate.properties,可以让数据持久化,这里面我们换成***.cfg.xml,表与属性名对应

全面解决”的体系结构方案

3.Hibernate提供了5种检索对象的方式

     1.导航对象图检索方式:根据已经加载的对象导航到其他对象
          from  Emp e group by e.dept.deptName
     2.OID检索方式:按照对象的OID来检索对象  get/load
     3.HQL检索方式:使用面向对象的HQL查询语言  from Student
     4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,
         提供了更加面向对象的查询接口
     5.本地SQL检索方式:使用本地数据库的SQL查询语句
          createSqlQuery();

 1.2核心配置文件hibernate.cfg.xml

<?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">

头文件

配置文件中的需要我们配置的重要内容:

01.连接数据库的四要素

02.管理各种hbm.xml映射文件

03.缓存的设置

04.是否显示sql语句

05.是否格式化sql语句

06.hbm2ddl的配置

3.1.关于核心API

1.  Configuration

 加载hibernate的核心配置文件,以及负责启动hibernate,创建SessionFactory对象

2.  SessionFactory 接口

初始化Hibernate,是数据存储源的代理,负责创建Session对象!

一个项目中我们使用一个SessionFactory就足够了!

如果我们需要操作多个数据库时,建立每个数据库指定一个SessionFactory!

3.  Session接口

 负责执行持久化对象的CRUD操作!是线程不安全的!可以开启事务!创建Transaction对象!

 Session         ===>会话session

 HttpSession      ===>用户session

4.  Transaction接口

 针对于事务的操作!

5.  Query接口

方便我们对数据库数据的查询,有两种方式来实现查询:

 01.sql

 02.hql

6.  Criteria接口

 和query接口非常相似!完全面向对象的思想去操作数据库!

2.Hibnate入门例子

让表中的属性名和数据库中的字段名一致,

2.1.创建hibernate,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">
<!--
package: 需要映射的实体类所在包
class节点
    name:对应的是实体类的类名,如果没有书写package,则必须是完整限定类名
    table:数据库中的表名,如果表名和实体类名一致,可以省略
id节点:  表中的主键
 generator:主键生成策略 ,主键由谁去创建?程序猿?Hibernate?数据库
   name:  必须和实体类中的属性名一致
   column : 必须和数据库中的列名一致,如果列名和属性名一致,可以省略
-->

<hibernate-mapping package="com.xdf.bean">
    <class name="Teacher" table="teacher">
        <id name="id" column="tid">
           <generator class="assigned"/><!--主键生成策略-->
        </id>
        <property name="name"/><!--数据库中的也是name-->
    </class>
</hibernate-mapping>

2.2.创建实体类

public  class teacher(){ 
private Intger Id;
private String name;
}

2.3创建hibnate.cfg.xml

<?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://localhost:3306/t17</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>

        <!--是否显示底层生成的sql语句-->
        <property name="hibernate.show_sql">true</property>
        <!--是否格式化sql语句-->
        <property name="hibernate.format_sql">true</property>
        <!--hbm2ddl   就是把xx.hbm.xml文件中的配置生成数据库中DDL(数据定义语言)
        create:  每次运行都会删除 上次生成的表,还会创建新的!
        update: 没有表会自动创建,有表就增加数据!
        validate: 如果hbm文件和数据库中的字段对应 就会新增,
                  否则抛出异常!
       create-drop:  每次运行都会删除 上次生成的表,前提是sessionFactory关闭
        -->
        <property name="hbm2ddl.auto">update</property>

        <!--加载需要的hbm.xml映射文件 现阶段还没有 -->
         <mapping resource="com/xdf/bean/Teacher.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

注意要:

***.Hbm.xml一定要被**.cfg.xml管理!

建text测试类

public class TeacherTest {


    Transaction transaction=null;  // 定义在这里  是为了 后续每个方法中使用
    Session session=null;
    @Before
    public  void before(){
        //01.读取核心配置文件 configure()底层就是加载了/hibernate.cfg.xml
        Configuration configuration=new Configuration().configure();
        //02.创建会话工厂 sessionFactory
        SessionFactory factory= configuration.buildSessionFactory();
        //03.创建会话  session
         session=factory.openSession();
        //04.开启事务
        transaction = session.beginTransaction();
    }


    @After
    public  void after(){
        //07.提交事务
        transaction.commit();  //  assigned 产生sql语句
        //08.关闭会话
        session.close();
    }

    /**
     * 新增教师信息
     */
    @Test
    public  void addTeacher(){

        //05.创建新增的对象
        Teacher teacher=new Teacher();
        teacher.setId(1);
        teacher.setName("教师1");
        //06.持久化操作
        System.out.println("******************************");
        session.save(teacher);   //identity产生sql语句
        System.out.println("******************************");
       // factory.close();
    }
/**
 *  数据库有对应的数据产生2条sql
 *
 *  01.先根据对象的id 去数据库中查询 看有没有数据
 *  02.如果存在根据id删除指定的信息
 *     如果不存在 只做查询操作
 */
@Test
public void  deleteTeacher(){
      //创建需要删除的对象
    Teacher teacher=new Teacher();
    teacher.setId(2); 
    System.out.println("***********************");
    //删除
    session.delete(teacher);
    System.out.println("***********************");
}
@Test
public void  updateTeacher(){
    //创建需要修改的对象
    Teacher teacher=new Teacher();
    teacher.setId(1);
    teacher.setName("小黑111");
    System.out.println("***********************");
    //修改
    session.update(teacher);
    System.out.println("***********************");
}

还有生成策略等,

原文地址:https://www.cnblogs.com/s122/p/9890252.html