Hibernate
1.hibnate是什么
1.Hibernate是一个开发源代码的对象关系映射框架(ORM);
2.对JDBC进行了轻量级的封装,可以将实体类和数据库中的表产生映射关系;
3.是一个全自动的ORM框架;hibernate能自动生成sql语句;
2.hibnate的概念
hibernate简要结构图,中间的hibernate.properties,可以让数据持久化,这里面我们换成***.cfg.xml,表与属性名对应
全面解决”的体系结构方案
3.Hibernate提供了5种检索对象的方式
1.导航对象图检索方式:根据已经加载的对象导航到其他对象
from Emp e group by e.dept.deptName
2.OID检索方式:按照对象的OID来检索对象 get/load
3.HQL检索方式:使用面向对象的HQL查询语言 from Student
4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,
提供了更加面向对象的查询接口
5.本地SQL检索方式:使用本地数据库的SQL查询语句
createSqlQuery();
1.2核心配置文件hibernate.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">
头文件
配置文件中的需要我们配置的重要内容:
01.连接数据库的四要素
02.管理各种hbm.xml映射文件
03.缓存的设置
04.是否显示sql语句
05.是否格式化sql语句
06.hbm2ddl的配置
3.1.关于核心API
1. Configuration 类
加载hibernate的核心配置文件,以及负责启动hibernate,创建SessionFactory对象
2. SessionFactory 接口
初始化Hibernate,是数据存储源的代理,负责创建Session对象!
一个项目中我们使用一个SessionFactory就足够了!
如果我们需要操作多个数据库时,建立每个数据库指定一个SessionFactory!
3. Session接口
负责执行持久化对象的CRUD操作!是线程不安全的!可以开启事务!创建Transaction对象!
Session ===>会话session
HttpSession ===>用户session
4. Transaction接口
针对于事务的操作!
5. Query接口
方便我们对数据库数据的查询,有两种方式来实现查询:
01.sql
02.hql
6. Criteria接口
和query接口非常相似!完全面向对象的思想去操作数据库!
2.Hibnate入门例子
让表中的属性名和数据库中的字段名一致,
2.1.创建hibernate,hbm.xml
?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"> <!-- package: 需要映射的实体类所在包 class节点 name:对应的是实体类的类名,如果没有书写package,则必须是完整限定类名 table:数据库中的表名,如果表名和实体类名一致,可以省略 id节点: 表中的主键 generator:主键生成策略 ,主键由谁去创建?程序猿?Hibernate?数据库 name: 必须和实体类中的属性名一致 column : 必须和数据库中的列名一致,如果列名和属性名一致,可以省略 --> <hibernate-mapping package="com.xdf.bean"> <class name="Teacher" table="teacher"> <id name="id" column="tid"> <generator class="assigned"/><!--主键生成策略--> </id> <property name="name"/><!--数据库中的也是name--> </class> </hibernate-mapping>
2.2.创建实体类
public class teacher(){ private Intger Id; private String name; }
2.3创建hibnate.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> <!--配置连接数据库的四要素--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/t17</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <!--是否显示底层生成的sql语句--> <property name="hibernate.show_sql">true</property> <!--是否格式化sql语句--> <property name="hibernate.format_sql">true</property> <!--hbm2ddl 就是把xx.hbm.xml文件中的配置生成数据库中DDL(数据定义语言) create: 每次运行都会删除 上次生成的表,还会创建新的! update: 没有表会自动创建,有表就增加数据! validate: 如果hbm文件和数据库中的字段对应 就会新增, 否则抛出异常! create-drop: 每次运行都会删除 上次生成的表,前提是sessionFactory关闭 --> <property name="hbm2ddl.auto">update</property> <!--加载需要的hbm.xml映射文件 现阶段还没有 --> <mapping resource="com/xdf/bean/Teacher.hbm.xml"/> </session-factory> </hibernate-configuration>
注意要:
***.Hbm.xml一定要被**.cfg.xml管理!
建text测试类
public class TeacherTest {
Transaction transaction=null; // 定义在这里 是为了 后续每个方法中使用
Session session=null;
@Before
public void before(){
//01.读取核心配置文件 configure()底层就是加载了/hibernate.cfg.xml
Configuration configuration=new Configuration().configure();
//02.创建会话工厂 sessionFactory
SessionFactory factory= configuration.buildSessionFactory();
//03.创建会话 session
session=factory.openSession();
//04.开启事务
transaction = session.beginTransaction();
}
@After
public void after(){
//07.提交事务
transaction.commit(); // assigned 产生sql语句
//08.关闭会话
session.close();
}
/**
* 新增教师信息
*/
@Test
public void addTeacher(){
//05.创建新增的对象
Teacher teacher=new Teacher();
teacher.setId(1);
teacher.setName("教师1");
//06.持久化操作
System.out.println("******************************");
session.save(teacher); //identity产生sql语句
System.out.println("******************************");
// factory.close();
}
/**
* 数据库有对应的数据产生2条sql
*
* 01.先根据对象的id 去数据库中查询 看有没有数据
* 02.如果存在根据id删除指定的信息
* 如果不存在 只做查询操作
*/
@Test
public void deleteTeacher(){
//创建需要删除的对象
Teacher teacher=new Teacher();
teacher.setId(2);
System.out.println("***********************");
//删除
session.delete(teacher);
System.out.println("***********************");
}
@Test
public void updateTeacher(){
//创建需要修改的对象
Teacher teacher=new Teacher();
teacher.setId(1);
teacher.setName("小黑111");
System.out.println("***********************");
//修改
session.update(teacher);
System.out.println("***********************");
}
还有生成策略等,