1、hibernate管理的类要求:
(1)该类至少有一个无参的构造方法;
(2)类必须是非final的,否则懒加载无法使用
2、session的几个方法:
get:只能根据id来得到一条记录
......
User user=session.get(userClass,id);
.....
load:只能根据id来得到一条记录
User user=session.load(userClass,id);
区别:load的懒加载的,执行了get后会里面访问数据库,进行查询的;
而load方法执行了后不里面去方法数据库,而是在使用时才访问;
如:User user=session.load(userClass,id);----执行了他不访问数据库
System.out.println(user.getName());----执行他是才访问数据库;
ps:用load时会先创建出一个User对象,所以即使不访问数据库,此时
也会有个user对象,及user不会为空;
persist:保存
persist和save的区别是:
在没有开启事务的时候用save方法,他会向数据库中插入记录,但是
因为没有事务提交,所以自动回滚,最终数据库中没有该记录;
而persist,如果没有开启事务,则根本不会向数据 库中插入记录。
对象的几个状态:
(1)瞬时状态:
User user=new User();---此时对象于session和数据库都没关联
(2)持久状态:
session.save(user);---此时于session和数据库都有关联
(3)脱管状态:
session.close();
此时的user从session中脱管---此时于session没有关联,但数据库中有对象记录
3、hql查询:
get,load只能根据id查询,如果根据name查怎get,load是不可以的;
hql是针对对象的查询,而sql是针对表的查询
String hql="from User as user where user.name=?";----User 类不是表
//query类似JDBC中的PreparedStatement(PreparedStatement ps=conn.prepareStatement(sql))
Query query=session.createQuery(hql);
query.setString(0,"lid");----下标从零开始,JDBC从1开始
List list=query.list();----list()的作用类似于JDBC的executQuery();
//User user=(User)query.uniqueResult();---如果确定只有一个结果,可以用该方法
4、hql的命名参数:
假设:String hql="from User as user where user.name=? and user.age=?....."
像上面假设有多个? 我们在为?赋值时是必须对应的,如果?很多或者顺序不小心变了
,这些都很很容易造成错误;
解决办法:
String hql="from User as user where user.name=:name and user.age=:a";
Query query=session.createQuery(hql);
query.setString("name","lid");
query.setInt("a",12);
这样只要变量名称对应上就可以,不用关心顺序;
5、分页用到的两个方法:
query.setFirstResult(0);---从哪一条开始取数据
query.setMaxResult(100);---取多少条数据
底层就是用的mysql或者oracle等内部的分页,如mysql则是limit(0,100)
6、Criteria---条件查询:
Criteria c=c.createQuery(User.class);
c.add(Restrictions.eq("name","lid"));---添加约束条件,让name属性等于"lid"
c.add(Restrictions.gt("birthday",new Date()));---生日大于当前时间的
c.add(Restrictions.lt("age",12))---年龄小于12的
List list=c.list();
//User user=(User)c.uniqueResult();
hibernate学习笔记02---hibernate的几个方法
最新推荐文章于 2019-02-23 17:10:39 发布