Hibernate学习笔记2

基础学习:
普通内存与Session的对象其实是同一个对象 (瞬时态和持久态对象是同一个对象)
/*
* save方法的执行过程:
* 1)向mysql发送一条信息,告诉mysql要执行一条mysql语句,先为我生成一条id传送给我
* 2)接收到mysql发送过来的id,并使用该id初始化student对象的属性
* 3)现在的student对象已经具有了id,那么session缓存可以管理它:
* 注意:将student的id作为key,student对象的引用作为value,放入到session缓存中
* 也就是说,只有id属性不为null的对象才有可能被session管理
* 一个对象被session管理,就意味着,这个对象被放入到了Session缓存的Map中
* 当对象由持久态转换成游离态时,实际就是将Map的该对象删除了
* 当对象由游离态转换成持久态,实际上就是先将该对象放入到Session的这个Map中,再对其进行update
*/

单表查询:
Hibernate是DAO对象,使用HQL查询,使用query接口,支持动态参数绑定的参数 session.createQuery(HQL) 是面向对象的查询 类名+属性名 sql 是面向二维表的查询
原生HQL语句结构 :就是SQL查询:session.createSQLQuery(sql)
Criteria接口:使用Session对象的crateCriteria()方法可以获得Criteria对象
分类查询:(query)QBC 查询通过标准接口
关联关系:外键:外面的主键,即使用其他表的主键值作为自己的某字段的取值 一对多 外键一般是定义在另一个表中 是建在多方表(建在一方表会出现大量数据冗余) 关系:即是通过外键建立的关系
关联关系映射:
实体对象间的关系,从数量上可以划分为 1:1 1:n m:1 n:m
关联属性:
set具有无序性和不重复性 list具有有序性和可重复性
关联方向: 单向和双向 单向关联只有一个对象可以加载和访问对方,但对方看不到另一个方 save需要进行级联保存,delete需要进行级联删除
关联关系维护: 代码上的关联对象的维护:通过set来建立代码关联关系的维护,某个类关联某个类,是主动关联的类在进行维护
数据库上关联关系的维护:直接通过数据库数据的关联 save执行一个表操作,要再次插入另一个表id,做的update操作
底层用于维护关联关系的sql语句是 save执行的是多方,先插入对方的数据,再插入自己表的id,执行的是insert语句
java代码中谁在维护关联关系,在session.save()谁 (就去执行谁)

关系映射:
1:n 关联关系 单向关联和双向关联
自关联 :所谓自关联是指自己即充当一方,又充当多方 (老板既是员工,又是 员工) 只有一张表,这张表具有外键,一级栏目的外键值为NULL,而子栏目具有外键值
下面是使用到的jar包链接:
下面介绍一个学习的demo
文件结构:需要的jar结构
实体类Student

package com.vrv.yinkailong.bean;

public class Student {
    //以后定义主键id必须是Integer
    private Integer id;
    private String name;
    private int age;
    private double score;
    //c   o
    public Student() {
        super();
    }

    public Student(String name, int age, double score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


    public void setAge(int age) {
        this.age = age;
    }



    public int getAge() {
        return age;
    }

    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + "]";
    }

}

下面是映射文件 com/vrv/yinkailong/bean/Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- 对所有的该包下的实体都可以做映射 -->
    <hibernate-mapping package="com.vrv.yinkailong.bean">
    <!-- 写映射文件  作用:
    1:类到表的映射
    2:属性到字段的映射
     -->
    <class name="Student" table="t_student">
    <id name="id" column="tid">
    <!-- 指定主键生成器 -->
    <generator class="native"/>
    </id>
    <property name="name" column="tname"/>
    <property name="age" column="tage"/>
    <property name="score" column="tscore"/>
    </class>
    </hibernate-mapping>

配置文件:hibernate.cfg.xml 路径在src下即可

