前言:
hibernate是一个ORM框架,与mybatis相似,但它是全自动的,也就是说,开发人员无在关注sql了,优点就是统一了sql接口,无需在因为数据库方言(数据库类型:mysql/oracle),而花费经历去了解,
缺点就是每次事务的执行都需建立一个sqlsession,并发量没有mybatis高,sql不灵活
一.单表基本操作
1.导入相关依赖(pom)
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!--Hibernate--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.10.Final</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>
2.创建Hibernate配置文件(hibernate.cfg.xml)
注意:hibernate.cfg.xml,核心配置文件,只能叫这个名
<?xml version="1.0" encoding="UTF-8"?> <!--表明解析本XML文件的DTD文档位置,DTD是DocumentType Definition 的缩写, 即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性。 hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在 Hibernate3.1.3软件包中的srcorghibernate目录中找到此文件--> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!--核心配置,作用:针对单个数据库映射经过编译的内存镜像文件--> <!--通俗的说就是将数据库转化为java可以识别的镜像文件--> <!--注意:构建SessionFactory非常消耗资源,通常一个工程只需构建与构建一个SessionFactory--> <session-factory> <!--数据源配置--> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useSSL=true&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8</property> <!--C3P0--> <property name="hibernate.c3p0.acquire_increment">10</property> <!--失效时间,单位:秒--> <property name="hibernate.c3p0.idle_test_period">1000</property> <!--过期时间--> <property name="hibernate.c3p0.timeout">5000</property> <!--最大连接数--> <property name="hibernate.c3p0.max_size">30</property> <property name="hibernate.c3p0.min_size">5</property> <!--线程数--> <property name="hibernate.c3p0.max_statements">10</property> <!--数据库方言--> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--打印sql--> <property name="show_sql">true</property> <!--格式化sql--> <property name="format_sql">true</property> <!--自动生成数据库表--> <property name="hibernate.hbm2ddl.auto">update</property> <!--注册实体关系映射文件--> <mapping resource="com/king/domain/People.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
3.创建实体类(domain)
package com.king.domain; import lombok.Data; @Data public class People { private Integer id; private String name; private Double money; }
4.创建实体关系映射文件(**.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> <class name="com.king.domain.People" table="people"> <id name="id" type="java.lang.Integer"> <column name="id"></column> <generator class="identity"></generator> </id> <property name="name" type="java.lang.String"> <column name="name"></column> </property> <property name="money" type="java.lang.Double"> <column name="money"></column> </property> </class> </hibernate-mapping>
5.调用Hibernate API完成操作
public static void main(String[] args) { //创建Configuration Configuration configuration = new Configuration().configure(); //System.out.println(configuration); //获取SessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); //获取session Session session = sessionFactory.openSession(); People people = new People(); people.setId(1); people.setName("王"); people.setMoney(100.2); session.save(people); session.beginTransaction().commit(); session.close(); }
小结:1.hibernate.cfg.xml是Hibernate框架的核心配置文件,底层将此文件名写死了,所以是不可修改的
2.在实体类上要声明主键策略
二,级联操作
在级联操作时:无论一对多还是多对一,”一“那个表是主表,”多“那个表是从表
1.一对多
@Data public class Customer { private Integer id; private String name; //辅助字段,一段多关系 private Set<Orders> orders; }
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> <class name="com.king.domain.Customer" table="customer"> <id name="id" type="java.lang.Integer"> <column name="id"></column> <generator class="identity"></generator> </id> <property name="name" type="java.lang.String"> <column name="name"></column> </property> <set name="orders" table="orders"> <key column="cid"></key> <one-to-many class="com.king.domain.Orders"></one-to-many> </set> </class> </hibernate-mapping>
2.多对一
@Data public class Orders { private Integer id; private String name; private Integer cid; //辅助字段,多对一关系 private Customer customer; }
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> <class name="com.king.domain.Orders" table="orders"> <id name="id" type="java.lang.Integer"> <column name="id"></column> <generator class="identity"></generator> </id> <property name="name" type="java.lang.String"> <column name="name"></column> </property> <many-to-one name="customer" class="com.king.domain.Customer" column="cid"></many-to-one> </class> </hibernate-mapping>
3.多对多
多对多的实现就是两个一对多关系的表通过一个中间表(临时表)去建立一个多对多的关系,常用的就是购物车,选课等业务逻辑
两个主表通过一张中间表(从表)建立关联
主表一
对应的配置文件
主表二
对应配置文件
两个主表的中间表就是两个表达从表