hibernate 5.2.10 的使用

来源:互联网 发布:淘宝会员信誉怎么提升 编辑:程序博客网 时间:2024/05/22 05:14

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 是一级缓存    }