Hibernate5随手记
Hibernate的使用
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>01-Hibernate</groupId>
<artifactId>01-Hibernate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>01-Hibernate</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<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.10</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factroy>
<!--数据源-->
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8</property>
<!-- C3P0 -->
<property name="hibernate.c3p0.acquire_increment">10</property>
<property name="hibernate.c3p0.idle_test_period">10000</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"></property>
</session-factroy>
<!-- 注册实体关系映射⽂件 -->
<mapping resource="com/southwind/entity/People.hbm.xml"></mapping>
</hibernate-configuration>
People数据库:
integer id; String name; Duoble money;
People.class
package com.southwind.entity; import lombok.Data; @Data public class People { private Integer id; private String name; private Double money; }
People.hbl.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD
3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.southwind.entity.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>
2.级联关系
2.1一对多
Customer(主表)
/*数据库中只有*id name 和一个外键 CID*/
public class Customer { private Integer id; private String name; private Set orders; }
<set name="orders" table="orders">
<key column="cid"></key>
<one-to-many class="com.kun.entitys.Orders"></one-to-many>
</set>
Orders(从表)数据库中只有 id,name,cid(外键)
public class Orders { private Integer id; private String name; private Customer customer; }
<many-to-one> name="customer" class="com.kun.entitys.Customer" column="cid"></many-to-one>
test
//创建 Customer
Customer customer = new Customer(); customer.setName("张三");
//创建 Orders
Orders orders = new Orders(); orders.setName("订单1");
//建⽴关联关系 orders.setCustomer(customer);
//保存 session.save(customer); session.save(orders);
//提交事务 session.beginTransaction().commit();
2.2多对多 需要三张表,其中一张是映射关系表
account_course表 id,cid,aid
Course
public class Course { private Integer id; private String name; private Set accounts; }
<set name="courses" table="account_course">
<key column="cid"></key>
<many-to-many class="com.kun.entitys.Account" column="aid">
</many-to-many></set>
Account
public class Account { private Integer id; private String name; private Set courses; }
<set name="courses" table="account_course">
<key column="aid"></key>
<many-to-many class="com.kun.entitys.Course" column="cid">
</many-to-many></set>
HQL 是面向对象的查询语言,而 SQL 是面向二维表的查询语言
Query 接口
使用 Session 对象的 createQuery 方法可获取 Query 对象。 Query query = session.createQuery(hql);
3.1.2 SQLQuery 接口
Hibernate 进行 SQL 原生查询的接口,支持动态绑定参数的功能,是 Query 接口的子接口。
使用 Session 对象的 createSQLQuery()方法可获取 SQLQuery 对象。SQLQuery sqlQuery = session.createSQLQuery(sql);
其查询出的结果对象默认为 Object,当然,若结果为 List,则其元素为 Object。
使用 SQLQuery 的 addEntity(Xxx.class)方法,可以将其结果泛型设定为指定类型。
3.1.3 Criteria 接口
Criteria,标准、准则,Hibernate 进行 Criteria 查询的接口,与 Query 接口无关。
使用 Session 对象的 createCriteria()方法可获取 Criteria 对象。
Criteria criteria = session.createCriteria(Xxx.class);
(1)SQL 查询
String sql = "select * from 表名";
List<Student> students = session.CreatSQLQuery(sql).addEntity(Student.class).list();
(2)HQL 查询
String sql = " from 表名";
List<Student> students = session.CreatQuery(sql).list();
(3)QBC 查询
List<Student> students = session.creatCriteria(Student.class).list();
分页
(1)SQL 查询
String sql = "select * from 表名 limit ?,?";
List<Student> students = session.CreatSQLQuery(sql).addEntity(Student.class)
.setParamer(0,3)
.setParamer(1,5)
.list();
(2)HQL 查询
String sql = " from 表名";
.List<Student> students = session.CreatQuery(sql)
.setFirstResult(3)
.setMaxResult(5)
.list();
(3)QBC 查询
List<Student> students = session.creatCriteria(Student.class)
.setFirstResult(3)
.setMaxResult(5)
.list();
模糊查询
(1)SQL 查询
String sql = "select * from 表名 while sname like :tname";
List<Student> students = session.CreatSQLQuery(sql).addEntity(Student.class)
.setParamer("tname","%n%")
.list();
(2)HQL 查询
String sql = " from 表名 where name like :myname";
.List<Student> students = session.CreatQuery(sql)
.setParamter("myname","%n%")
.list();
(3)QBC 查询
List<Student> students = session.creatCriteria(Student.class)
.add(Restrictions.like("name","%n%))
.list();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异