hibernate的调用过程

public class demo01 {

    @Test
public void test(){
// 1.加载hibernate核心配置文件
Configuration configure = new Configuration().configure(); // 2.创建SessionFactory对象:类似JDBC连接池
SessionFactory factory = configure.buildSessionFactory(); // 3.通过SessionFactory获取Session对象:类似Connection对象
Session session = factory.openSession(); // 4.手动开启事务
Transaction transaction = session.beginTransaction(); // 5.编写代码执行数据库操作
User user = new User();
user.setId(null);
user.setName("admin");
user.setPassword("123");
Serializable save = session.save(user);
int ret = (int) save; // 6.提交事务
if(ret > 0){
transaction.commit();
}else {
transaction.rollback();
} session.close();
factory.close(); }
}

加载核心配置文件

Configuration类,加载核心配置文件

  • 加载hibernate.properties文件,hibernate里无法引入映射文件,所以需要手动加载映射文件

    // 1.加载hibernate核心配置文件
    Configuration configure = new Configuration();
    configure.addResource("com/qf/entity/User.hbm.xml");//手动加载映射文件
  • 加载hibernate.cfg.xml文件
    // 1.加载hibernate核心配置文件
    Configuration configure = new Configuration().configure();

创建SessionFactory对象

SessionFactory,相当于一个数据库连接池,是线程安全的对象,一个项目只需要创建一个SessionFactory对象

另外,SessionFactory是一个重量级的对象,所以有必要将SessionFactory的创建过程单独抽取处理

public class SessionFactoryUtil {
private static Configuration cfg ;
private static SessionFactory factory; static {
cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
} public Session getSession(){
Session session = factory.openSession();
return session;
}
}

获取Session对象以及操作数据库

Session对象,相当于JDBC操作中的Connection,负责对被持久化对象进行CRUD操作,并且线程不安全,所以不能把session定义成全局的或者抽出来单独处理

  • 保存方法,save方法返回的是新增记录的id,saveOrUpdate方法适合保存和修改
  • 修改方法,推荐先查询再修改

  • 删除方法,推荐先查询,再删除,便于级联删除
  • 查询方法
    • load
    • get 
    • load方法和get方法的区别  
      •   

         查询方法 加载策略 返回结果 查不到对象的处理方式 sql发送时机
        load() 延迟加载

        代理对象

        javassist-3.23.1-GA.jar提供的代理技术支持

        ObjectNotFoundException 真正使用对象时
        get() 立即加载 对象本身 null 执行到当前代码时

事务相关操作

Transaction,管理Hibernate中的事务

  • 开启事务

    Transaction transaction = session.beginTransaction();
  • 提交事务
    transaction.commit();
  • 回滚事务
    transaction.rollback();

其他的API

Query

传递的参数是HQL语句,是面向对象的查询,返回的是一个对象的集合

String sql = "from User where id < ? and name like ?";

  1. 这里User是对象,id和name是对象的属性
  2. query.setInteger(0, 10);和query.setString(1, "%ad%");是设置HQL中的"?"参数值(索引位置从0开始)

简单查询

@Test
public void query() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); String sql = "from User where id < ? and name like ?";
Query query = session.createQuery(sql);
query.setInteger(0, 10);
query.setString(1, "%ad%");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
} tx.commit();
session.close();

----------------------------------console----------------------------------

Hibernate:
select
user0_.id as id1_0_,
user0_.name as name2_0_,
user0_.password as password3_0_
from
user user0_
where
user0_.id<?
and (
user0_.name like ?
)
User [id=3, name=admin, password=123]
User [id=4, name=admin, password=123]
User [id=8, name=admin, password=123]

分页查询

  • query.setFirstResult(2):从第几条记录开始查询
  • query.setMaxResults(3):本页一共查询多少条记录
@Test
public void query() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); String sql = "from User";
Query query = session.createQuery(sql);
query.setFirstResult(2);
query.setMaxResults(3);
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
} tx.commit();
session.close();
}

----------------------------------console----------------------------------

Hibernate:
select
user0_.id as id1_0_,
user0_.name as name2_0_,
user0_.password as password3_0_
from
user user0_ limit ?,
?
User [id=3, name=admin, password=123]
User [id=4, name=admin, password=123]
User [id=5, name=hz, password=0]

Criteria

Query By Criteria:条件查询

完全面向对象的查询方式

  1. c.add(Restrictions.like("name", "%ad%")):这里的"name"是属性名,"%ad%"是参数值
  2. 返回的是一个对象的集合

查询user表中id>3并且名字中含有ad的记录

