一、session接口
Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存,观念更新,删除和加载Java对象的方法。
Session具有一个缓存,位于缓存中的对象称为持久化对象,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程被称为刷新缓存(flush)
站在持久化的角度,Hibernate把对象分为4中状态:持久化状态,临时状态,游离状态,删除状态,Session的特定方法能使对象从一个状态转换到另一个状态。
Session被称为Hibernate的一级缓存。
在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session缓存,只要Session实现没有结束生命周期,且没有清理缓存,则存放在它中的对象也不会结束生命周期。
Session缓存可减少Hibernate应用程序访问数据库的频率,这也是提高程序查询效率的主要方式。
二、session测试环境搭建
2.1新建java项目导入所需jar包
2.2编写持久化类
package edu.aeon.hibernate.bean;
/**
* [说明]:学生实体类
* @author aeon(qq:1584875179)
*/
import java.util.Date;
public class Student{
//学生编号
private Integer stuId;
//学生姓名
private String stuName;
//学生密码
private String stuPassword;
//学生性别
private boolean stuSex;
//学生年龄
private Integer stuAge;
//学生出生日期
private Date stuBirthday;
//无参构造
public Student() {
}
//有参构造
public Student(String stuName, String stuPassword, boolean stuSex, Integer stuAge, Date stuBirthday) {
super();
this.stuName = stuName;
this.stuPassword = stuPassword;
this.stuSex = stuSex;
this.stuAge = stuAge;
this.stuBirthday = stuBirthday;
}
//setter/getter
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuPassword() {
return stuPassword;
}
public void setStuPassword(String stuPassword) {
this.stuPassword = stuPassword;
}
public boolean isStuSex() {
return stuSex;
}
public void setStuSex(boolean stuSex) {
this.stuSex = stuSex;
}
public Integer getStuAge() {
return stuAge;
}
public void setStuAge(Integer stuAge) {
this.stuAge = stuAge;
}
public Date getStuBirthday() {
return stuBirthday;
}
public void setStuBirthday(Date stuBirthday) {
this.stuBirthday = stuBirthday;
}
}
2.3编写持久化类到数据库的映射文件(Student.hbm.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">
<!-- Generated 2019-4-30 15:14:09 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<!--name要全局限定名(包名+类名) table:表名 -->
<class name="edu.aeon.hibernate.bean.Student" table="STUDENT">
<!-- name:属性名 type:属性所对应的类型 -->
<id name="stuId" type="java.lang.Integer">
<!-- column->name:表字段 -->
<column name="STUID" />
<!-- 主键的生成策略 此处native:为根据数据库底层生成自增长的序列 -->
<generator class="native" />
</id>
<property name="stuName" type="java.lang.String">
<column name="STUNAME" />
</property>
<property name="stuPassword" type="java.lang.String">
<column name="STUPASSWORD" />
</property>
<property name="stuSex" type="boolean">
<column name="STUSEX" />
</property>
<property name="stuAge" type="java.lang.Integer">
<column name="STUAGE" />
</property>
<property name="stuBirthday" type="java.util.Date">
<column name="STUBIRTHDAY" />
</property>
</class>
</hibernate-mapping>
2.4编写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-factory>
<!-- 一、数据库连接的(包括驱动类、url、用户名及密码)主配置信息 [start]-->
<!-- 1.数据库连接驱动类 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--
2.数据库连接url(资源定位:连那一台上的那一个端口下的那一个数据库)、此处连本地、3306端口这两个均为默认,可省略
jdbc:mysql:jdbc协议下的mysql子协议
db_test:要连接的数据库名(即:create database db_test)
-->
<property name="connection.url">jdbc:mysql://localhost:3306/db_test</property>
<!-- 3.要连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 4.要连接数据库的用户名 所对应的密码-->
<property name="connection.password">root</property>
<!-- 数据库连接的主配置信息 [/end]-->
<!-- 二、数据库连接的一些辅助(是否在控制台打印sql语句、打印的sql语句是否要进行格式化及一些创建表的策略)配置信息[start] -->
<!-- 1.数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 2.是否在控制台打印sql语句 true:打印 |false不打印 -->
<property name="show_sql">true</property>
<!-- 3.打印出来的sql语句是否要格式化 true:格式化|false:不格式化 -->
<property name="format_sql">true</property>
<!--
4.创建数据库表策略
create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
-->
<property name="hbm2ddl.auto">update</property>
<!-- 数据库连接的一些辅助配置信息[/end] -->
<!-- 三、引入实体类到关系数据库(实体类-表|属性-字段)的映射文件[start] -->
<mapping resource="edu/aeon/hibernate/bean/Student.hbm.xml"/>
<!-- 引入实体类到关系数据库的映射文件[/end] -->
</session-factory>
</hibernate-configuration>
2.5通过hibernate API+junit编写测试类
package edu.aeon.hibernate.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import edu.aeon.hibernate.bean.Student;
/**
* [说明]:测试类
* @author aeon(qq:1584875179)
*
*/
public class HibernateTest {
private static SessionFactory sessionFactory;
private static Session session;
private static Transaction transaction;
@Before
public void init(){
Configuration configuration=new Configuration().configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory=configuration.buildSessionFactory(serviceRegistry);
session=sessionFactory.openSession();
transaction=session.beginTransaction();
}
@After
public void destory(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void saveTest() {
Student student =new Student("zhangsan", "zs110", true, 11, new Date());
session.save(student);
}
public static void main(String[] args) {
Configuration configuration=new Configuration().configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory=configuration.buildSessionFactory(serviceRegistry);
session=sessionFactory.openSession();
Student student=new Student("zhangsan", "zhangsan110", true, 22,new Date(new java.util.Date().getTime()));
transaction = session.beginTransaction();
session.save(student);
transaction.commit();
session.close();
sessionFactory.close();
}
}
测试结果截图:

数据库信息截图:

来源:https://www.cnblogs.com/aeon/p/10832892.html