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