- JavaBean+属性中必须有惟一值的属性(对应数据库表的字段)mysql
- 实体类属性不建议使用基本数据类型,建议使用基本数据类型对应的包装类redis
int - Integer char - Character 其余的都是首字母大写 好比 double - Doublesql
为何这样写呢?举例说 学生参加考试确定有字段int score 若是他得了0分,sroce = 0就好了,可是若是这个学生没有参加考试,是没有score = null的,用Integer就可使用 Interger score = null就能够了。数据库
<generator class="生成策略"></generator>数组
可选值:increment 每次增加 1缓存
identity【只能用在mysql中】session
sequenen【只能用在oracle中】并发
※ native 【根据使用的数据库 自动选择用的生成器 经常使用】oracle
※ uuid 【生成32位惟一字符串】 Hibernate生成的不是任何一个(规范)版本的UUID,强烈不建议使用。
ide
UUID是Universally Unique Identifier的缩写,它是在必定的范围内(从特定的名字空间到全球)惟一的机器生成的标识符。
save 添加
get 根据id查询
/* * @param arg0 返回的实体类的Class * @param arg1 查询的id * */ User user = session.get(User.class, 2);
update 修改
① 先根据id查询 返回对象
② 在使用对象的setter方法修改值
③ session.update(对象)
修改也能够用session.save(对象)实现,可是最好用update方法。
delete 删除
【经常使用】第一种方式:
① 使用session.get查,返回对象
② session.delete(对象)
第二种方式:
① 实例化一个实体类,使用setter方法设置id为要删除的id
② 使用session.delete(对象)删除
瞬时态 没有id 和session也没有关系 瞬时态的实体类通常作save操做
持久态 有id值 与session有关联 session.get出的实体类就是持久态
托管态 有id值 与session没有关联 【不经常使用】 删除的第二种方法里面的实体类就是一个托管态实体类
另外一个重要的方法 saveOrUpdate 根据实体类的状态执行不一样的操做
实体类为瞬时态 -> saveOrUpdate作添加操做
实体类为持久态 -> saveOrUpdate作修改操做
实体类为托管态 -> saveOrUpdate作修改操做【不经常使用】
缓存:放在内存中
有一级缓存和二级缓存
一级缓存特色:
注意:二级缓存已经不使用了,使用redis替代二级缓存
验证一级缓存的存在
User user = session.get(User.class, 2); System.out.println(user.getUsername()); User user1 = session.get(User.class, 2); System.out.println(user1.getUsername());
第一次查询时执行SQL,第二次查询时直接调用的缓存,并不执行SQL语句。
Hibernate: select user0_.uid as uid1_0_0_, user0_.username as username2_0_0_, user0_.password as password3_0_0_, user0_.address as address4_0_0_ from t_user user0_ where user0_.uid=? Dongfang Dongfang
Hibernate一级缓存的特性
隔离性:避免事务并发问题的发生
不考虑隔离性会产生的问题:脏读、不可重复读、虚读
=》解决办法:设置事务隔离级别 repeatable read【mysql默认的事务隔离级别】
Hibernate中在hibernate.cfg.xml能够设置隔离级别,不经常使用
事务要有提交也要有回滚。
代码结构:
try{
//开启事务 Transaction tx = session.beginTransaction()
//提交事务 tx.commit()
}
catch{
//回滚事务 tx.rollback()
}
finally{
//关闭事务/*不管有没有异常 都会被关闭*/
tx.close();
}
做用:确保session是惟一的,不共享的
方法:将session与本地线程绑定
<!-- 配置session绑定本地线程 --> <property name="current_session_context_class">thread</property>
而后在HibernateUtil中增长getCurrentSession方法
public static Session getCurrentSession() { return sessionFactory.getCurrentSession(); }
此时返回的Session对象就是与线程绑定的Session对象。
此时不须要手动关闭session,由于与本地session绑定了。
(1)Query对象
e.g. 查询全部的HQL: from 实体类的名称
//建立Query对象 Query query = session.createQuery("from User"); List<User> userlist = query.list(); for(User user : userlist) { System.out.println(user.getUsername()); }
(2)Criteria对象
不须要写语句,直接调用方法便可。
Criteria c = session.createCriteria(User.class); List<User> userlist = c.list(); for(User user : userlist) { System.out.println(user.getUsername()); }
session.createCriteria(User.class); 提示是过期的方法
(3)SQLQuery对象
SQLQuery sqlquery = session.createSQLQuery("select * from t_user");
List<Object[]> list = sqlquery.list(); //默认返回的是数组的形式
让返回的list的每部分为实体类对象
SQLQuery sqlquery = session.createSQLQuery("select * from t_user"); sqlquery.addEntity(User.class); List<User> list = sqlquery.list();
经过设置addEntity来达到返回的是实体类的对象
上面的方法提示所有过期