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