zoukankan      html  css  js  c++  java
  • Hibernate学习笔记2

    Hibernate映射

    一对多  多对一  一对一  多对多

    一对多映射

    set元素的常用属性

    package com.imooc.util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
        private static SessionFactory sessionFactory;
        private static Session session;
        
        static {
            // 创建Configuration对象  读取hibernate.cfg.cml文件。完成初始化
            Configuration config = new Configuration().configure();
            StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().
                    applySettings(config.getProperties());
            StandardServiceRegistry ssr = ssrb.build();
            sessionFactory = config.buildSessionFactory(ssr);
        }
            
        // 获取SessionFactory对象
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
        
        // 获取Session
        public static Session getSession() {
            session = sessionFactory.openSession();
            return session;
        }
        
        // 关闭Session
        public static void closeSession(Session session) {
            if (session != null) {
                session.close();
            }
        }
    }
    HibernateUtil.java

    单向一对多:

    班级(Grade)——>学生(Student)

    班级类中有属性 set<Student>

    在班级中配置

    <!-- 配置单向的一对多关联关系 -->
    <set name="students" table="STUDENT">
        <!-- 指定关联的外键 -->
        <key>
            <column name="GID" />
        </key>
        <one-to-many class="com.imooc.entity.Student" />
    </set>
    package com.imooc.entity;
    
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import com.imooc.util.HibernateUtil;
    
    /**
     * 单向的一对多关系
     * @author Administrator
     *
     */
    public class Test {
        public static void main(String[] args) {
            //add();
            //findStudentByGrade();
            //update();
            delete();
        }
        // 将学生添加到班级
        public static void add() {
            Grade g = new Grade("一班", "Java软件开发一班");
            Student s1 = new Student("张三", "男");
            Student s2 = new Student("李四", "女");
            
            g.getStudents().add(s1);
            g.getStudents().add(s2);
            
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            session.save(g);
            session.save(s1);
            session.save(s2);
            tx.commit();
            HibernateUtil.closeSession(session);
        }
        
        public static void findStudentByGrade() {
            Session session = HibernateUtil.getSession();
            Grade grade = (Grade) session.get(Grade.class, 1);
            Set<Student> students = grade.getStudents();
            for (Student s: students) {
                System.out.println(s);
            }
        }
        // 修改学生信息
        public static void update() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Grade g = new Grade("二班", "Java软件开发二班");
            Student student = (Student) session.get(Student.class, 1);
            g.getStudents().add(student);
            session.save(g);
            tx.commit();
            HibernateUtil.closeSession(session);
        }
        // 删除学生信息
        public static void delete() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Student student = (Student) session.get(Student.class, 2);
            session.delete(student);
            tx.commit();
            HibernateUtil.closeSession(session);
        }
        
    }
    Test.java

    单向多对一关联:

    1、多对一的关系和关系数据库中的外键参照关系最匹配,即在己方(多方)的表中的一个外键参照另一个表的主键;

    2、通过在多方持有一方的引用实现,需要在“多”的一端使用<many-to-one>配置

    <!-- 配置多对一关系 -->
    <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" >
    </many-to-one>
    public static void save() {
        Grade g = new Grade("一班", "Java软件开发一班");
        Student s1 = new Student("张三", "男");
        Student s2 = new Student("李四", "女");
        
        s1.setGrade(g);
        s2.setGrade(g);
        
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        session.save(g);
        session.save(s1);
        session.save(s2);
        tx.commit();
        HibernateUtil.closeSession(session);
    }
    Test

    对于inverse属性的说明:

    1、一方的hbm.xml文件的<set>节点的inverse属性指定了关联关系的控制方向,默认由one方来维护;

    2、关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系;

    3、在一对多关联中,设置one方的inverse为true,这将有助于性能的改善。

     cascade属性

    HQL数据查询基础

    HQL (Hibernate Query Lanaguage) Hibernate查询语言

    HQL是面向对象的查询语言

    HQL语句形式:select...from...where...group by...having...order by...

    HQL 对Java类的属性大小写敏感,对关键字大小写不敏感

    1.from查询一个对象的所有字段(Seller是一个实体类)

    String hql = "from Seller";
    Query query = session.createQuery(hql);
    List<Seller> sellers = query.list();
    for (Seller seller: sellers) {
        System.out.println(seller);
    }

    2.查询指定多个字段,返回的是Object[]

    String hql = "select id, name from Seller";
    Query query = session.createQuery(hql);
    List<Object[]> result = query.list();
    for (Object[] objs: result) {
        System.out.println("id:" + objs[0] + ",name:" + objs[1]);
    }

    3.只查询一个字段,返回的是Object

    String hql = "select name from Seller";
    Query query = session.createQuery(hql);
    List<Object> result = query.list();
    for (Object obj: result) {
        System.out.println("name:" + obj);
    }

    4.查询时可以使用别名,这样查询多个表的时候,可以防止属性名冲突,这里s作为Seller的别名

    String hql = "select s.name from Seller s";
    Query query = session.createQuery(hql);
    List<Object> result = query.list();
    for (Object obj: result) {
        System.out.println("name:" + obj);
    }

    5.list返回查询结果 通过new list()

    String hql = "select new list(id,name) from Seller";
    Query query = session.createQuery(hql);
    List<List> result = query.list();
    for (List list: result) {
        System.out.println("id:" + list.get(0) + ",name:" + list.get(1));
    }

    6.以map形式返回查询结果

    String hql = "select new map(id,name) from Seller";
    Query query = session.createQuery(hql);
    List<Map> maps = query.list();
    for (Map map: maps) {
        System.out.println("id:" + map.get("0") + ",name:" + map.get("1"));
    }

    通过属性的别名获取,注意,如果使用别名就不可以使用下标获取了

    String hql = "select new map(id as id_, name as name_) from Seller";
    Query query = session.createQuery(hql);
    List<Map> maps = query.list();
    for (Map map: maps) {
        System.out.println("id:" + map.get("id_") + ",name:" + map.get("name_"));
    }

    7.以自定义类型返回查询结果

    // Seller必须有由id和name组成的构造函数
    String hql = "select new Seller(id,name) from Seller";
    Query query = session.createQuery(hql);
    List<Seller> result = query.list();
    for (Seller seller: result) {
        System.out.println("id:" + seller.getId() + ",name:" + seller.getName());
    }
    public class Seller implements Serializable {
        private Long id;// 主键
        private String name;// 名称
        private String tel;// 电话
            ...  // 其他属性
        
        public Seller(){
            
        }
        public Seller(Long id, String name) {
            this.id = id;
            this.name = name;
        }
        
        ...  // getter & setter
    }

    8.返回不重复的查询结果 通过distinct关键字

    String hql = "select distinct sex from Customer";

    条件查询

    9.通过比较运算符 =, <, >, <=, >=, <>

     String hql = "from Seller where id > 2"; 

    10.判断是否为null

    is null 或者 =null 判断为空

    is not null 或者 <>null 判断不为空

     String hql = "from Seller where name is not null"; 

    11.范围查询

    in(a,b,...) 查询值为括号中的某个值的元素 ()中可以是子查询

    between a and b 查询值在[a,b]之间的元素

    String hql = "from Customer where age in (20, 40)";
    String hql = "from Customer where age not in (20, 40)";
    String hql = "from Customer where age between 30 and 40";
    String hql = "from Customer where age not between 30 and 40";

    12.字符串模式匹配

    通过like 关键字

    通配符:% 匹配任意个字符,_ 匹配一个字符

    例:查询名字两个字且姓李的人

    String hql = "from Customer where name like '李_' ";

    13.逻辑运算 and or

    同sql……

    14.集合运算

    is [not] empty,集合【不】为空,不包含任何元素;对应SQL的exists运算

    member of 元素属于集合 ;对应SQL的in运算。

    15.四则运算

    可以做select子句或者where子句中使用

    例: where price*5 > 3000 

    16.单个查询

     query.uniqueResult() 如果返回多个查询结果则报错

    17.order by子句

    对查询结果进行排序

    select ... from ... where ... order by ... asc(desc) 默认asc

    按多个属性排序,用逗号隔开

    总结:和sql好像哦~

  • 相关阅读:
    都说程序员钱多空少,程序员真的忙到没时间回信息了吗?
    C/C++知识分享: 函数指针与指针函数,看完这篇你还能不懂?
    C++的那些事儿:从电饭煲到火箭,C++无处不在
    年薪90万程序员不如月入3800公务员?安稳与高收入,到底如何选择?
    【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
    C语言既有高级语言又有低级语言的特点,但为什么它不是低级语言呢?
    【C++学习笔记】看完这篇,C++ 的链接问题不怕你搞不明白!
    既然C++这么难学,为什么还有人“自讨苦吃”?
    编程语言这么多,为什么就只有C 语言能一直得到 SQLite 的青睐?
    初学者疑惑:C语言中,函数反复调用会有什么问题?
  • 原文地址:https://www.cnblogs.com/wenruo/p/6361810.html
Copyright © 2011-2022 走看看