Hibernate笔记1

2019-08-09 00:00:00 Hibernate 笔记
hibernate简介

ORM框架

对象关系映射(Object Relational Mapping,简称ORM)

是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换

Object :对象,java对象,此处特指JavaBean对象

Relational:关系,二维表,数据库中的表

Mapping:映射

什么是hibernat

Hibernate是一个开放源代码的对象关系映射框架,他对JDBC进行了非常轻量级的对象封装

它将POJO与数据库表建立映射关系,是一个全自动的ORM框架

POJO简单的Java对象,实际就是普通JavaBeans

hibernate可以自动生成SQL语句,自动执行,使得程序员可以随心所欲的使用对象编程思维来操作数据库

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的应用中使用

hibernate的简单使用

读取配置文件hibernate.cfg.xml和hibernate.properties的方法

Configuration cfg = new Configuration();//读取配置文件hibernate.properties
Configuration cfg = new Configuration().configure();//读取配置文件hibernate.cfg.xml

添加表的映射文件方法:

1.在hibernate.cfg.xml中配置mapping

<!-- 2、配置JavaBean与表的映射文件 -->
        <mapping resource="com/XXXX/hibernate/domain/User.hbm.xml"/>

2.调用Configuration对象addResource

cfg.addResource("com/XXXX/hibernate/domain/User.hbm.xml");

3.调用Configuration对象的addClass方法

cfg.addClass(User.class);

SessionFactory

session作用:用于操作数据库,从SessionFactory中获取

SessionFactory相当于java web连接池,用于管理所有session

获得SessionFactory 方式:config.buildSessionFactory();

sessionFactory 还用于缓存配置信息(数据库配置信息,映射文件,预定义的HQL语句)

SessionFactory线程安全,多个线程同时访问时,不会出现线程并发访问问题

session会话的获取

factory.openSession() 获取一个全新的session

factory.getCurrentSession() 获取一个与当前线程绑定的session

要开启当前线程绑定的session需要在hibernate.cfg.xml中配置

<property name="hibernate.current_session_context_class">thread</property>
    public void test1(){
        //保存用户数据
        //1.获取核心 配置文件对象,默认是加载src的hibernate.cfg.xm文件
        Configuration cfg = new Configuration().configure();
        //2.创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取Session对象
        Session session1 = factory.openSession();
        Session session2 = factory.openSession();
        System.out.println(session1.hashCode());
        System.out.println(session2.hashCode());
        //获取当前线程
        Session session3 = factory.getCurrentSession();
        Session session4 = factory.getCurrentSession();
        System.out.println(session3.hashCode());
        System.out.println(session4.hashCode());
 //2005169944
//2134607032
//1278677872
//1278677872

注意:如果通过openSession方法session要自己关闭,通过getCurrentSession方法获取session,会自动关闭

session的api

save 保存 get通过id查询,如果没有 null load 通过id查询,没有抛出异常 update更新 delete删除

    @Test
    public void test1(){
        //获取配置文件对象
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        //get方法
        User user = (User)session.get(User.class, 4);//会寻找User对应的表,获取id为4的数据
        System.out.println(user);
        session.close();
        factory.close();
    }
public void test1(){
        //获取配置文件对象
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        //开启事务
        session.getTransaction().begin();
        //delete删除数据的两种方式
        //第一种:先获取删除对象,然后在调用delete方法
        //User user = (User)session.get(User.class, 4);//会寻找User对应的表,获取id为4的数据
        //session.delete(user);

        
        //第二种方式:创建一个User.设置id.然后在动用delete
        //User user = new User();
        //user.setUid(3);
        //session.delete(user);
        
        //session的update 更新数据两种方式
        //第一种:先获取数据,调用set方法,事务提交
        //User user = (User)session.get(User.class, 2);
        //user.setPassword("789");
        
        //第二种:
        User user = new User();
        //user.setUid(1);
        user.setUsername("古娜力扎");
        user.setPassword("12345");
        session.saveOrUpdate(user);//如果有id就会更新id的数据,执行UPDATE语句,没有id就会插入数据执行INSERT语句
        session.getTransaction().commit();
        session.close();
        factory.close();
    }

get和load方法的区别

《Hibernate笔记1》

《Hibernate笔记1》

Query查询对象

HQL🌺Hibernate Queery Language的缩写,就是Hibernate的查询语言,

Query:用于查询的对象,可以设置查询条件和分页查询

@Test
    public void test1(){
        //获取配置文件对象
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        
        //查询对象
        Query query = session.createQuery("From User Where username=? and password = ?");//改成类名和类的属性名
        query.setParameter(0, "佟丽娅");
        query.setParameter(1, "456");
        //执行查询
        User user = (User)query.uniqueResult();
        System.out.println(user);
        session.close();
        factory.close();
    }

分页查询

@Test
    public void test1(){
        //获取配置文件对象
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        
        //查询对象
        Query query = session.createQuery("From User");//User类名
        //分页查询
        query.setFirstResult(0);//查询起始位置
        query.setMaxResults(3);//每次查询返回的数量
        //返回多行数据
        List list = query.list();
        for(Object obj : list) {
            System.out.println(obj);
        }
        
        session.close();
        factory.close();
    }

Criteria查询对象

QBC(query by criteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作

    @Test
    public void test1(){
        //获取配置文件对象
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        
        //获取Criteria查询对象
        Criteria criteria = session.createCriteria(User.class);//User类名
        //单个查询
        //条件
//      criteria.add(Restrictions.eq("username", "佟丽娅"));
//      criteria.add(Restrictions.eq("password", "456"));
//      System.out.println(criteria.uniqueResult());
        
        // 查找ID大于4的
        //gt 大于  ge大于等于  lt 小于 le小于等于
//      criteria.add(Restrictions.gt("uid",4));//uid大于4
//      System.out.println(criteria.list());
        
        //模糊查询
        criteria.add(Restrictions.like("username", "%丽%"));
        System.out.println(criteria.list());
        session.close();
        factory.close();
    }

SQLQuery查询对象

@Test
    public void test1(){
        //获取配置文件对象
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        SQLQuery query = session.createSQLQuery("select * from t_user");
        List<Object[]> list = query.list();
        for(Object[] os :list) {
            for(Object o:os) {
                System.out.println(o);
            }
            System.out.println("--------");
        }
        session.close();
        factory.close();
    }

实体类的编写规则

我们在使用Hibernate时,书写了一个User类,这个类我们成为JavaBean

JavaBean可以简单的理解成提供私有属性,并提供私有属性的get/set方法

POJO(Plain Ordinary Java Object)简单的java对象,实际就是普通的JavaBeans

我们也称为模型,在Hibernate中,又称这种类为实体,因为是与表关联的

public void test1(){
        Configuration cfg = new Configuration().configure();
        //创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();
        //获取session对象
        Session session = factory.openSession();
        //必须提供无参构造方法,获取数据封装.不提供会报无构造方法错误
        //提供一个标识属性,映射数据表主键字段,提供私有属性的get/set方法
        //所有属性提供public访问控制符的set get方法
        //标识属性赢尽量使用基本数据类型的包装类型的包装类型
        //不要使用final修饰实体
        User user = (User)session.get(User.class,5);
        System.out.println(user);
    }

持久化对象的唯一标识OID

Java按照地址区分同一类的不同对象

关系数据库用主键区分同一条记录

HIbernate使用OID来建立内存中的对象和数据库中记录的对应关系结论:对象OID和数据库的表的主键

相关文章