hibernate第二天

笔记区

在建库时就使用utf-8格式,新表就会继承数据库的编码方式。
格式:
create database 数据库名 character set utf8;

提交事务之后,才真正保存到数据库中去,而并不是save()
通过Session的save把该对象保存在了数据库中,该对象也和Session之间产生了联系,此时状态是持久的
============================================

问题:严格来说,应该是在commit之后才算持久状态,单纯save之后,数据库中是无法查询到记录的

解答:

严格的说呢,save之后已经在数据库中了,只是还没有通过提交事务把在数据库中的这个数据,”固定“下来。
数据库中之所以差不到,是因为事务的隔离性,”查不到“ 是从其他事务的角度观察到的现象。
持久状态更多的是强调当前对象和session发生了关系,被session管理起来了,所以在没有提交之前,也叫做已经是持久状态了

 public static void main(String[] args) {
  
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
  
        Session s = sf.openSession();
        s.beginTransaction();
        Product p = new Product();
        p.setName("p1");
        System.out.println("此时p是瞬时状态");
        s.save(p);
        System.out.println("此时p是持久状态");
        s.getTransaction().commit();
        s.close();
        System.out.println("此时p是脱管状态");
        sf.close();
    }
  

通过id获取对象

1175089-20180424091606443-914030360.png

?? 为什么显示的查询语句里是product_0???
--mysql后面的 from product_这张表的别名

1175089-20180424091847659-66225341.png

根据id把对象从表里删除掉

注意:hibernate在删除一条数据之前,先要通过id把这条记录取出来

1175089-20180424092502548-2143820540.png

?? 为什么“hibernate在删除一条数据之前,先要通过id把这条记录取出来 ”
-- 先取出可以校验一下这条数据是否存在

??当有数据为空时,无法删除
-- price数据是null,java是float类型,转换失败了。

修改一个对象的属性,并更新到数据库

目标:通过Hibernate修改数据库中的数据。 把id=2的产品名称修改为 iphone-modifed
1175089-20180424094241752-1971830586.png

  1. 根据id获取该对象
  2. 修改该对象的属性
  3. 通过Session的update方法把变化更新到数据库中

1175089-20180424094424812-1992137723.png

1175089-20180424094443050-1085474471.png

HQL(Hibernate Query Language)是hibernate专门用于查询数据的语句

有别于SQL,HQL 更接近于面向对象的思维方式。
比如使用的是类的名字Product,而非表格的名字product_

1175089-20180424095031245-411691893.png

1175089-20180424095914794-1848843239.png

1175089-20180424100413373-293515064.png

-- 不可以。
--Query q =s.createQuery("from Product where name like ?");
--改成这样可以。。

?? hibernate查一个表所有数据
-- 原来hibernate,用的查询语句,后面是类名,而不是表名。

1175089-20180424100626261-712244079.png

使用Criteria进行数据查询

与HQL和SQL的区别是Criteria 完全是 面向对象的方式在进行数据查询,将不再看到有sql语句的痕迹

使用Criteria,根据name进行模糊查询:
使用Criteria 查询数据

  1. 通过session的createCriteria创建一个Criteria 对象
  2. Criteria.add 增加约束。 在本例中增加一个对name的模糊查询(like)
  3. 调用list()方法返回查询结果的集合

除此之外,Criteria 还可以很方便的进行进行分页查询和获取总数

1175089-20180424101855769-615520519.png

通过标准SQL语句进行查询

Hibernate依然保留了对标准SQL语句的支持,在一些场合,比如多表联合查询,并且有分组统计函数的情况下,标准SQL语句依然是效率较高的一种选择

目标:使用标准SQL,根据name进行模糊查询

使用Session的createSQLQuery方法执行标准SQL语句
因为标准SQL语句有可能返回各种各样的结果,比如多表查询,分组统计结果等等。 不能保证其查询结果能够装进一个Product对象中,所以返回的集合里的每一个元素是一个对象数组。 然后再通过下标把这个对象数组中的数据取出来。

1175089-20180424103131929-1367822581.png

1175089-20180424103143411-132705914.png

既一个对象数组代表装着一行查询结果,数组对象里面的成员则是代表各字段的数据

--
1175089-20180424103637292-2021049859.png

1175089-20180424103721086-126612905.png

1175089-20180424103802351-451492490.png

多对一 设置,多个产品--一个分类

1175089-20180424110250324-1508264243.png

1175089-20180424110323964-1436363071.png

??
1175089-20180424111245812-1988811964.png

1175089-20180424111500995-921456080.png

一对多

一个Product对应一个Category
一个Category对应多个Product
所以Category和Product是一对多的关系

练习目标:获取id=1分类下的所有商品

1:为Category增加一个Set集
1175089-20180424112741751-584953993.png

2:为Category.hbm.xml增加one-to-many映射
1175089-20180424112808904-1146880924.png
个人理解

 <set name="products" lazy="false">
            <key column="cid" not-null="false" />
            <one-to-many class="Product" />
        </set>

//这个cid 是在product_表的,这个表里有一个外键 叫uid,对应的应该是它

1175089-20180424121800813-656179297.png

3:TestHibernate 测试one-to-many关系
1175089-20180424113429705-563061655.png

首先获取id=1的category,然后通过getProducts() 直接取出其所对应的所有product

有点疑惑,不知道是如何关联起来的

1175089-20180424114333946-802735654.png

?? 这两张表里只要其中一张设置了外键, 这两张表就关联起来了?
1175089-20180424114434773-44845508.png

多对多

一种Product可以被多个User购买
一个User可以购买多种Product

所以Product和User之间的关系是多对多 many-to-many
要实现多对多关系,必须有一张中间表 user_product 用于维护 User和Product之间的关系

1:User.java
1175089-20180424115716013-986293210.png

2:User.hbm.xml
1175089-20180424115730594-1974571992.png

3:Product.java
1175089-20180424115751757-1944001070.png

4:Product.hbm.xml
1175089-20180424115813050-1656790151.png

5:在hibernate.cfg.xml中增加相关的映射

6:TestHibernate 测试many-to-many关系
首先增加3个用户
然后演示产品1被用户1,2,3购买

1175089-20180424121229007-1187632667.png

结束

似乎是能自动检测出外键id

转载于:https://www.cnblogs.com/czy16/p/8927843.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值