版权声明:本文为博主原创文章,如需转载请标注转载地址

博客地址:http://www.cnblogs.com/caoyc/p/5594789.html 

对于Hibernate的增删改查,我们还是用一个案例来说明

下面是整个项目的目录结构:

一、com.mypro.domain包

1、封装person域模型

 package com.mypro.domain;

 public class Person {

     private int id;
private String name;
private int age;
private String gender;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", gender=" + gender + "]";
}
public Person(int id, String name, int age, String gender) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public Person() {
super();
} }

Person.java

2、定义QueryResult用来返回分页查询结果集以及表总所有记录数据的封装

 package com.mypro.domain;

 import java.util.List;

 public class QueryResult {

     //返回数据库中某表总的记录数
private long count;
//返回结果集
private List list;
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public QueryResult(long count, List list) {
super();
this.count = count;
this.list = list;
}
public QueryResult() {
super();
} }

QueryResult.java

3、定义Person类和数据库表的映射关系

 <?xml version="1.0"?>

 <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.mypro.domain">
<class name="Person" table="person">
<id name="id" column="Id" type="int">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"></property>
<property name="age" column="Age" type="int"></property>
<property name="gender" column="Gender" type="string"></property>
</class>
</hibernate-mapping>

Person.hbm.xml

二、com.mypro.dao包

1、定一个IPerson的接口,以及接口需要实现的方法

 package com.mypro.dao;

 import java.util.List;

 import com.mypro.domain.Person;
import com.mypro.domain.QueryResult; public interface IPerson { /**
* 添加Person
* @param person
*/
void add(Person person); /**
* 通过ID删除Person
* @param id
*/
void delete(int id); /**
* 修改Person信息
* @param person
*/
void update(Person person); /**
* 通过ID获取Person
* @param id
* @return
*/
Person get(int id); /**
* 获取所有的Person
* @return List集合
*/
List<Person> getAll(); /**
* 分页查询显示
* @param firstResult 第一条记录从哪里开始
* @param maxResults 最多包含多少条记录
* @return 该返回值包含了一个表的总记录数和一个List结果集
*/
QueryResult query(int firstResult,int maxResults); }

IPerson.java

三、com.mypro.util包

1、定一个HibernateUtils工具类,该类封装了SessionFactory对象

 package com.mypro.util;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils { //声明一个静态变量,并在静态代码块中给该对象赋值
private static SessionFactory sessionFactory;
static{
/*方式一
Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml"); //加载指定位置的配置
sessionFactory=cfg.buildSessionFactory();*/ /*方式二:当hibernate的主配置文件名称为hibernate.cfg.xml时,且该文件在类的根目录下时,当cfg.configure时可以省略参数
Configuration cfg=new Configuration();
cfg.configure(); //加载默认配置文件
sessionFactory=cfg.buildSessionFactory();*/ //方法三 :由于cfg.configure()方法返回的依然是Configuration对象,所以该方法更进一步精简为
sessionFactory=new Configuration()
.configure()
.buildSessionFactory();
} /**
* 获取SessionFactory工厂
* @return
*/
public static SessionFactory getSessionFactory(){
return sessionFactory;
} /**
* 获取返回一个打开的Session
* @return
*/
public static Session openSession(){
return sessionFactory.openSession();
}
}

HibernateUtils.java

四、com.mypro.dao.impl包

该包主要实现com.mypro.dao下的接口

1、实现IPerson接口

 package com.mypro.dao.impl;

 import java.util.List;

 import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import com.mypro.dao.IPerson;
