Hibernate CRUD操作
版权声明:本文为博主原创文章,如需转载请标注转载地址
博客地址: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操作的更多相关文章
- 【Java EE 学习 44】【Hibernate学习第一天】【Hibernate对单表的CRUD操作】
一.Hibernate简介 1.hibernate是对jdbc的二次开发 2.jdbc没有缓存机制,但是hibernate有. 3.hibernate的有点和缺点 (1)优点:有缓存,而且是二级缓存: ...
- hibernate入门-基本配置及简单的crud操作
框架来说主要是需要写大量的配置文件,hibernate相比mybatis来说更强大,移植性更好: 1.类和数据库的映射配置:配置文件命名一般--类名.hbm.xml (user.hbm.xml),与实 ...
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...
- hibernate的CRUD操作
一对多关系映射的crud操作: 1.单项的保存操作 /** * 保存操作 * 正常的保存:创建一个联系人,需要关联客户 */ @Test public void test1(){ Session s= ...
- hibernate Session的CRUD操作
使用Session里面的方法进行CRUD操作 (1) 增加 save 方法 (2) 查找 get 方法(根据id查) (3) 修改 update 方法 (4) 删除 delete 方法 1.增加 /* ...
- Java实战之02Hibernate-01简介、常用接口、CRUD操作
一.Hibernate简介 1.Hibernate在开发中所处的位置 2.ORM映射 Object :面向对象领域的 Relational:关系数据库领域的 Mapping:映射 Object: Re ...
- JAVA实现DAO基本层CRUD操作
随着shh2各种操作方便框架.越来越多JAVA WEB效率,可是,假设在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成非常多不是必需的资源浪费. 在项 ...
- [读书笔记] 四、SpringBoot中使用JPA 进行快速CRUD操作
通过Spring提供的JPA Hibernate实现,进行快速CRUD操作的一个栗子~. 视图用到了SpringBoot推荐的thymeleaf来解析,数据库使用的Mysql,代码详细我会贴在下面文章 ...
- Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作
只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...
随机推荐
- cobol COMP-3最后1位
"C" hex is positive, "D" hex is negative, and "F" hex is unsigned.
- Python开发基础-Day16import模块导入和包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- HDU5742 It's All In The Mind 数学思维题
Problem Description Professor Zhang has a number sequence a1,a2,...,an. However, the sequence is not ...
- 【20181020T1】蛋糕
题面 [正解] 显然先按a排个序,然后用b乱搞 第一问用D开头的定理求最长下降子序列 第二问乱搞 for (int i=1;i<=n;i++) { int* t=upper_bound(f+1, ...
- 【Tarjan算法】【DFS】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem B. Point Pairs
这份代码可以作为找割边的模板.割边分割出来的部分是无向图的 边-双连通分量. 平面上2*n+1个点,在同一横坐标上的点之间可以任意两两匹配.同一纵坐标上的点之间也可以.问你对于所有的点i,输出i被移除 ...
- double型(双精度型)的打印(printf) 和scanf
double型,printf()用%f输出,而scanf用%lf来接受输入. 格式 printf scanf %c int char * %d, %i int int * %o, %u, %x u ...
- HDU 5636 Shortest Path 暴力
Shortest Path 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 Description There is a path graph ...
- Phpstorm-php在线手册配置
php在线手册配置 第一个是浏览器软件位置 第二个是php网站写法 第三个是工作路径 C:\Users\hasee\AppData\Local\Google\Chrome\Application\ch ...
- JS的scrollIntoView学习
scrollIntoView(alignWithTop) 滚动浏览器窗口或容器元素,以便在当前视窗的可见范围看见当前元素.如果alignWithTop为true,或者省略它,窗口会尽可能滚动到自身顶 ...
- synchronized和lock区别
synchronized 快速回顾: 1.当代码块 加上 synchrozized之后,代码会发生什么改变? 答案:有两条改变.一个是原子性(atomicity),一个是可见性(visibility) ...