开发hibernate步骤

创建工程可以是java也可以是web

1、引入jar文件

2、设计表同时开发和表的字段名一致的javabean(持久化类)

3、创建对象-关系映射文件:映射文件的扩展名为 .hbm.xml 这里Login.hbm.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="com.hw.entity.Student" table="tab_student">

<id name="id" type="integer" column="id"><!-- 如果列名和name名一致可以省去 -->

时间类型 把 java.util.Date 改成 java.sql.Date

<generator class="native"></generator><!-- 主键自增 --></id>

<property name="name" type="string"></property>

<property name="score" type="float"></property>

</class></hibernate-mapping>

4、创建 Hibernate 配置文件(hibernate.cfg.xml)

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                -->

<hibernate-configuration>

<session-factory>

<!-- hibernate 的mysql方言 -->

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="connection.url">jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=utf8</property>

<property name="connection.username">root</property>

<property name="connection.password">root</property>

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- hibernate自动生成表 -->

<property name="hibernate.hbm2ddl.auto">update</property>

<!-- hibernate显示sql -->(运行底下会显示语句,可以删)

<property name="show_sql">true</property>

<!-- hibernate 格式化sql-->(运行底下会显示语句,可以删)

<property name="format_sql">true</property>

<!-- hibernate映射文件 -->(点source的另一个 add加进去)

<mapping resource="com/hw/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

5、加载xml文件,创建sessionFactory

public class HibernateUtil {

public static Session getSession() {//获取当前session

return new Configuration().configure().buildSessionFactory().openSession()

}

}

6、开发crud

private Session session=null;

public void add(Person per){//添加

session=HibernateUtil.getSession();

Transaction beginTransaction = session.beginTransaction();//开启事务

session.save(per);//添加

beginTransaction.commit();//事务提交

session.close();

}

public void update(Person per){//修改

session=HibernateUtil.getSession();

Transaction beginTransaction = session.beginTransaction();//开启事务

session.update(per);//修改

beginTransaction.commit();//事务提交

session.close();

}

//saveOrUpdate 添加或修改,有id且存在为修改或则为添加

public void del(Person per){//删除

session=HibernateUtil.getSession();

Transaction beginTransaction = session.beginTransaction();//开启事务

session.delete(session.get(Dept.class,id));//删除对象

beginTransaction.commit();//事务提交

session.close();

}

查询

1get和load可查询单个对象,两者区就是为查询不到时返回结果不同,get是null

load是not found

get方法

session=HibernateUtil.getSession();

// Transaction beginTransaction = session.beginTransaction();//开启事务

Person per = (Person) session.get(Person.class, id);//get获取单个对象

System.out.println(per.getId()+" "+per.getName()+" "+per.getMoney());

// beginTransaction.commit();//事务提交

session.close();  //注:查询可以不加事务

一、get方法查询单个对象,有就输出结果,没有则报空指针

案例:

public Person findByid(int id){//查询单个对象,可以不用事务

session=HibernateUtil.getSession();

Person per = (Person) session.get(Person.class, id);//get获取单个对象

session.close();

return per;

}

load方法

session=HibernateUtil.getSession();

// Transaction beginTransaction = session.beginTransaction();//开启事务

Person per = (Person) session.load(Person.class, id);//get获取单个对象

System.out.println(per.getId()+" "+per.getName()+" "+per.getMoney());

// beginTransaction.commit();//事务提交

session.close();  //注:查询可以不加事务

一、load方法查询单个对象,有就输出结果,没有则报找不到对象

http://www.iteye.com/topic/67686

(hibernate中get方法和load方法的根本区别

如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

前面已经讲了,get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。)1

1.get()采用立即加载方式,而load()采用延迟加载;

get()方法执行的时候,会立即向数据库发出查询语句,

而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句

2.如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException

hibernate的get/load的根本区别分为4点:第一点是:load会抛出异常,get会返回空,一般采用的load方法。第二点是:get只返回实体对象实例。而load返回的是代理类实体对象实例。第三点是:get方法只能使用一级缓存。而load可以使用一级和二级缓存。第四点是:都是通过id得到单个对象的方法。

2list方法可以返回多个(hql)

public List<Dept>list() {//查询和原来jdbc有区别

Query createQuery = session.createQuery("from Dept");//from 后接类名

List<Dept>list = createQuery.list();

return list;

}

public List<Dept>listPage(int currentPage, int pageSize) {

//selecct* from dept limit ?,?

//hql中不支持limit分页,只能使用如下设置

Query createQuery = session.createQuery("from Dept");//from 后接类名

/*hibernate分页错误写法

* createQuery.setInteger(0,(currentPage-1)*pageSize);

createQuery.setInteger(1,pageSize);*/

//相当于limit的第1个问号

createQuery.setFirstResult((currentPage-1)*pageSize);

//相当于limit的第2个问号

createQuery.setMaxResults(pageSize);

List<Dept>list = createQuery.list();

return list;

}

public List<Dept>listLike(String name) {

//from Dept  相当于sql语句的 select * from Dept

Query createQuery = session.createQuery("from Dept where dname like ?");

//from 后接类名

createQuery.setString(0, '%'+name+'%');

//hibernate是从0开始,jdbc是从1开始

List<Dept>list = createQuery.list();

return list;

}

public int getCount() {//统计数量

Query createQuery = session.createQuery("from Dept");//from 后接类名

List<Dept>list = createQuery.list();

return list.size();

}

Query query = session.createQuery("select count(*) from "

+ clazz.getSimpleName());

count = (Long) query.uniqueResult();

session.close();

hql的update(不用)

public void updateStudent2(Student stu) {

Session session = HibernateUtils.getSession();

// 4创建数据库事务(要么同时功要么同时失败):开发中除了查询外都要用事务

Transaction beginTransaction = session.beginTransaction();

String hql="update Student set name=?,score=? where id=?";

// String hql="insert into Student values(null,?,?)"; //hib不支持insert

Query createQuery = session.createQuery(hql);

createQuery.setString(0, stu.getName());

createQuery.setFloat(1, stu.getScore());

createQuery.setInteger(2, stu.getId());

createQuery.executeUpdate();//执行修改或删除

beginTransaction.commit();

// 7关闭Session

session.close();

}

hql的delete(不用)

public void delStudent2(int id) {

Session session = HibernateUtils.getSession();

// 4创建数据库事务(要么同时功要么同时失败):开发中除了查询外都要用事务

Transaction beginTransaction = session.beginTransaction();

String hql="delete from Student  where id=?";

Query createQuery = session.createQuery(hql);

createQuery.setInteger(0,id);

createQuery.executeUpdate();//执行修改或删除

beginTransaction.commit();

// 7关闭Session

session.close();

}

createSQLQuery:用于复杂sql语句查询

public ListlistLikeStudentPage2(String name, int currentPage,int pageSize) {Session session = HibernateUtils.getSession();String sql="select * from tab_student where name like ? limit ?,?";//createSQLQuery:用于复杂sql语句查询SQLQuery query = session.createSQLQuery(sql);query.setString(0, '%'+name+'%');query.setInteger(1, (currentPage-1)*pageSize);query.setInteger(2, pageSize);query.addEntity(Student.class);//一定要添加实体类Listlist = query.list();

return list;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容