今天想回顾一下一个月前学的hibernate框架,也让我了解了持久层的概念(访问数据库).

一、ORM概念

首先提的是ORM概念,O表示Object,

R表示Relation(关系),关系型数据库,如mysql,oracle等,M表示mapping,ORM连起来对象关系映射.

Hibernate 实现了ORM,解决了两个问题:一是存储:把对象的数据直接保存到数据库中,二是获取,直接从数据库中拿到一个对象,中间必须通过映射这个概念

二、Hibernate HelloWorld案例

搭建一个Hibernate环境,开发步骤:

1. 下载源码

版本:hibernate-distribution-3.6.0.Final

2. 引入jar文件

         hibernate3.jar核心  +  required 必须引入的(6个) +  jpa 目录  + 数据库驱动包

如下图:

3. 写对象以及对象的映射

         Employee.java            对象

         Employee.hbm.xml        对象的映射 (映射文件)

4. src/hibernate.cfg.xml  主配置文件

-à 数据库连接配置

-à 加载所用的映射(*.hbm.xml)

5. App.java  测试

Employee.java对象

package cn.itcast.a_hello;

import java.util.Date;

public class Employee {

    private int empId;
private String empName;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getEmpDate() {
return empDate;
}
public void setEmpDate(Date empDate) {
this.empDate = empDate;
}
private Date empDate;
public Employee() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName
+ ", empDate=" + empDate + "]";
} }

Employee.hbm.xml配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.a_hello">
<class name="Employee" table="employee">
<!-- 主键映射值 -->
<id name="empId" column="id">
<generator class="native">
</generator>
</id> <!-- 非主键映射 -->
<property name="empName" column="empName"></property>
<property name="empDate" column="empDate"></property>
</class>
</hibernate-mapping>

hibernate.cfg.xml主配置文件

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory name="foo"> <!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=Employee</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">XXXXXX</property>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
<!-- 2.其它配置设置 -->
<!-- 2.1设置运行时是否显示执行的sql语句 -->
<property name="show_sql">true</property> <!-- 2.2设置运行的sql语句格式化 -->
<property name="hibernate.format_sql">true</property> <!-- 2.3设置是否创建表
1.create不存在表直接创建,存在则先删除表再创建表
2.update如果存在就不会创建表,如果不存在则创建
3.create-drop createSessionFactory()时创建表
sf.close()删除表
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 加载所有映射
<mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
</session-factory>
</hibernate-configuration>

最后的效果:

最后看到数据库多了一条记录

三、Hibeanate的API

|-- Configuration       配置管理类对象

config.configure();    加载主配置文件的方法(hibernate.cfg.xml)

默认加载src/hibernate.cfg.xml

config.configure(“cn/config/hibernate.cfg.xml”);   加载指定路径下指定名称的主配置文件

config.buildSessionFactory();   创建session的工厂对象

|-- SessionFactory     session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)

sf.openSession();   创建一个sesison对象

sf.getCurrentSession();  创建session或取出session对象

|--Session       session对象维护了一个连接(Connection), 代表了与数据库连接的会话。

Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象

session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

更新:

session.save(obj);   保存一个对象

session.update(emp);  更新一个对象

session.saveOrUpdate(emp);  保存或者更新的方法:

à没有设置主键,执行保存;

à有设置主键,执行更新操作;

à如果设置主键不存在报错!

配置SessfionFactory

    private static SessionFactory sf;

    //加载配置文件,只执行一次
static{
/**
* 创建SessionFactory对象,指定了class对象后就
* 可以不用在主配置文件中指定<mapping resource=""/>
*/ sf = new Configuration()
.configure()
.addClass(Employee.class)//(测试)会自动加载Employee.hbm.xml文件,必须和该类在同一包下
.buildSessionFactory(); }

测试保存:

