先挂一个我学习的这个路径https://how2j.cn/k/hibernate/hibernate-tutorial/31.html?p=124574
在网站里面关于hibernate的概念解释:使用JDBC做数据库相关功能开发会做很多重复性的工作,比如创建连接,关闭连接,把字段逐一映射到属性中。 Hibernate把这一切都封装起来了,使得数据库访问变得轻松而简单,代码也更加容易维护。
所以这个需要用到数据库(我使用的是MySQL数据库)和Eclipse。
在数据库里面创建一个表product_,对应的Eclipse创建实体类Product,在Product的xml文件中使他们映射(需要的格式就有类名对应表,属性对应字段:<class name="Product" table="product_"> <id name="id" column="id">);在hibernate的xml的文件里面就需要设置连接的数据库是那种、时候更新表(不用自己创建表)、事务管理方式还有Product类的路径。
hibernate的基本步骤是:
- 获取SessionFactory
//SessionFactory sf = new Configuration().configure().buildSessionFactory(); - 通过SessionFactory 获取一个Session
//Session s = sf.openSession(); - 在Session基础上开启一个事务
// s.beginTransaction(); - 通过调用Session的save方法把对象保存到数据库
- 提交事务
//s.getTransaction().commit(); - 关闭Session
//s.close(); - 关闭SessionFactory
//sf.close();
应用程序通过Hibernate把 一个 Product对象插入到数据库的product_表中
hibernate.xml 配置文件提供链接数据库的基本信息:账号 密码 驱动 数据库ip 端口
Product.xml 提供对象与表的映射关系:对应哪个表? 什么属性,对应什么字段
获取id:Product p =(Product) s.get(Product.class, 6);(这里的Product.class是什么意思我不太明白。)
删除:s.delete§;
修改:
- 1. 根据id获取该对象
2. 修改该对象的属性
3. 通过Session的update方法把变化更新到数据库中
SQL语句:使用Session的createSQLQuery方法执行标准SQL语句(因为标准SQL语句有可能返回各种各样的结果,比如多表查询,分组统计结果等等。 不能保证其查询结果能够装进一个Product对象中,所以返回的集合里的每一个元素是一个对象数组。 然后再通过下标把这个对象数组中的数据取出来。)
还有一对多,多对一,多对多看得有点懵,应该是我没有懂的这个实际用什么用途。
一对多:在链接的教程是新建了一个Category类,实例化一个Category类的对象,再把这个对象标记给多个Product对象,就是一对多了吧,在数据库里面以多一列单元(cid)来表示。
下面的代码插进Product.xml:
<many-to-one name="category" class="Category" column="cid" />
使用many-to-one 标签设置多对一关系
name=“category” 对应Product类中的category属性
class=“Category” 表示对应Category类
column=“cid” 表示指向 category_表的外键(我也没理解外键是什么意思)
多对一:前面的一个Category类对象对应标记了多个Product类对象,相反就是Product类对象的多对一。就只要把Category类对象标记了的Product类对象取出来就行了。
多对多:举例是说一个Product可以被多个User(新建的类)购买,一个User可以购买多个Product。
事务:Hibernate的任何对数据有改动的操作,都应该被放在事务里面.
在事务中的多个操作行为,要么都成功,要么都失败。hibernate中的事务由s.beginTransaction();开始、由s.getTransaction().commit();结束。
属性的延迟加载:当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询。否则不会访问数据库。
关系的延迟加载:延迟加载又叫lazyload,在one-many many-many的时候都可以使用关系的延迟加载。
级联::简单的说,没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。
包括上一步说的删除用得级联,级联有4种类型:
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
delete:删除时执行级联操作;
save-update:保存和更新时执行级联操作;
级联通常用在one-many和many-to-many上,几乎不用在many-one上。
一级缓存:hibernate默认是开启一级缓存的,一级缓存存放在session上,如果有缓存则后面的查询是不会有反应的,没执行SQL语句。
二级缓存:Hibernate的一级缓存是在Session上,二级缓存是在SessionFactory上。不同实例化的Session对象,只要有一个Session有缓存过,那么其他Session可以在SessionFactory拿到缓存,查询的话就没反应,没执行SQL语句。
分页:使用Criteria进行分页查询,无论你使用的是Oracle,Mysql,NoSQL还是DB2,分页查询的代码写法都是一样的
c.setFirstResult(2); 表示从第3条数据开始
c.setMaxResults(5); 表示一共查询5条数据
两种获取id的方式:通过id获取Product对象有两种方式,分别是get和load
他们的区别分别在于
- 延迟加载
load方式是延迟加载,只有属性被访问的时候才会调用sql语句
get方式是非延迟加载,无论后面的代码是否会访问到属性,马上执行sql语句 - 对于id不存在的时候的处理
get方式会返回null
load方式会抛出异常
两种方式获得session:Hibernate有两种方式获得session,分别是:
openSession和getCurrentSession他们的区别在于
- 获取的是否是同一个session对象
openSession每次都会得到一个新的Session对象
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象 - 事务提交的必要性
openSession只有在增加,删除,修改的时候需要事务,查询时不需要的
getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭
查询总数:首先还是准备一个有统计函数的语句
select count(*) from ....
根据这条SQL语句创建一个Query对象,调用Query对象的uniqueResult()方法,返回一个long型的数据,即查询总数。
**乐观锁:**没懂啥意思,没使用的时候两次加价只实现了一次,加乐观锁后两次加价,第二次加价的时候,session会发现数据的version被修改过了,之后不会改变价钱(保存失败),并且抛出异常
C3P0连接池:建立数据库连接时比较消耗时间的,所以通常都会采用数据库连接池的技术来建立多条数据库连接,并且在将来持续使用,从而节约掉建立数据库连接的时间
hibernate本身是提供了数据库连接池的,但是hibernate官网也不推荐使用他自带的数据库连接池。
一般都会使用第三方的数据库连接池。C3P0是免费的第三方的数据库连接池,并且有不错的表现
注解: 简单的说,本来放在hbm.xml文件里的映射信息,现在不用配置文件做了,改由注解来完成
@Entity 表示这是一个实体类,用于映射表
@Table(name = “product_”) 表示这是一个类,映射到的表名:product_
然后是属性注解,属性注解是配置在属性对应的getter方法上的
@Id 表示这是主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表示自增长方式使用mysql自带的
@Column(name = “id”) 表示映射到字段id
还有关系的注解就不写了,我感觉有点懵。感觉注解做的事和xml做的差不多,xml也不熟悉,好久了解xml的具体的使用。
本文详细介绍Hibernate框架的基础概念和使用步骤,包括与数据库的连接配置、实体类映射、基本CRUD操作及事务管理。探讨了延迟加载、级联操作、缓存机制和分页查询等高级特性。
2333

被折叠的 条评论
为什么被折叠?



