<generator class="native">generator>
主要记两个
native:底层数据库对自动生成符的能力来选择 identity,sequence,hilo三种生成器中的一种
uuid:之前web阶段生成id值,hibernate帮我们生成uuid值
(1)将uid的类型改为String类型
private String uid;
添加操作
调用session里面的user方法实现
//添加功能
User user= new User();
user.setUsername("小马");
user.setPassword("123");
user.setAddress("美国");
//调用session的方法实现添加
session.save(user);
根据id查询
调用session里面的get方法实现
// 4.根据id查询
// 调用session里面的get方法
// 第一个参数:实体类的class 第二个参数:id值
User user = session.get(User.class, 1);
System.out.println(user);
修改操作
首先查询,再修改
// 4.修改操作
// 修改uid=2的username
// 4.1根据id查
User user = session.get(User.class, 2);
// 4.2向返回的user对象里面设置修改之后的值
user.setUsername("小红");
// 4.3调用session的update方法修改
// 执行过程:到session对象里面找到uid的值,根据uid进行修改
session.update(user);
删除操作
调用session里面的delete方法实现
// 4.删除操作
// 第一种:根据id查询对象
User user = session.get(User.class, 2);
session.delete(user);
//第二种
User user3=new User();
user3.setUid(3);
session.delete(user3);
注意:在进行修改操作时:
若使用save操作已存在id的记录,则会在后面添加
实体类状态有三种
(1)瞬时态:对象里面没有id值,对象与session没有关联
User u=new User();
u.setUsername("jack");
u.setPassword("124");
u.setAddress("china");
(2)持久态:对象里面有id值,对象与session关联
User user=session.get(User.class,1);
(3)托管态:对象里面有id值,对象与session没有关联
User user=new User();
user.setUid(3);
演示操作实体类对象的方法
(1)saveOrUpture方法:实现添加,实现修改
//1.添加操作
User user=new User();
user.setUsername("jack");
user.setPassword("520");
user.setAddress("朝鲜");
//实体类对象状态是瞬时态,做添加
session.saveOrUpdate(user);
//2.修改操作
User user=new User();
user.setUid(6); //托管态
user.setUsername("jack");
user.setPassword("520");
user.setAddress("朝鲜");
//实体类对象状态是瞬时态,做修改
session.saveOrUpdate(user);
User user=session.get(User.class,7);
user.setUsername("lilei");
//实现类对象状态是持久态,做修改
session.saveOrUpdate(user);
hibernate缓存特点.
第一类 hibernate 的一级缓存
(1)hibernate的一级缓存默认打开的
(2)hibernate的一级缓存使用范围.
其范围是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须是持久态数据
第二类 hibernate 的二级缓存
(1)目前已经不是用了,代替技术redis
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围
(1)首先根据uid=1 查询,返回对象
(2)其次再根据uid=1 查询,返回对象
//1.根据uid=1查询,返回对象
//执行第一个get方法是否查询数据库,是否发送sql语句
User user1=session.get(User.class,6);
//2.在uid=1查询
//执行第二个get方法是否查询数据库,是否发送sql语句
User user2=session.get(User.class,6);
1.持久态自动更新数据库
//1.根据id查询
User user=session.get(User.class,7);
//2.设置返回对象的值
user.setUsername("hanmeimei");
//3.调用方法实现
//session.update(user);这一句其实不用写也可
2.执行过程(了解)
设置事务的隔离级别
(1)mysql默认隔离级别repeatable read
Hibernate事务代码规范写法
try{
开启事务
提交事务
}catch{
回滚事务
}finally{
关闭
}
session类似于jdbc的connection,之前web阶段学过threadLocal
帮实现与本地线程绑定session
获取与本地线程session
(1)在hibernate核心配置文件中配置
<property name="hibernate.current_session_context_class">threadproperty>
(2)调用sessionFactory里面的方法得到
// 在util中提供返回与本地线程的session的方法
public static Session getSessionobject() {
return sessionFactory.getCurrentSession();
}
获取与本地线程绑定session时候,关闭session报错
org.hibernate.SessionException: Session was already closed //不需要手动关闭
(1)hql:hibernate query language,hibernate提供的查询语言,这个hql语句和普通sql语句很相似
(2)hql和sql语句区别
使用sql操作表和表字段
使用hql操作实体类和属性
(1)from 实体类名称
(1)创建Query对象
(2)调用query对象里面的方法得到结果
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = HibernateUtils.getSessionobject();
tx = session.beginTransaction();
// 1.创建query对象
// 方法里面写hql语句
Query query = session.createQuery("from User");
// 2.创建query对象里面的方法得到结果
List list = query.list();
for (User user : list) {
System.out.println(user);
}
// 提交事务
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
(1)创建Criteria对象
(2)调用Criteria对象里面的方法得到结果
// 1.创建criteria对象
// 方法里面的参数是实体类class
Criteria criteria = session.createCriteria(User.class);
// 2.调用方法得到结果
List list = criteria.list();
for (User user : list) {
System.out.println(user);
}
(1)创建对象
(2)调用对象的方法得到结果
//返回list中的部分是数组
// 1.创建对象
SQLQuery sqlQuery = session.createSQLQuery("select*from t_user");
// 调用sqlQuery里面的方法
// 返回list集合,默认里面每部分是数组结构
List