Hibernate笔记1

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

img

img

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

posted @ 2019-07-10 23:58  train99999  阅读(224)  评论(0编辑  收藏  举报