Hibernate中的实体规则

  创建实体类注意事项:

    1.持久化类提供无参构造函数

    2.成员变量私有 提供共有get set 方法

    3.属性应尽量使用包装类 Integer、Float、Double等(如果用int 不赋值会默认0 如果Integer 不赋值默认null)

    4.持久化类需要提供oid,与数据库中的主键列对应

    5.不要用finall修饰类

  主键类型:

    1.自然主键(少见) 如果业务需要 某列必须有,且不重复,可以作为主键使用

    2.代理主键(常见) 如果没有业务逻辑只需要一个数字 可以用这个

  主键生成策略:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.hibernate.domain">
<class name="User" table="User">
<!--id:主键,name:属性名称,column:字段名称 -->
<id name="UserId" column="UserId">
<!--generator:主键生成策略 class:标记主键如何生成 取值:
1、native:自动增长,会根据当前的数据库自动切换
2、identity:mySQL自己维护主键,录入时不需要指定主键
3、sequence:Oracle的自增标记
4、uuid:32位字符串
5、assigned:自定义字符串
6、foreign:外键
7、increment:hibernate自己查询最大id+1进行插入-->
<generator class="native"/>
</id> </class>
</hibernate-mapping>

Hibernate中的对象状态

  瞬时状态

    没有id,没有与session关联

  持久化状态

    有id,与session关联

  游离|托管状态

    有id,没有与session关联

public class Main {
public static void main(String[] args) {
Session session = HibernateUtils.openSession();
User user = new User(); //瞬时状态 没有id 没有与session关联
user.setUserName("哈哈");
session.save(user); //持久化状态 有id 有关联session
session.close(); //游离|托管状态 有id,没有关联session
}
}

Hibernate中的一级缓存

  为了提高数据库中的操作效率

public class Main {
public static void main(String[] args) {
Session session = HibernateUtils.openSession();
User u1= session.get(User.class,1);
User u2= session.get(User.class,1);
User u3= session.get(User.class,1);
User u4= session.get(User.class,1);
User u5= session.get(User.class,1);
System.out.println(u3==u4); //true
session.close();
}
}

  第一次执行步骤:

    1.调用get查询

    2.发送sql语句

    3.resultSet返回

    4.将resultset中的内容组装成User对象

    5.存入session缓存

    6.对象返回

  第二次执行步骤:

    1.先从缓存中查看是否存在id为1的user对象

    2.如果有直接返回缓存中的

    

Hibernate中的事务

  事务特性:ACID(原子性、一致性、隔离性、持久性)

  事务并发问题:

    脏读:读到了正在操作还没提交的数据。

    不可重复读:两次连续读取,数据不一致。(中间可能有人修改了)

    幻|虚读:把user表整表删掉,结果有个人加了一条进去。

  事务的隔离级别:

    读未提交:会出现脏读、不可重复读、幻读

    读已提交:可以解决脏读,不可解决不可重复读,幻读

    可重复读:可以解决脏读,不可重复读,不可解决幻读 (mysql默认级别)

    串行化:都可以解决,降低效率

  在hibernate中指定数据库的隔离级别:

    在hibernate.cfg.xml全局配置中

<!--
0001 1: 读未提交
0010 2: 读已提交
0100 4: 可重复读
1000 8: 串行化 -->
<property name="hibernate.connection.isolation">4</property>

  在项目中管理事务:

    业务开始前打开事务,业务执行之后提交事务,执行过程中出现异常,回滚事务。

    为了保证事务session对象的一致性,需要使用getCurrentSession(); 需要配置全局配置文件

<!--开启currentSession -->
<property name="hibernate.current_session_context_class">thread</property>
        Session session1 = HibernateUtils.getCurrentSession();
Session session2 = HibernateUtils.getCurrentSession();
System.out.println(session1==session2); //true

返回同一个与线程绑定的session。

通过getCurrentSession()方法获得的session对象 提交事务时,自动会关闭session,不需要我们手动session.close()关闭。

public class Main {
public static void main(String[] args) {
Session session = HibernateUtils.getCurrentSession();
Transaction trans = session.beginTransaction();
try{
session.save(new User("haha","hh",18,"男"));
}catch (Exception e){
trans.rollback();
}
trans.commit();
}
}

Hibernate中的批量查询

  HQL查询(Hibernate Query Language)主要用法

