Hibernate基础(二)
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基础(二)的更多相关文章
- Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1
Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...
- 将 Shiro 作为应用的权限基础 二:shiro 认证
认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的“实体/凭证”组合便是“用户名/密码”组合. 一. ...
- hibernate基础dao类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- Bootstrap<基础二十七> 多媒体对象(Media Object)
Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...
- Bootstrap <基础二十六>进度条
Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
随机推荐
- kswapd和pdflush
首 先,它们存在的目的不同,kswap的作用是管理内存,pdflush的作用是同步内存和磁盘,当然因为数据写入磁盘前可能会换存在内存,这些缓存真正写 入磁盘由三个原因趋势:1.用户要求缓存马上写入磁盘 ...
- codevs2833 奇怪的梦境
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- Coefficient Computation (大整数、Java解决)
Coefficient Computation UVALive8265 题意:计算组合数C(n,k)的值并将值按给定的进制输出. 思路:Java大整数类硬上. PS:刚刚学完Java的大整数类,结果却 ...
- js事件委托或事件代理
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
- 【转载】Apache shutdown unexpectedly启动错误解决方法
http://blog.csdn.net/dong123dddd/article/details/21372179 xampp启动时显示的错误为: 9:52:41 [Apache] Attempti ...
- 最短路径--Floyd算法
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- N天学习一个linux命令之ssh
用途 通过加密连接,远程登录主机和在远程主机执行命令,也可以用于转发x11和tcp,也可用于搭建VPN.第一次连接时,会弹出远程主机公钥指纹确认信息,通过这个方式防止中间人攻击. 用法 ssh [op ...
- Openfire:通过Servlet群发消息
在Openfire中自带有Broadcase插件,可以让我们群发消息给全部用户或者组.不过如果是我们通过Servlet来实现这一功能,那么是能够增加一定的灵活性的.具体做法直接看Demo代码: pub ...
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
在看完<Objective-C 程序设计 第6版>之后,看了一些关于iOS开发职位的面试题,发现自身基础非常是不牢,于是打算以查缺补漏的方式阅读还有一本关于Objective-C的基础书籍 ...