hibernate 5.2.10 的使用
* 全自动的ORM框架 位于持久层
* ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。 ORM
* 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.
*
* hibernate 和myBatis区别?
* Hibernate: 非常优秀、成熟的 ORM 框架。 完成对象的持久化操作 Hibernate 允许开发者采用面向对象的方式来操作关系数据库。
* 消除那些针对特定数据库厂商的 SQL 代码
* myBatis: 相比 Hibernate 灵活高,运行速度快
* 开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语 句,并且熟练使用sql语句优化功能
*
* 配置细节
* jar包 ,maven 工程,
*
org.hibernate
hibernate-core
5.2.10.Final
获取 sessionFactory 的方式也有了较大的变化
StandardServiceRegistry 标准注册服务
hibernate 的开发步骤
1 实体类 --> .hbm.xml(这两个文件是对应的,一个是实体类 , 一个是数据库的映射)
--> hibernate.cfg.xml (hibernate的配置文件 )
*
* hibernate.cfg.xml中
* <!-- 需要配置数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
* 5.2.10 需要选择这个版本的方言,或者不配置 ,不然会报错,
* 选这个方言,在建表时会采用InnoDB 引擎 ,支持事务
*
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.youv.app.yang.domain.user.User;
public class Crud {
Session session = null;
Transaction transaction = null;
@Before
public void befoer() {
// 1,先得到session工厂
SessionFactory sessionFactory = null;
// 2 创建标准服务注册对象, .configure() 不指定文件,默认取类路径下的 hibernate,cfg.xml
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hyang.cfg.xml")
.build();
// 3 获取session工厂
sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void fin() {
session.close();
}
/**
* 面向对象编程, 对实体类进行操作,hibernater 自动执行
*
* 增 session.save();
* 删 先将数据取出,然后再删除 session.delete(对象)
* 改 先将数据取出,然后再更改 session.update(对象);
* 查 get() , load();
*/
@Test
public void add() {
User user = new User();
user.setUserName("李三");
user.setUserPsw("2343");
session.save(user);
transaction.commit();
}
@Test
public void del() {
// 1 根据id获取对像
User user = session.get(User.class, "402881e85d73d1bf015d73d1c25b0000");
// 然后删除对象
session.delete(user);
transaction.commit();
}
@Test
public void update() {
// 1 根据id获取对像
User user = session.get(User.class, "402881e85d73d332015d73d335e80000");
// 然后对对象进行修改
user.setUserName("二狗");
session.update(user);
transaction.commit();
}
/**
* 获取数据 ,有两种方式 1 get , 2 load
*
* 1.get()采用立即加载方式,而load()采用延迟加载; get()方法执行的时候,会立即向数据库发出查询语句,
* 而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句 2
* .如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException
*
*/
@Test
public void get() {
User user = session.get(User.class, "402881e85d73d332015d73d335e80000");
User user1 = session.load(User.class, "402881e85d73d332015d73d335e80000");
System.out.println(user);
System.out.println(user1);
// user1 的不会有执行语句, 因为两个方法获取的是同一对象, load 不会去查数据库
// 而是会去查缓存 session 是一级缓存
}