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 创建缩略图的步骤如下: 在图像周围添加带有 ...
随机推荐
- modelsim 仿真软件 百度云分享 modelsim se 10.7 10.6d 10.6c 10.5 10.4
modelsim se 10.7 链接:https://pan.baidu.com/s/1NDC2yMCZmA4bIRSk2dUiTg 提取码:4l1d 复制这段内容后打开百度网盘手机App,操作更方 ...
- UVA1395 Slim Span(kruskal)
题目:Slim Span UVA 1395 题意:给出一副无向有权图,求生成树中最小的苗条度(最大权值减最小权值),如果不能生成树,就输出-1: 思路:将所有的边按权值有小到大排序,然后枚举每一条边, ...
- bat 读取当前目录指定文件信息并拼接
bat 读取指定文件的信息并拼接成指定格式
- Colored Sticks (并查集+Trie + 欧拉路)
Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 37340 Accepted: 9796 Description You ...
- hibernate即时获取数据库信息
由于读取数据的时候,Hibernate将第一次读取的内容放到了缓存中,若此时有别的应用修改了数据库中的数据,程序再次读取的时候,内容是从缓存中直接获取,无法反映数据库中的最新状况. 因此,可以设置读取 ...
- MYSQL 源码
http://www.cnblogs.com/wingsless/tag/MySQL/
- 《MySQL 5.7 Replication新特性》分享之互动问题解答
原创 2016-07-21 宋利兵 MySQL中文网 分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研 ...
- python 类中的方法
首先,方法是类内部定义的函数,所以方法是类的属性而不是实例的属性. 其次,方法只能在所属的类拥有实例的时候才能被调用.当存在一个实例的时候,我们可以说方法被绑定到实例.如果没有实例,那么我们就说方法是 ...
- MVC.Net 5:允许保存和输出Html内容
当我们在保存表单内容时,如果其中有一项内容包含Html的tag时,系统会报如下错误: A potentially dangerous Request.Form value was detected f ...
- 使用python获取CPU和内存信息的思路与实现(linux系统)
linux里一切皆为文件,在linux/unix的根文件夹下,有个/proc文件夹,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc&qu ...