import com.mypro.domain.Person;
import com.mypro.domain.QueryResult;
import com.mypro.util.HibernateUtils; public class PersonImpl implements IPerson { @Override
public void add(Person person) {
Session session=null;
Transaction tran=null;
try{
session=HibernateUtils.openSession();
tran=session.beginTransaction();
session.save(person);
tran.commit();
}catch(RuntimeException e){
if(tran!=null)
tran.rollback();
throw e;
}finally{
if(session!=null)
session.close();
} } @Override
public void delete(int id) {
Session session=null;
Transaction tran=null;
try{
session=HibernateUtils.openSession();
tran=session.beginTransaction();
Person person=session.get(Person.class, id);
session.delete(person);
tran.commit();
}catch(RuntimeException e){
if(tran!=null)
tran.rollback();
throw e;
}finally{
if(session!=null)
session.close();
} } @Override
public void update(Person person) {
Session session=null;
Transaction tran=null;
try{
session=HibernateUtils.openSession();
tran=session.beginTransaction();
session.update(person);
tran.commit();
}catch(RuntimeException e){
if(tran!=null)
tran.rollback();
throw e;
}finally{
if(session!=null)
session.close();
} } @Override
public Person get(int id) {
Session session=null;
try{
session=HibernateUtils.openSession();
return session.get(Person.class, id);
}catch(RuntimeException e){
throw e;
}finally{
if(session!=null)
session.close();
}
} @Override
public List<Person> getAll() {
Session session=null;
try{
session=HibernateUtils.openSession();
/*方式一
Query query= session.createQuery("FROM persion",,Person.class);
return query.list(); */
//方式二
return session.createQuery("from Person").list(); //注意HSL方式要求Person为类名,属性名和类名必须完全一致,其它关键字可忽略大小写
}catch(RuntimeException e){
throw e;
}finally{
if(session!=null)
session.close();
}
} @Override
public QueryResult query(int firstResult, int maxResults) {
Session session=null;
try{
session=HibernateUtils.openSession();
long count= (long)session.createQuery("SELECT COUNT(*) FROM Person").uniqueResult();
List list=session.createQuery("FROM Person")//
.setFirstResult(firstResult)//
.setMaxResults(maxResults)
.list();
return new QueryResult(count, list);
}catch(RuntimeException e){
throw e;
}finally{
if(session!=null)
session.close();
}
} }

PersonImpl.java

五、配置hibernate主配置文件

 <?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>
<session-factory name="mysqldb"> <!-- 配置方言:选择数据库类型 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 配置数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///test?characterEncoding=utf8</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property> <!-- 允许显示sql语句 -->
<property name="show_sql">true</property>
<!-- 导入映射文件 -->
<mapping resource="com/mypro/domain/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>

hibernate.cfg.xml

六、代码测试

1、在com.mypro.test包下PersonTest.java

 package com.mypro.test;

 import java.util.List;

 import org.junit.Test;

 import com.mypro.dao.IPerson;
import com.mypro.dao.impl.PersonImpl;
import com.mypro.domain.Person;
import com.mypro.domain.QueryResult; public class PersonTest { private static IPerson personDao=new PersonImpl(); @Test
public void add(){
Person person=new Person();
person.setName("zhh");
person.setAge(26);
person.setGender("女");
personDao.add(person);
} @Test
public void get(){
Person person=personDao.get(37);
System.out.println(person);
} @Test
public void update(){
Person person=personDao.get(37);
person.setAge(25);
personDao.update(person);
} @Test
public void getAll(){
List<Person> list=personDao.getAll();
for (Person person : list) {
System.out.println(person);
}
} @Test
public void query(){
QueryResult qr= personDao.query(2, 10);
System.out.println("总记录数:"+qr.getCount());
List<Person> list=qr.getList();
for (Person person : list) {
System.out.println(person);
}
} @Test
public void delete(){
personDao.delete(37);
}
}

PersonTest.java