<?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">
    <!-- session的不同含义   http:session (view层)   hibernate :session(DAO层)   MyBatis: session(SQL  session) -->
    <!-- 三大数据库  Mysql  DB2 Oracal -->
   <hibernate-configuration>
                  <session-factory>
                        <!-- DB链接四要素 -->
                        <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
                        <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property><!--  ///    相当于127.0.0.1:3306 -->
                        <property name="hibernate.connection.username">root</property>
                        <property name="hibernate.connection.password">123456</property>
                      <!-- 需要指定方言,才能生成相应的sql 语句  去hibernate core 里面找相应的版本  -->
                       <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
                       <!-- 数据源  数据库连接池   链接数据库的那个容器我们成为数据库连接池 决定啥时候创建链接   :一般是先建立好,然后用户需要使用的时候直接从数据库连接池获取-->
                       <!--占用资源 :释放连接    连接个数  当达到下限需要再创建   然后释放之后需要设置最多放置多少条(上限)  空闲时间 :空闲多久会自动进行销毁   使用第三方机构的连接池-->
                       <!-- 链接提供者 -->
                        <property name="hibernate.co  nnection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
                          <!-- 保证在当前线程上下文中获取到的session是同一个session -->
                        <property name="hibernate.current_session_context_class">thread</property>

                        <!-- 配置自动建表   DDL数据库定义语言  DML数据库操作语言 DQL  数据源查询语言  create 每运行一次都会重新见一个表  update只会做更新 -->
                        <property name="hibernate.hbm2ddl.auto">update</property>
                        <!-- 调试常用  :显示SQL -->
                         <property name="hibernate.show_sql">true</property>
                         <!-- 生成sql语言进行格式化 -->
                         <property name="hibernate.format_sql">true</property>
                        <!-- 映射文件 -->
                        <mapping resource="com/vrv/yinkailong/bean/Student.hbm.xml"/>
   </hibernate-configuration>

衍生出来的工具类:

package com.vrv.yinkailong.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

//自定义一个工具类
public class HiberUtil {
    private static  SessionFactory sessionFactory = null;;

    //必须保证sessionfactory是单例的,占资源
    public static Session getSession()
    {
        /*Configuration configure = new Configuration().configure();
        //2:创建session工厂对象
        SessionFactory sessionFactory = configure.buildSessionFactory();
        //3:获取session对象

        Session session = sessionFactory.getCurrentSession();  */

        SessionFactory sessionFactory = getSessionFactory();

        return sessionFactory.getCurrentSession();

    }
//抽取局部方法  alt + shift+ m
    public static SessionFactory getSessionFactory() {
    //此处做到单例,先判断在返回,能够保证做到单例
        if (sessionFactory == null || sessionFactory.isClosed()) {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        }
        return sessionFactory;
    }
}

测试类:MyTest.java

package com.vrv.yinkailong.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.vrv.yinkailong.bean.Student;
import com.vrv.yinkailong.util.HiberUtil;

public class MyTest {

    //准备测试数据
    @   Test
    public void test00()
    {
        Session session = HiberUtil.getSession();
        try {
            //4:开启事务
            session.beginTransaction();
            //5:执行操作(保存)
            for(int i = 0; i < 10 ; i ++)
            {
                Student student = new Student("n_",10+i,80+i);
                session.save(student);
            }
            //6:执行事务
            session.getTransaction().commit();

        } catch (Exception e) {
            //7:事务回滚
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    }
    //查询所有  sql
    @   Test
    public void test01_SQL()
    {
        Session session = HiberUtil.getSession();
        try {
            //4:开启事务
            session.beginTransaction();

            String sql = "select * from t_student";

           List<Student> list = session.createSQLQuery(sql).addEntity(Student.class).list();

           for (Student student : list) {
            System.out.println(student);
        }
            session.getTransaction().commit();

        } catch (Exception e) {
            //7:事务回滚
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    }


    //查询所有  hql
        @   Test
        public void test01_HQL()
        {
            Session session = HiberUtil.getSession();
            try {
                //4:开启事务
                session.beginTransaction();
                // leimgin Student
                String hql = "from Student";

                List<Student> list = session.createQuery(hql).list();

               for (Student student : list) {
                System.out.println(student);
            }
                session.getTransaction().commit();

            } catch (Exception e) {
                //7:事务回滚
                session.getTransaction().rollback();
                e.printStackTrace();
            }
        }


        //查询所有  QBC
        @   Test
        public void test01_QBC()
        {
            Session session = HiberUtil.getSession();
            try {
                //4:开启事务
                session.beginTransaction();
                // leimgin Student

                List<Student> list = session.createCriteria(Student.class).list();

               for (Student student : list) {
                System.out.println(student);
            }
                session.getTransaction().commit();

            } catch (Exception e) {
                //7:事务回滚
                session.getTransaction().rollback();
                e.printStackTrace();
            }
        }
}

最后运行得到正确结果
得到运行结果
以后会每天写一个学习笔记和资料,希望能够成长为技术大牛!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值