将对象映射到数据库
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
//是否将脚本打印到控制台是否输出脚本到数据库
export.create(true,true);
Hibernate的几种状态
把对象存入表中(持久化数据)
//读取配置文件
Configuration cfg = new Configuration().configure();
//建立SessionFactory 对应一个数据库
SessionFactory factory = cfg.buildSessionFactory();
//取得session (这个session需要关闭)
Session session = null;
try{
session = factory.openSession();
//开启事务
session.beginTransaction();
User user = new User();
user.setName("张三");
user.setPassword("123456");
//保存对象
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//如果出问题就回滚事务
session.getTransaction().rollback();
}finally{
//关闭session
if(null!=session){
if(session.isOpen()){
session.close();
}
}
}
Hibernate中数据的几种状态
session = HibernateUtils.getSession();
tx = sesion.beginTransaction();
//此时进入Transient状态
User user = new User();
user.setName("张三");
user.setPassword("123456");
//Persistent状态
//Persistent状态的对象,当属性发生改变的时候
//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
session.save(user);
//改变对象属性
user.set("李四");
//提交事务
tx.commit();
//detached状态
//数据库中存入的对象名字应该是李四
//如果控制台打印SQL会发现打印了两条SQL语句,一条插入语句、一条更新语句。
Hibernate Session的get()方法
Session session = null;
try{
//HibernateUtils是自己写的一个Session工具类
session = HibernateUtils.getSession();
session.beginTransaction();
//该方法会在数据库里面根据这个id寻找该对象,找到就返回Object对象的实例,找不到返回null.
User user = (User) session.get(User.class,"123456");
//此时user对象处于Persistent状态
user.setName("王五");
//改变后提交事务Hibernate会执行更新数据库操作
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
Load方法
//...省略之前代码 关键部分代码:
User user = (User) session.load(User.class,"1234356");//id随便写的
user.setName("王五");//此时并未访问数据库(不会打印SQL语句)
System.out.println(user.getName());//此时才开始访问数据库
//因为load支持lazy(延迟加载),默认是开启代理的
//理解Hibernate里面的延迟加载:真正使用的时候再创建对象
//主要是提高性能
//主要采用代理实现,使用CGLIB库生成的
session.getTransaction().commit();
//补充:load查询一个不存在的数据会抛出ObjectNotFound异常
CRUD总结
get和load方法的差别
* get不支持lazy,load在默认情况下支持lazy
* get加载数据,如果不存在则返回null,而load抛出ObjectNotFound异常
Transeint
*没有被session管理
*在数据库中没有与之匹配的记录
Persistent
*纳入session管理
*在数据库中有与之匹配的记录
*当属性发生改变,在清理缓存的时(脏数据检查)会自动同步数据库
Detached
*没有被session管理
*在数据库中存在与之匹配的记录
Session 是一个持久化管理器
Hibernate的hql
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
//createQuery方法会返回一个Query对象
Query query = session.createQuery("from User");
//Query的list方法返回一个java.util.List对象
List userList = query.list();
for (Iterator iter = userList.iterator();iter.hasNext();){
User user = (User) iter.next();
System.out.println("id="+user.getId()+"name="user.getName());
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
hql分页查询
/*
Query里面有如下方法:
public Query setMaxResults(int maxResults);//得到最大结果集
public Query setFirstResult(int firstResult);//从哪开始查,从0开始
*/
Session session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
//设置从第几条开始 (第一条是0)
query.setFirstResult(1);
//设置一页多少
query.setMaxResult(2);
List userList = query.list();
for (Iterator iter = userList.iterator();iter.hasNext();){
User user = (User) iter.next();
System.out.println("id="+user.getId()+"name="user.getName());
Hibernate基本映射
实体类—表,采用< class>标签映射
实体类属性(不包括集合、自定义类和数组)—表字段,采用< property>标签映射
如果实体类的名字或者实体类的属性的名字和数据库关键字重复将会出现问题
class标签中的table可以指定表名称
property标签中column属性可以指定列名
实体类的设计原则:
*实现无参构造方法
*提供一个标识
*建议不要使用final修饰实体类
*建议为实体类生成getter和setter方法
主键生成策略:
*identity
*sequence
*uuid
*native
*assigned
*foreign