hibernate从零开始
写在前头: Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!
强烈推荐文章: Hibernate入门这一篇就够了
示例教程
- 项目目录结构
- 创建数据库
CREATE TABLE `test`.`Untitled` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`uname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`uage` int(11) DEFAULT NULL,
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
- 下载hibernate必要的驱动包 (目前我采用的是
hibernate 5.4
)
-
hibernate.cfg.xml
文件配置
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--设置要将java转化成 mysql数据库的语法-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql://192.168.80.250:3306/test?serverTimezone=UTC</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!--配置current_session-->
<property name="current_session_context_class">thread</property>
<!--配置要加载的资源-->
<mapping resource="domain/UserEntity.hbm.xml"/>
<mapping class="domain.UserEntity"/>
</session-factory>
</hibernate-configuration>
-
UserEntity
实体类 (使用idea自动生成: 生成方法: 实体类生成方法 博客地址)
package domain;
import javax.persistence.*;
import java.util.Objects;
@Entity
@Table(name = "user", schema = "test", catalog = "test")
public class UserEntity {
private int uid;
private String uname;
private Integer uage;
@Id
@Column(name = "uid")
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
@Basic
@Column(name = "uname")
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
@Basic
@Column(name = "uage")
public Integer getUage() {
return uage;
}
public void setUage(Integer uage) {
this.uage = uage;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserEntity that = (UserEntity) o;
return uid == that.uid &&
Objects.equals(uname, that.uname) &&
Objects.equals(uage, that.uage);
}
@Override
public int hashCode() {
return Objects.hash(uid, uname, uage);
}
}
-
hibernate.cfg.xml
实体类的配置文件(也是使用idea自动生成 生成方法: 配置文件生成方法 博客地址)
<?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="domain.UserEntity" table="user" schema="test">
<id name="uid" column="uid"/>
<property name="uname" column="uname"/>
<property name="uage" column="uage"/>
</class>
</hibernate-mapping>
- 测试程序
步骤:- Configuration configuration = new Configuration().configure(); 读取hibernate主配置文件
- SessionFactory sessionFactory = configuration.buildSessionFactory(); 创建一个session工厂,用于获取session
- 通过
getCurrentSession
或者openSession
都可以获取一个 session对象。 session对象是 操作数据库的核心 - Transaction transaction = currentSession.beginTransaction(); 开启一个事务
- 创建要保存在数据库中的对象(或者其他操作)
- 使用 session.save(obj)来保存
- 最后提交事务transaction.commit();
注意:
getCurrentSession
或者openSession
都可以获取一个 session对象, 但是 openSession 总是开启一个新的session对象,并且在使用完成之后要调用session.close()
来释放资源。 getCurrentSession 会检查当前上下文有没有可用的 session对象,有的话就直接使用,没有的话就创建一个新的session对象。 在提交事务之后,getCurrentSession 获取的session是会自动释放的,不需要调用 close方法
import domain.UserEntity;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.Test;
import java.util.List;
public class TestDemo {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
/***
* 增加一条记录
*/
@Test
public void test1() {
Session currentSession = sessionFactory.getCurrentSession();
// Session currentSession = sessionFactory.openSession();
Transaction transaction = currentSession.beginTransaction();
UserEntity userEntity = new UserEntity();
userEntity.setUage(19);
userEntity.setUname("李洪伟");
int a = (int)currentSession.save(userEntity);
transaction.commit();
System.out.println("保存成功,id为" + a);
}
/**
* 修改一条记录
* session.save(obj); 【保存一个对象】
* session.update(obj); 【更新一个对象】
* session.saveOrUpdate(obj); 【保存或者更新的方法】
* 没有设置主键,执行保存;
* 有设置主键,执行更新操作;
* 如果设置主键不存在报错!
* */
@Test
public void test2(){
Session currentSession = sessionFactory.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
UserEntity userEntity = new UserEntity();
userEntity.setUid(1);
userEntity.setUname("lhw");
userEntity.setUage(21);
currentSession.update(userEntity);
transaction.commit();
}
/**
* 1.查询操作
* 主键查询
* session.get(javaBean.class, int id); 【传入对应的class和id就可以查询】
* session.load(javaBean.class, int id); 【支持懒加载】
* */
@Test
public void test3(){
Session currentSession = sessionFactory.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
UserEntity userEntity = currentSession.get(UserEntity.class, 1);
transaction.commit();
System.out.println(userEntity);
}
/**
* 2.查询操作
* HQL查询 (hibernate query language 即hibernate提供的面向对象的查询语言)
* 查询的是对象以及对象的属性【它查询的是对象以及属性,因此是区分大小写的!】。
* */
@Test
public void test4(){
Session currentSession = sessionFactory.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
// Query query = currentSession.createQuery("from UserEntity");
// 查询id 大于 2 的所有数据
Query query = currentSession.createQuery("from UserEntity where id > :id");
query.setParameter("id", 2);
List list = query.list();
transaction.commit();
System.out.println(list.toString());
}
/***
* 3.查询操作
* QBC查询(query by criteria 完全面向对象的查询) ~~一般用的比较少
* HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码....QBC查询就是完全的面向对象查询...
*/
@Test
public void test5(){
Session currentSession = sessionFactory.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
Criteria criteria = currentSession.createCriteria(UserEntity.class);
// 增加条件
criteria.add(Restrictions.gt("id", 1)); // 1. > gt 2. < lt 3. = eq
List list = criteria.list();
System.out.println(list);
}
/***
* 4.查询操作
* 本地sql查询
* 如果SQL是非常复杂的,我们不能靠HQL查询来实现功能的话,我们就需要使用原生的SQL来进行复杂查询了!
*/
@Test
public void test6(){
Session currentSession = sessionFactory.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
NativeQuery nativeQuery = currentSession.createSQLQuery("select * from user").addEntity(UserEntity.class);
List list = nativeQuery.list();
transaction.commit();
System.out.println(list);
}
}
运行结果
- test1()
Hibernate:
insert
into
user
(uname, uage, uid)
values
(?, ?, ?)
保存成功,id为0
- test2()
Hibernate:
update
user
set
uname=?,
uage=?
where
uid=?
- test3()
Hibernate:
select
userentity0_.uid as uid1_0_0_,
userentity0_.uname as uname2_0_0_,
userentity0_.uage as uage3_0_0_
from
user userentity0_
where
userentity0_.uid=?
UserEntity{uid=1, uname='lhw', uage=21}
- test4()
Hibernate:
select
userentity0_.uid as uid1_0_,
userentity0_.uname as uname2_0_,
userentity0_.uage as uage3_0_
from
user userentity0_
where
userentity0_.uid>?
[UserEntity{uid=3, uname='李洪伟', uage=19}, UserEntity{uid=4, uname='李洪伟', uage=19}, UserEntity{uid=5, uname='李洪伟', uage=19}]
- test5()
Hibernate:
select
this_.uid as uid1_0_0_,
this_.uname as uname2_0_0_,
this_.uage as uage3_0_0_
from
user this_
where
this_.uid>?
[UserEntity{uid=2, uname='李洪伟', uage=19}, UserEntity{uid=3, uname='李洪伟', uage=19}, UserEntity{uid=4, uname='李洪伟', uage=19}, UserEntity{uid=5, uname='李洪伟', uage=19}]
- test6()
Hibernate:
select
*
from
user
[UserEntity{uid=1, uname='lhw', uage=21}, UserEntity{uid=2, uname='李洪伟', uage=19}, UserEntity{uid=3, uname='李洪伟', uage=19}, UserEntity{uid=4, uname='李洪伟', uage=19}, UserEntity{uid=5, uname='李洪伟', uage=19}]
Process finished with exit code 0