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 创建缩略图的步骤如下: 在图像周围添加带有 ...
随机推荐
- 详解proxy_pass、upstream与resolver
详解proxy_pass.upstream与resolver boldcautious 关注 2018.06.04 10:48 字数 1204 阅读 1434评论 0喜欢 2 应用场景 这里列举几个应 ...
- ES6学习历程(变量的解构赋值)
一.数组的解构赋值 1.举几个例子足以理解 let [a, b, c] = [1, 2, 3]; a:1; b:2; c:3; let [x, , y] = [1, 2, 3]; x:1 y ...
- 求n!(高精度问题)
#include <iostream> #include <stdio.h> #define MAX 10000 using namespace std; void Mul(i ...
- 14.multi_match+most-fields策略
主要知识点 most-fields策略的用法 most-fields策略和best-fields的比较 best-fields策略:将某一个field匹配尽可能多的关键词的doc优先返 ...
- BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)
这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...
- kafka监控工具kafka-manager
1.几个kafka监控工具 Kafka Web Console:监控功能较为全面,可以预览消息,监控Offset.Lag等信息,但存在bug,不建议在生产环境中使用. Kafka Manager:偏向 ...
- 【Developer Log】ProGuard扰码可执行JAR包
在项目上线之前需要通过ProGuard来对java的class进行混淆,以避免反编译方式,来保护自己的代码.ProGuard网上有很多资料,可以参考:http://blog.csdn.net/zhan ...
- [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...
- asp.net--解决上传文件大小限制
原文地址 第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点 对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大 ...
- percona-toolkit使用教程
1:慢日志查询 [root@test_dx modify]# wget percona.com/get/pt-query-digest [root@test_dx modify]# file pt-q ...