public class Main {
public static void main(String[] args) {
Session session = HibernateUtils.openSession(); //查询userList
String hql = "from User";
Query query = session.createQuery(hql);
List<User> users = query.list();
System.out.println(users); //条件查询一个user
String hql1 = "from User where UserId = 5";
Query query1 = session.createQuery(hql1);
User user = (User)query1.uniqueResult();
System.out.println(user.getUserName()); //占位符
String hql2 = "from User where UserName = :UserName and Age = :Age";
Query query2 = session.createQuery(hql2);
query2.setParameter("UserName","武大郎");
query2.setParameter("Age",18);
User user2 = (User)query2.uniqueResult();
System.out.println(user2.getUserName()); //分页查询
String hql3 = "from User";
Query query3 = session.createQuery(hql3);
query3.setFirstResult(0);
query3.setMaxResults(10);
List<User> list3 = query3.list();
System.out.println(list3);
}
}

  Criteria查询(单表查询)

public class Main {
public static void main(String[] args) {
Session session = HibernateUtils.openSession(); //查询列表
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
System.out.println(list); //查询一条
Criteria criteria1 = session.createCriteria(User.class);
criteria1.add(Restrictions.eq("UserId", 1));
User user1 = (User) criteria1.uniqueResult();
System.out.println(user1.getUserName()); //分页列表
Criteria criteria2 = session.createCriteria(User.class);
criteria2.setFirstResult(0);
criteria2.setMaxResults(10);
List<User> list2 = criteria2.list();
System.out.println(list2); }
}

  原生SQL查询

public class Main {
public static void main(String[] args) {
Session session = HibernateUtils.openSession(); String sql = "select * from user";
SQLQuery query = session.createSQLQuery(sql);
List<User> list = query.list();
System.out.println(list); SQLQuery query1 = session.createSQLQuery("select * from user where userId = :userId");
query1.setParameter("userId",1);
query1.addEntity(User.class);
User user = (User) query1.uniqueResult();
System.out.println(user.getUserName()); }
}

Hibernate基础(二)的更多相关文章

  1. Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1

    Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...

  2. 将 Shiro 作为应用的权限基础 二:shiro 认证

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的“实体/凭证”组合便是“用户名/密码”组合. 一. ...

  3. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  4. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  5. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  6. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  7. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  8. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  9. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  10. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

随机推荐

  1. codevs 1160 蛇形矩阵

    1160 蛇形矩阵 传送门  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 小明玩一个数字游戏,取个n行 ...

  2. JAVA学习总结-基础语法

    /** * 这篇文章供自己学习JAVA总结回顾使用 * 主要借鉴了马士兵老师的视频进行总结 * @author Kingram */ 标识符的概念和命名规则 JAVA常量---不可变的变量 程序的执行 ...

  3. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  4. 学习C语言偶遇【斐波那契数列】

    1.今天学着学着就发现一个特别有趣的数列,斐波那契数列,感觉很好玩,翠花,上代码~~~~~~~ #include <stdio.h> int fibonaci(int i) { ) { ; ...

  5. PAT 1101 Quick Sort

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  6. MySQL之SQL优化详解(一)

    目录 慢查询日志 1. 慢查询日志开启 2. 慢查询日志设置与查看 3.日志分析工具mysqldumpslow   序言: 在我面试很多人的过程中,很多人谈到SQL优化都头头是道,建索引,explai ...

  7. [BZOJ1031][JSOI2007]字符加密Cipher(后缀数组)

    传送门 算是个模板. 题目说循环,那就再复制一串拼接上. 然后求后缀数组,再搞就可以. 虽然是求后缀,会在后面多一些字符串,然而题目中说的是循环一圈,但是没有影响. ——代码 #include < ...

  8. Spring MVC 入门(二)

    前言 上一篇讲到了 Spring MVC 的基本请求处理流程,本篇主要说一说如何使用 Spring MVC 来构建一个简单例子. 大致步骤如下 1.新建项目 2.导入相应 jar 包 (Spring ...

  9. [转]十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众

    一:文起缘由 写这一篇的目的源自于最近看同事在写wcf的时候,用特别感觉繁琐而且云里雾里的嵌套try catch来防止client抛出异常,特别感觉奇怪,就比如下面的代码. public void S ...

  10. Openfire:重新配置openfire

    有些时候当我们在对openfire开发时,需要重置openfire的配置,这时最简单的方法就是重新运行openfire的安装程序.要重新运行安装程序,方法很简单: 打开openfire的安装目录,找到 ...