Hibernate笔记1

匿名 (未验证) 提交于 2019-12-02 21:45:52

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方法的区别

Query查询对象

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和数据库的表的主键

文章来源: Hibernate笔记1
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!