@Test
public void testSave() throws Exception{
// TODO Auto-generated method stub
//对象
Employee emp = new Employee();
emp.setEmpName("张三");
emp.setEmpDate(new Date()); Session session = sf.openSession(); //开启事务alt+shift+l快速生成左边的变量,但鼠标要放在放在方法后面
Transaction tx = session.beginTransaction();
//保存到数据库
session.save(emp);
// session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
//提交事务
tx.commit();
session.close(); }

测试更新

@Test
public void testUpdate()
{
//对象
Employee emp = new Employee();
emp.setEmpName("李四2");
emp.setEmpId(4); //1.创建session
Session session = sf.openSession(); //2.开启事务
Transaction tx = session.beginTransaction();
//3.执行更新操作,必须设置主键
//session.update(emp); //根据主键得到对应的对象
Employee employee = (Employee) session.get(Employee.class, 5);
System.out.println(employee); //save或者update,当设置主键时,执行更新操作,当没有设置主键时执行插入操作
session.saveOrUpdate(emp);
tx.commit();
session.close();
}

四、三种方式查询

一、主键查询:

session.get(Employee.class, 1);    主键查询

session.load(Employee.class, 1);   主键查询 (支持懒加载)

例如:

    @Test
public void testGet()
{
Session session = sf.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
Employee emp = (Employee) session.get(Employee.class,5);
System.out.println(emp);
tx.commit();
session.close();
}

二、HQL查询:

HQL查询与SQL查询区别:

SQL: (结构化查询语句)查询的是表以及字段;  不区分大小写。

HQL: hibernate  query  language 即hibernate提供的面向对象的查询语言

查询的是对象以及对象的属性。

区分大小写。优点跨平台

//HQL查询
@Test
public void testSQL()
{
//1.创建session
Session session = sf.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Employee where id= 2 or id=5"); List<Employee> list = q.list();
System.out.println(list);
tx.commit();
session.close(); }

三、Criteria查询:

完全面向对象的查询。

    @Test
public void testCRQ()
{
//1.创建session
Session session = sf.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
Criteria crita = session.createCriteria(Employee.class);
//查询条件
crita.add(Restrictions.eq("id", 8));
List<Employee> list = crita.list();
System.out.println(list);
tx.commit();
session.close(); }

四、本地SQL查询:

复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!

(缺点: 不能跨数据库平台!)

 //本地SQL查询
@Test
public void testSQL()
{
//1.创建session
Session session = sf.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
SQLQuery se = session.createSQLQuery("select * from employee");
//查询条件 List<Employee> list = se.list();
System.out.println(list);
tx.commit();
session.close(); }

Hibernate 实现分页查询

//HQL实现分页查询
@Test
public void testFenYe()
{
//1.创建session
Session session = sf.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Employee");
//设置分页参数.起始从零开始
query.setFirstResult(0);//查询的起始记录
query.setMaxResults(4);//查询的记录数
List<Employee> list = query.list();
System.out.println(list);
tx.commit();
session.close(); }

值得注意的问题:

共性问题1:

ClassNotFoundException…., 缺少jar文件!

问题2:

如果程序执行程序,hibernate也有生成sql语句,但数据没有结果影响。

问题一般是事务忘记提交…….

遇到问题,一定看错误提示!

初识Hiberante框架和第一个案例的更多相关文章

  1. 初识Spring框架

    一.Ioc 1)概念:Ioc(Inversion Of Control)控制反转,也被称为依赖注入DI(Dependency Injection),是面向对象编程的一种思想. 2)作用:用来减低程序代 ...

  2. 学习ExtjsForVs(第一个案例HelloWord)

    第一个案例-Hello Word 1.本次练习以ext-4.0.7为例,首先从网上下载ext包. 2.打开包后将里面的三个文件或文件夹拷贝到项目中. resource文件夹 bootstrap.js ...

  3. bootstrap框架开发电子商城案例

    bootstrap框架开发电子商城案例 玛图 bootstrap 商城框架

  4. Android开源框架Afinal第一篇——揭开圣女的面纱

    Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...

  5. spring boot实战(第一篇)第一个案例

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   spring boot实战(第一篇)第一个案例 前言 写在前面的话 一直想将spring boot相关内容写成一个系列的 ...

  6. 初识Mybatis框架

    mybatis框架  主要是对数据库进行操作的 编写sql语句 使我们对数据库的crud操作更加简洁方便!! 1.使用mybatis框架 进行第一个项目 查询数据库 并返回数据 :(简单) (1)搭建 ...

  7. Struts2框架学习第一章——Struts2概述

    本章要点 —  Web应用的发展 —  Model 1和Model 2 —  MVC思想 —  MVC模式的优势 — 常用MVC框架及其特征 —  Struts 1的基本结构及其存在的问题 —  We ...

  8. (转)编写Spring的第一个案例并测试Spring的开发环境

    http://blog.csdn.net/yerenyuan_pku/article/details/52832145 Spring4.2.5的开发环境搭建好了之后,我们来编写Spring的第一个案例 ...

  9. 手把手教你如何新建scrapy爬虫框架的第一个项目(上)

    前几天给大家分享了如何在Windows下创建网络爬虫虚拟环境及如何安装Scrapy,还有Scrapy安装过程中常见的问题总结及其对应的解决方法,感兴趣的小伙伴可以戳链接进去查看.关于Scrapy的介绍 ...

随机推荐

  1. The Best Path(HDU5883)[欧拉路]2016青岛online

    题库链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 欧拉回路裸题,第一次接触欧拉路的我是真的长见识了^-^ 懂了欧拉路这道题就是没什么问题了,欧拉路 ...

  2. 解决npm报错:Module build failed: TypeError: this.getResolve is not a function

    1.sass-loader的版本过高导致的编译错误,当前最高版本是8.x,需要退回到7.3.1 运行: npm uninstall sass-loader --save-dev(卸载当前版本) npm ...

  3. zstuoj 4423: panda和卡片

    传送门:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4423 题意: 给定许多数字,这些数字都是2的倍数,问可以用这些数字组成多少个数字. ...

  4. CodeForces-38B-Chess枚举+思维

    CodeForces-38B-Chess 这是一道与下象棋有关的题目,题意是给你一个车和马的坐标,然后再给你一个马,让你判断最后三者都不会被吃掉的可能性,注意的是三者是三个独立的个体. 这道题要知道一 ...

  5. 牛客暑假多校第一场 J Different Integers

    题意:给你一个数组, q次询问, 每次询问都会有1个[l, r] 求 区间[1,l] 和 [r, n] 中 数字的种类是多少. 解法1, 莫队暴力: 代码: #include<bits/stdc ...

  6. hdu 6435 CSGO

    题意:现在有n个主武器, m个副武器, 你要选择1个主武器,1个副武器, 使得 题目给定的那个式子最大. 题解:这个题目困难的地方就在于有绝对值,| a - b | 我们将绝对值去掉之后 他的值就为 ...

  7. 2017 ACM/ICPC Asia Regional Qingdao Online 1003 The Dominator of Strings hdu 6208

    The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  8. 入门MySQL——备份与恢复

    前言:  前面几篇文章为大家介绍了 MySQL 各种语句语法的用法及用户权限相关知识.本篇文章将主要讲解 MySQL 数据库数据备份与恢复相关知识,主要聚焦于逻辑备份,介绍mysqldump工具的使用 ...

  9. 一文读懂 Android TouchEvent 事件分发、拦截、处理过程

    什么是事件?事件是用户触摸手机屏幕,引起的一系列TouchEvent,包括ACTION_DOWN.ACTION_MOVE.ACTION_UP.ACTION_CANCEL等,这些action组合后变成点 ...

  10. springboot2之结合mybatis增删改查解析

    1. 场景描述 本节结合springboot2.springmvc.mybatis.swagger2等,搭建一个完整的增删改查项目,希望通过这个基础项目,能帮忙朋友快速上手springboot2项目. ...