Hibernate CRUD操作的更多相关文章

  1. 【Java EE 学习 44】【Hibernate学习第一天】【Hibernate对单表的CRUD操作】

    一.Hibernate简介 1.hibernate是对jdbc的二次开发 2.jdbc没有缓存机制,但是hibernate有. 3.hibernate的有点和缺点 (1)优点:有缓存,而且是二级缓存: ...

  2. hibernate入门-基本配置及简单的crud操作

    框架来说主要是需要写大量的配置文件,hibernate相比mybatis来说更强大,移植性更好: 1.类和数据库的映射配置:配置文件命名一般--类名.hbm.xml (user.hbm.xml),与实 ...

  3. 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作

    这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...

  4. hibernate的CRUD操作

    一对多关系映射的crud操作: 1.单项的保存操作 /** * 保存操作 * 正常的保存:创建一个联系人,需要关联客户 */ @Test public void test1(){ Session s= ...

  5. hibernate Session的CRUD操作

    使用Session里面的方法进行CRUD操作 (1) 增加 save 方法 (2) 查找 get 方法(根据id查) (3) 修改 update 方法 (4) 删除 delete 方法 1.增加 /* ...

  6. Java实战之02Hibernate-01简介、常用接口、CRUD操作

    一.Hibernate简介 1.Hibernate在开发中所处的位置 2.ORM映射 Object :面向对象领域的 Relational:关系数据库领域的 Mapping:映射 Object: Re ...

  7. JAVA实现DAO基本层CRUD操作

    随着shh2各种操作方便框架.越来越多JAVA WEB效率,可是,假设在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成非常多不是必需的资源浪费. 在项 ...

  8. [读书笔记] 四、SpringBoot中使用JPA 进行快速CRUD操作

    通过Spring提供的JPA Hibernate实现,进行快速CRUD操作的一个栗子~. 视图用到了SpringBoot推荐的thymeleaf来解析,数据库使用的Mysql,代码详细我会贴在下面文章 ...

  9. Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作

    只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...

随机推荐

  1. 计算机基础-day2

    为何要有操作系统? 首先要说明一下操作系统是什么? 操作系统是协调.管理.控制计算机硬件和为应用程序提供接口的控制软件,操作系统向下连接硬件,向上承载应用程序. 由于硬件不论种类还是工作流程都是繁杂的 ...

  2. 提高sqlmap爆破效率

     提高sqlmap爆破效率 sqlmap在注入成功后,会尝试获取数据库和表的结构.对于MSSQL.MySQL.SQLite之类数据库,sqlmap可以通过系统数据库.系统数据表获取数据库和表的结构.但 ...

  3. [Codeforces-div.1 167B] Wizards and Huge Prize

    [Codeforces-div.1 167B] Wizards and Huge Prize 试题分析 注意到每个物品互相独立,互不干扰之后就非常好做了. 算出一个物品最后的价值期望,然后乘以K即可. ...

  4. 【二分】Subsequence

    [POJ3061]Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15908   Accepted:  ...

  5. [UOJ181]密码锁

    这个完全图随机定向后是一个竞赛图,将它的强连通分量缩点后我们得到的东西类似一条链,每个点往它后面的所有点连边 在这条链上,我们可以把点划分为两个点集$S,T$使得没有从$T$中点到$S$中点的边($S ...

  6. [POI2008]Triangles

    题目大意: 平面直角坐标系上有n个点,问以这n个点为顶点的不同的三角形的面积和是多少? 思路: 很容易想到一个O(n^3)的暴力,枚举三个点,用海龙公式求一下面积和即可,这样做是40分. 标算的复杂度 ...

  7. IE主页被篡改为360导航终极处理办法

    不得不吐槽360真他妈是流氓至极,在不被用户许可的情况下直接修改用户浏览器默认主页,还不容易找到修改的地方. 以IE为例:我们将其首页设置为百度https://www.baidu.com/,终极处理办 ...

  8. [译]SQL数据库迁移:从低版到高版本

    我见过太多的数据库管理员花大量的时间在数据库迁移上,即便在客户的实际环境亦是如此.由于微软频繁的发布新版,基于业务和客户的要求,应用服务不得不同时升级.当然,还有许多用户仍在使用SQL Server ...

  9. Sysfs文件系统与Linux设备模型

    转:http://www.360doc.com/content/11/1218/16/1299815_173168170.shtml sysfs把连接在系统上的设备和总线组织成为一个分级的目录及文件, ...

  10. 花间美人:古风 CG插画技法

    <花间美人:古风 CG插画技法> 基本信息 作者: 猫君大白    出版社:机械工业出版社 ISBN:9787111429432 上架时间:2013-7-3 出版日期:2013 年7月 开 ...