创建工程可以是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;
}