• 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("***********************");
    }

    还有生成策略等,

  • 相关阅读:
    利用Vue这些修饰符帮我节省20%的开发时间
    ELK API
    ssh编译安装
    谷歌浏览器皮肤
    整理了100篇Linux技术精华
    使用Prometheus+Grafana监控MySQL实践
    mysqldiff
    kafka命令
    calico 文件丢失问题
    Prometheus 告警分配到指定接收组
  • 原文地址:https://www.cnblogs.com/s122/p/9890252.html
Copyright © 2020-2023  润新知