@Test
public void criteria() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); //Criteria c = session.createCriteria("com.qf.entity.User");
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.like("name", "%ad%"));
c.add(Restrictions.gt("id", 3));
List<User> list = c.list();
for (User user : list) {
System.out.println(user);
} tx.commit();
session.close();
} 

----------------------------------console----------------------------------

    select
this_.id as id1_0_0_,
this_.name as name2_0_0_,
this_.password as password3_0_0_
from
user this_
where
this_.name like ?
and this_.id>?
User [id=4, name=admin, password=123]
User [id=8, name=admin, password=123]

SQLQuery

接收的是SQL语句,返回的是Object[]的集合

查询user表中id>3并且名字中含有ad的记录

@Test
public void SqlQuery() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); String sql = "select * from user where id>? and name like ?";
SQLQuery query = session.createSQLQuery(sql);
query.setInteger(0, 3);
query.setString(1, "%ad%"); List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
} tx.commit();
session.close();
}

----------------------------------console----------------------------------

Hibernate:
select
*
from
user
where
id>?
and name like ?
[4, admin, 123]
[8, admin, 123]

二、hibernate的常用API的更多相关文章

  1. 【OpenGL游戏开发之二】OpenGL常用API

    OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...

  2. 分享知识-快乐自己:Hibernate框架常用API详解

    1):Configuration配置对象 Configuration用于加载配置文件. 1): 调用configure()方法,加载src下的hibernate.cfg.xml文件 Configura ...

  3. NodeJS:(二)基础常用API

    node.js中文网:http://nodejs.cn/api/ (path.Buffer.events.fs) ①path路径-----const {resolve} = require('path ...

  4. Hibernate常用api以及增删改查

    一   .API的定义 所谓的API全称就是(Application Programming Interface,应用程序编程接口).就是类库对外提供的接口.类.枚举.注解等元素. 如:JDK API ...

  5. Servlet 常用API学习(二)

    Servlet常用API学习 一.HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议. HTTP是 hypertext transfer pr ...

  6. Netty的常用API(二)

    在使用Netty之前先介绍下Netty的常用API,对其有一个大概的了解. 一.EventLoop和EventLoopGroup EventLoop如同它的名字,它是一个无限循环(Loop),在循环中 ...

  7. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

  8. Java 常用API(二)

    目录 Java 常用API(二) 1. Object类 2. Date类 概述 构造方法和成员方法 3. DateFormat类 概述 SimpleDateFormat类 练习 4. Calendar ...

  9. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

随机推荐

  1. 【ARC076F】 Exhausted

    hall定理大概是匈牙利的理论基础吧 hall定理的内容:二分图\(G\)的的左部点点集为\(\rm X\),右部点点集为\(\rm Y\),设\(|\rm X|\leq |Y|\),则二分图\(G\ ...

  2. mysql修改root密码和设置权限 转摘:http://www.cnblogs.com/wangs/p/3346767.html

    整理了以下四种在MySQL中修改root密码的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR ' ...

  3. bzoi1152 [CTSC2006]歌唱王国Singleland

    [CTSC2006]歌唱王国Singleland Time Limit: 30 Sec Memory Limit: 162 MB Description 在歌唱王国,所有人的名字都是一个非空的仅包含整 ...

  4. 基于QRcode的带有文字+图片的二维码的Vue组件

    1 <template> 2 <!-- 生成二维码开放接口: 3 二维码内容[通常为url] 4 二维码大小[限制为正方形] 二维码下方显示:文字 5 二维码中间显示:图片--> ...

  5. RecyclerView跳转到指定位置的三种方式

    自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView的出现目的是为了替代listview和ScrollVie ...

  6. python 循环中使用多个subplot画子图像(python matplotlib use more than one subplot in loop)

    在循环语句中画出多个subplot图像代码如下 http://jonathansoma.com/lede/data-studio/classes/small-multiples/long-explan ...

  7. C/C++ C++ 11 std::move()

    { 0. C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意 是想把参数push_back进去就行 ...

  8. 【原理】Reids字典

    I.字典的实现 Redis的字典使用哈希表作为底层实现. 1.1 哈希表 Redis字典所使用的哈希表结构定义如下: typedef struct dictht { // 哈希表数组 dictEntr ...

  9. tp框架连接数据库配置及Model数据模型层

    在config.php做数据库连接配置 <?php return array( //'配置项'=>'配置值' 'SHOW_PAGE_TRACE'=>true, /* 数据库设置 */ ...

  10. Ceph介绍及原理架构分享

    https://www.jianshu.com/p/cc3ece850433 1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能. ...