开发hibernate步骤

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

1、引入jar文件

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

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

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

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

org.hibernate.dialect.MySQLDialect

jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=utf8

root

root

com.mysql.jdbc.Driver

update

(运行底下会显示语句,可以删)

true

(运行底下会显示语句,可以删)

true

(点source的另一个 add加进去)

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 Listlist() {//查询和原来jdbc有区别

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

Listlist = createQuery.list();

return list;

}

public ListlistPage(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);

Listlist = createQuery.list();

return list;

}

public ListlistLike(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开始

Listlist = createQuery.list();

return list;

}

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

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

Listlist = 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;

}

你可能感兴趣的:(开发hibernate步骤)