• hibernate


    【Hibernate.cfg.xml】
    主配置文件:数据库连接信息、其他参数、映射信息!
    1)自动建表

    hibernate.hbm2ddl.auto create 每次都重新建表; 如果表已经存在就先删除再创建

    hibernate.hbm2ddl.auto update 如果表不存在就创建; 表存在就不创建;

    hibernate.hbm2ddl.auto validate 映射文件的内容与数据库表结构不一样的时候就报错!

    2)映射

    映射文件需要和类同名

    不能同时映射两个同名xml文件,不同包名也不行

    3)显示于格式化
    true
    true

    【映射配置】
    映射一个实体类对象; 描述一个对象最终实现可以直接保存对象数据到数据库中
    1)hibernate-mapping 根节点
    package属性: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
    auto-import属性: 默认为true, 在写hql的时候自动导入包名
    如果指定为false, 再写hql的时候必须要写上类的全名;
    2)class节点
    映射某一个对象对应数据表
    name属性: 指定要映射的对象的类型
    table属性: 指定对象对应的表
    3)普通字段映射 property
    name 指定对象的属性名称
    column 指定对象属性对应的表的字段名称
    length 指定字符的长度, 默认为255
    type 指定映射表的字段的类型,如果不指定会匹配属性的类型
    java类型: 必须写全名
    hibernate类型: 直接写类型,都是小写
    3)主键字段映射

    自增长

    复合主键

    如果找不到合适的列作为主键,出来用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。
    【复合主键配置】
    复合主键类,必须实现序列化接口

    【开发步骤】
    1)引入hibernate核心包
    2)对象及对象的映射
    Employee.java
    Employee.hbm.xml
    3)src/hibernate.cfg.xml主配置文件
    数据库连接配置
    加载所用的映射(hbm.xml)
    4)测试

    【Configuration】加载主配置文件
    配置管理类对象
    config.configure(); 加载主配置文件的方法(hibernate.cfg.xml)
    默认加载src/hibernate.cfg.xml
    config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文
    config.buildSessionFactory(); 创建session的工厂对象

    【Session】
    session对象维护了一个连接(Connection), 代表了与数据库连接的会话
    session.save(obj); 保存一个对象
    session.update(emp); 更新一个对象
    session.saveOrUpdate(emp); 保存或者更新的方法:
    没有设置主键,执行保存;
    有设置主键,执行更新操作;
    session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

    【查询】
    1)get()/load()主键查询
    Session.get(Employee.class)//主键查找
    Session.load(Employee.class)//主键查找
    2)对象导航查询
    s = (Student)session.get(Student.class, 1);
    System.out.println(s.getGender());
    System.out.println(s.getName());
    3)HQL查询
    查询对象及对象的属性
    from 对象 where 对象属性
    4)Criteria,完全面向对象查询
    Criteria criteria = Session.createCriteria(Employee.class);
    criteria.add(Restrictions.eq(对象属性,属性值);
    4)原生SQL
    session.createSQLQuery(sql);//返回对象数组,添加到集合
    session.createSQLQuery(sql).addEntity(Employee.class);//返回Employee,添加到集合

    【关联映射】

    将一个对象映射为外键字段(将员工对象的部门属性,映射为外键字段):使用many-to-one映射

    1)一对多映射




    2)多对一映射

    一对多/多对一用多的一方维护一的一方,可提高hibernate的效率(减少update)

    ?两个都存在关系映射的对象,使用hibernate获取且toString()会造成无限递归
    3)多对多映射
    只能通过一方保存另一方
    保存项目也需要保存员工(或设置级联保存)
    4)一对一映射

    基于外键(唯一)映射

    基于主键(主键又是外键)映射

    【inverse属性】表示控制权是否反转,默认false不反转
    1)一对多设置反转只在一的一方有效,获取无影响,保存(外键字段null)、移除关系:清空集合(不能解除关联关系)、删除数据(报错)
    2)多对多设置反转获取无影响,保存(不保存中间表),移除关系(不删除中间表数据),删除(报错)

    【cascade属性】级联,可设置在一的一方和多的一方
    none(默认,不级联)
    save-update(级联保存,更新)
    save-update,delete
    delete(级联删除)
    all(所有)

    【懒加载】
    目的:提高程序执行效率
    属性:默认lazy="ture"开启懒加载
    用到映射关系数据的时候,再进行查询

    LazyInitializationException懒加载异常

    get及时加载/load懒加载

    【对象状态】瞬时状态、持久化状态、游离状态
    1)临时状态
    直接new出来的对象;
    不处于session的管理;
    数据库中没有对象的记录;
    2)持久化状态
    当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。
    处于持久化状态的对象,当对对象属性进行更改的时候,会反映到数据库中!
    特点:
    处于session的管理;
    数据库中有对应的记录;
    3)游离状态
    不处于session的管理;
    数据库中有对应的记录
    Session关闭后,对象的状态;

    【一级缓存】减少对数据库的访问次数!从而提升hibernate的执行效率
    1)一级缓存也叫做session的缓存,只在session范围有效!
    2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。
    3)Session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
    【二级缓存】(sessionFactory级别)可以跨多个session
    缓存策略::read-only、nonstrict-read-write、read-write、transactional
    【list与iterator区别】
    1)list()
    一次把所有的记录都查询出来,

    会放入缓存,但不会从缓存中获取数据

    2)Iterator
    N+1查询; N表示所有的记录总数
    即会先发送一条语句查询所有记录的主键(1),
    再根据每一个主键再去数据库查询(N)!
    通过iterator()方法来获得我们对象的时候,hibernate首先会发出1条sql去查询出所有对象的 id 值,当我们如果需要查询到某个对象的具体信息的时候,hibernate此时会根据查询出来的 id 值再发sql语句去从数据库中查询对象的信息

    会放入缓存,也会从缓存中取数据!

    【分页】
    Criteria c= s.createCriteria(Product.class);
    c.add(Restrictions.like("name", "%"+name+"%"));
    c.setFirstResult(2);
    c.setMaxResults(5);

  • 相关阅读:
    利用知名站点欺骗挂马
    海量数据库解决方案
    利用第三方浏览器漏洞钓鱼
    WCF的用户名+密码认证方式
    启用 Master Data Services 的 Web Service
    ExtJS 4.1有什么值得期待?
    [笔记]软件框架设计的艺术
    Master Data Server API 更新 Member 内置字段(Code、Name)
    Master Data Service调用API创建Model
    Silverlight传值
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/10480964.html
Copyright © 2020-2023  润新知