1、Hibernate的原理/流程步骤
1.通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件,并创建一个configuration对象。
2.由hibernate.cfg.xml中的<mapping resource="com/xxx/xxx/Student.hbm.xml"/>读取并解析映射信息
3.通过configuration.buildSessionFactory(); //创建SessionFactory
4.sessionFactory.openSession(); //打开Sesssion
5.session.beginTransaction(); //创建事务Transation
6.persistent operate 持久化操作(CRUD)
7.transaction.commit(); //提交事务
8.session.close(); //关闭Session
9.sessionFactory.close(); //关闭SesstionFactory
2、基础配置(实例解析)
本实例所用到的jar包:Hibernate的基础常用包和连接MySQL数据库的常用包
2.1、首先创建一个Student实体
package com.shore.model; /**
* @author DSHORE/2019-9-8
*
*/
public class Student {
private Integer id;
private String name;
private String number;
private String idCard;
private Boolean sex; public Student(){ }
public Student(Integer id, String name, String number, String idCard,
Boolean sex) {
super();
this.id = id;
this.name = name;
this.number = number;
this.idCard = idCard;
this.sex = sex;
} public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
}
2.2、配置 Student 实体在数据库表的映射 student.hbm.xml 文件(创建在和Student实体类同一级目录下)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.shore.model">
<class name="Student" table="student"> <!-- table="student"可以省略 -->
<id name="id" column="id"> <!-- column="id"可以省略 -->
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/> <!-- column="name"可以省略 -->
<property name="number" column="number" type="java.lang.String"/>
<property name="idCard" column="idCard" type="java.lang.String"/>
<property name="sex" column="sex" type="java.lang.Boolean"/>
</class>
</hibernate-mapping> <!-- 注意:
1、如果classname和tablename一样,可以省略tablename。
2、如果class字段名和table字段名一样,可以省略table字段名。
3、如果要使用自增长,那么<generator class="native"/>和建表脚本的主键的aotu-increment,都不能省略。
-->
2.3、配置 hibernate.cfg.xml 文件(创建在src目录下),这个文件名可以随便修改(xxx.cfg.xml),但是没多大意义,一般不建议修改。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/school</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property> <!-- JDBC connection pool (use the built-in) -->
<!-- <property name="connection.pool_size">1</property> --> <!-- SQL dialect --> <!-- 方言 (MySQL、Oracle等数据库/语言)-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management -->
<!-- <property name="current_session_context_class">thread</property> --> <!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property> <mapping resource="com/shore/model/Student.hbm.xml"/> <!-- 从这里读取指定实体类和数据库表的映射关系 -->
</session-factory>
</hibernate-configuration>
这里面的jar包,有些用不到
到此为止,Hibernate的简单配置已经基本完成,下面,我们来添加一个测试类,看看测试是否成功
当我们在写项目的时候,要测试的东西可能不止一个,我们把重复部分 封装起来:
package com.shore.utils; import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /**
* @author DSHORE/2019-9-8
*
*/
//创建session工厂
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() {
try {
// 创建Configuration对象去读取hibernate.cfg.xml配置文件,并创建一个session工厂出来
return new Configuration().configure().buildSessionFactory();
} catch (Throwable e) {
// 将异常打印到控台
System.err.println("初始化sessionFactory创建失败:" + e);
throw new ExceptionInInitializerError(e);
}
} public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
下面开始测试:
package com.shore.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test; import com.shore.model.Student;
import com.shore.utils.HibernateUtil; /**
* @author DSHORE/2019-9-8
*
*/
public class HibernateTest {
@Test
public void testStudent() {
// 1、创建session工厂(获取HibernateUtil类里面创建好的session工厂)
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// 2、打开一个session
Session session = sessionFactory.openSession();
// 3、开启事务
Transaction transaction = session.beginTransaction(); /********************************** 第四步测试操作的内容 *****************************/
/**
*4、 持久化操作
*
* 更新(保存/修改)
* session.update(student);
* session.save(student);
* session.saveOrUpdate(student)
* student的id是否给定了,如果给了id,执行update;如果没有给id,执行save //即:修改数据用update,保存/插入数据用save
*/
Student student = new Student(null, "zhangsan", "654321", "4201011995687657612", false);
session.save(student);//向学生表中插入数据
//session.update(student);//根据id修改学生表中的数据 /********************************** 第四步测试操作的内容 *****************************/
// 5、事务提交
transaction.commit();
// 6、关闭session
session.close();
// 7、关闭session工厂
sessionFactory.close();
}
}
测试成功(且数据库内已成功插入数据):
附录
上面的实例测试步骤,如果不封装,可以这样测试
package com.shore.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.shore.model.Student; /**
* @author DSHORE/2019-9-8
*
*/
public class HibernateTest3 {
private static SessionFactory sessionFactory = new Configuration().configure(
"hibernate.cfg.xml").buildSessionFactory();//读取配置文件并创建一个session工厂 @Test
public void addStudent() {
Session session = null;
Transaction tran = null;
try {
session = sessionFactory.openSession(); // 打开一个Session
tran = session.beginTransaction(); // 开启事务 //持久化操作
Student student = new Student(3, "zhangsan", "88888888","110000234632432", true);
session.save(student); tran.commit();// 事务提交
} catch (Exception e) {
tran.rollback(); // 事务回滚
throw new ExceptionInInitializerError(e);
} finally {
session.close(); // 关闭session
}
}
}
或者这样:
package com.shore.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.shore.model.Student; /**
* @author DSHORE/2019-9-8
*
*/
public class HibernateTest2 {
@Test
public void addStudent2() {
//创建一个Configuration对象
Configuration configuration = new Configuration();
//读取Hibernate.cfg.xml配置文件
configuration.configure();
//创建SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//创建Session
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
/**
* 执行一个具体的mysql操作
*/
Student student = new Student(1, "sange", "666666", "110000234632432", false);
session.update(student); transaction.commit();
session.close();
sessionFactory.close();
}
}
以下代码是上面实例测试步骤的拓展:
package com.shore.test; import java.util.List; import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.junit.Test; import com.shore.model.Student;
import com.shore.utils.HibernateUtil; /**
* @author DSHORE/2019-9-8
*
*/
public class HibernateTest {
@Test
public void testStudent() {
// 1、创建session工厂(获取HibernateUtil类里面创建好的session工厂)
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// 2、打开一个session
Session session = sessionFactory.openSession();
// 3、开启事务
Transaction transaction = session.beginTransaction(); /********************************** 第四步测试操作的内容 *****************************/
/**
* 4、 持久化操作
*
* 更新(保存/修改)
* session.update(student);
* session.save(student);
* session.saveOrUpdate(student)
* student的id是否给定了,如果给了id,执行update;如果没有给id,执行save //即:修改数据用update,保存/插入数据用save
*/
Student student = new Student(null, "zhangsan", "654321", "4201011995687657612", false);
session.save(student);//向学生表中插入数据
//session.update(student);//根据id修改学生表中的数据 /**
* 查询(根据主键查询) lazy
*/
session.get(Student.class, 1);
student = (Student) session.load(Student.class, 1); //懒加载
System.out.println(student); //Criteria查询全部
Criteria criteria = session.createCriteria(String.class);
List<Student> students = criteria.list(); //listAll //Criteria根据条件查询
criteria.add(Restrictions.eq("id",1)); /********************************** 第四步测试操作的内容 *****************************/
// 5、事务提交
transaction.commit();
// 6、关闭session
session.close();
// 7、关闭session工厂
sessionFactory.close();
}
}
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/11488911.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |