Hibernate增删改查

1.首先我们要知道什么是Hibernate

Hibernate是一个轻量级的ORMapping对象。主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获取的方法,

可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间,解放编程人员95%的任务。

2.什么是ORM  Object-Relational-Mapping对象关系映射

ORM:是通过java对象映射到数据库表,通过操作Java对象可以完成对数据表的操作。(假如你用的是Dbutils那么还需要在Java类中写sql语句,而orm就不用)

Hibernate是一个完全的ORM框架只需要对对象的操作即可生成底层的SQL。

接下来直接进入主题:

先看看使用hibernate的基本流程!下面是简单的流程图

1.创建项目:

用myeclipse创建一个web project

2.导入hibernate相关的架包到项目

第三步: 配置文件hibernate

hibernate的配置有两种形式!

一种是使用hibernate.properties文件!

另一种是使用hibernate.cfg.xml文件!这里我们使用hibernate.cfg.xml进行配置

a. 采用properties方式,必须手动编程加载hbm文件或者持久化类

b. 采用XML配置方式,可以配置添加hbm文件

在src目录下新建一个xml文件,名称为hibernate.cfg.xml(当然,你也可以不叫这个名称,不过在代码中要作相应的修改),拷贝如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<!-- 配置会话工厂 hibernate 核心 管理数据库连接池 -->
<session-factory>
<!-- 1.配置数据库连接参数 -->
<!-- 1.1配置jdbc四个基本连接参数 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernateexec</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 1.2配置 hibernate使用的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 2.配置其他相关属性 -->
<!-- 2.1自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 2.2在日志中输出sql -->
<property name="hibernate.show_sql">true</property>
<!-- 2.3格式化sql -->
<property name="hibernate.format_sql">true</property> <!-- 开启事务 -->
<property name="hibernate.connection.autocommit">true</property> <!-- 配置c3p0数据库连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">50</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 3.加载映射文件 -->
<mapping resource="com/study/model/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>

配置hibernate.cfg.xml

这里提醒一点:customer表你可以不用去手动创建,但是数据库hibernateexec是要你手动创建的

第四步.创建实体和映射文件 

public class Customer {

    private int id;
private String name;
private int age;
private String city;
private String addr;
}
/*
* 提供set和get方法
*/

Customer 实体

映射文件和实体对象在同一个包下:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 完成实体类 和数据表的映射 -->
<!-- 1.类与表的映射 -->
<!--
name 要映射的完整类名
table 映射到数据库的表名
catalog 映射到数据库的名字
-->
<class name="com.study.model.Customer" table="customer" catalog="hibernateexec">
<!-- 2.类中属性 和表中 数据列的映射 -->
<!-- 2.1主键 -->
<!--
name 属性名(类中)
column 列名(表中)
type 数据类型
-->
<id name="id" column="id" type="int">
<!-- 配置主键生成策略 主键自动增长-->
<generator class="identity"></generator>
</id>
<!-- 2.2 普通属性 -->
<!--
name 属性名(类中)
column 列名(表中)
type 数据类型(也可以直接写String)
-->
<property name="name" column="name" type="java.lang.String"></property>
<property name="age" column="age" type="int"></property>
<!-- 也可以分开写 -->
<property name="city">
<column name="city" sql-type="varchar(20)"></column>
</property>
<!-- 如果什么都不写,那就默认类的属性名和数据库中的列名一致都为addr,类型为varchar -->
<property name="addr"></property> </class> </hibernate-mapping>

Customer.hbm.xml

第五步:创建SessionFactory对象

第六步:获取Session对象进行相关操作

第五步和第六步我和在一起,第六步我们发现不论增删改查前面四步都是一样的,我们其实可以提取到一个工具类,再来调用这样加快效率。

import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.study.model.Customer; public class HibernateTest {
/*
* 保存数据
*/
@Test
public void testInsert() {
// 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 编写自己的逻辑代码
Customer customer = new Customer();
customer.setName("小黄");
customer.setAge(40);
customer.setCity("北京");
// 直接保存
session.save(customer); // 提交事务
transaction.commit();
session.close();
sessionFactory.close();
} //查询所有的
@Test
public void testFindAllByHQL(){
// 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction(); //编写HQL语句(面向类和属性的查询
String hql =" from Customer";//这里是Customer不是表名 是类名 查询Customer
Query query =session.createQuery(hql); List<Customer> customers=query.list();
System.out.println(customers); // 提交事务
transaction.commit();
session.close();
sessionFactory.close();
} // 删除
@Test
public void testDelete() {
// 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction(); Customer customer =new Customer();
customer.setId(2);
session.delete(customer); // 提交事务
transaction.commit();
session.close();
sessionFactory.close();
} // 修改
@Test
public void testUpdate() {
// 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 2);
customer.setCity("杭州");
session.update(customer); // 提交事务
transaction.commit();
session.close();
sessionFactory.close(); } // 查询 根据id查询
@Test
public void testFindById() {
// 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1);
System.out.println(customer); // 提交事务
transaction.commit();
session.close();
sessionFactory.close();
}
}

hibernate增删改查

运行效果:当你运行第一个增加用户的时候,运行结束数据库会自动创建customer表格,和往表格里添加数据。

这样就通过hibernate进行基础的增删改查了。

本文就到这里了,有不足之处欢迎大家指点,谢谢!

hibernate系列笔记(1)---Hibernate增删改查的更多相关文章

  1. Hibernate通过createSQLQuery( )方法实现增删改查

    一.项目结构 二.hibernate核心配置文件:   hibernate.cfg.xm <?xml version="1.0" encoding="UTF-8&q ...

  2. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一)

    前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...

  3. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  4. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  5. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)

    前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就 ...

  6. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

  7. 2、hibernate七步走完成增删改查

    一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操 ...

  8. hibernate对单表的增删改查

    ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...

  9. Hibernate之API初识及增删改查实现

    声明:关于hibernate的学习.非常大一部分东西都是概念性的. 大家最好手里都有一份学习资料,在我的博文中.我不会把书本上的概念一类的东西搬过来.那没有不论什么意义.关于hibernate的学习, ...

随机推荐

  1. iOS 之 编外知识点

    iOS 使用github iOS 开源库介绍 iOS 优质方案 iOS 开发framework 后端数据库使用 Bomb方案 iOS 错误及解决汇总 后台 之 Bmob 申请苹果企业账号

  2. vim中多行注释 和 删除多行注释

    1.多行注释:   a. 按下ctrl + v,进入列模式;   b. 在行首选择需要注释的行;   c. 按下"I",进入插入模式:  d. 然后输入注释符("//&q ...

  3. 使用UTF8-CPP转换unicode编码 附录:UTF8和UTF16和UTF32和Unicode编码

    本文用于解决如何用C++处理字符串的编码格式.本文采用的是成熟便捷的UTF8库来处理这个问题.首先是下载UTF8库,网址为:http://utfcpp.sourceforge.net/ 为了方便后续使 ...

  4. MyEclipse 显示行标

    方法一:在行的显示行标位置(行前),右键->Show Line numbers 方法二:Window->preferences->General->editor->tex ...

  5. Linux下的文件目录结构详解

    Linux下的文件目录结构详解 / Linux文件系统的上层根目录 /bin 存放用户可执行的程序 /boot 操作系统启动时所需要的文件 /dev 接口设备文件目录,例如:had表示硬盘 /etc ...

  6. jQuery原型技术分解

    jQuery原型技术分解 起源----原型继承 用户过javascript的都会明白,在javascript脚本中到处都是 函数,函数可以归置代码段,把相对独立的功能封闭在一个函数包中.函数也可以实现 ...

  7. js判断ip地址,子网掩码,网关的逻辑性检查

    因为要做静态地址配置的js校验,找了好多资料发现网上都是关于ip,mask的有效性检查,没有ip,submask,gateway的逻辑性判断,自己写下代码供需要的人参考. 普及下网关地址知识: 就是进 ...

  8. WPF DataPager控件

    最近在项目中遇到远程加载数据的问题,由于服务器采用分页方式返回数据,因此客户端也相应的制作了一个分页控件.代码相对简单,算做入门级的源码. 效果如图: 初步分析,分页功能只需要3个核心变量:PageI ...

  9. FlashPlayer11 异步解码 Bitmap

    Flash Player 11引入了一个全新的功能是异步解码位图的功能,这个功能对某些类型的Flash应用会很有效,尤其是需要加载大分辨率的位图的相册或游戏会有显著效果,使用位图图像时,可以异步解码和 ...

  10. iOS tabbar点击动画效果实现

    正常情况下,我们点击tabbar都只有一个变色效果,但有时候,如果我们想给它添加一个点击动画,该如何做呢? 先上几个效果图: 1.先放大,再缩小 2.Z轴旋转               3.Y轴位移 ...