分类: Java
2013-04-14 19:11:03
1,手动实现hibernate并模仿spring集成的hibernate
(1).java中使用hibernate
先拷贝jar包:
(a)lib同目录下的hibernate3.jar:1个
(b)lib里面的required文件夹所有jar包:6个
(c)lib下面jpa中的jar包:1个
(d)mysql的jar包:1个
(2),etc文件夹下拷贝hibernate.cfg.xml到src目录下
修改配置文件,下面的配置文件的键值对在etc中的hibernate.properties中
添加:加载驱动等四个,方言,show_sql,format_sql,hbm2ddl.auto
(3),写POJO实体类,添加get,set方法
POJO类要求:(1)要有默认构造,因为new Instance的需要(2)最好有主键id(3)不能是final的,因为会对懒加载有影响
写映射文件类名 .hbm.xml到hibernate-core文件夹里面的test中找jms文件夹下有
然后修改属性
(4),写HibernateUtil类
//下面设置进入后会用这个变量得到Session
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
private HibernateUtil(){}
//初始化加载并得到sessionFactory
static{
Configuration cfg=new Configuration().configure();
sessionFactory=cfg.buildSessionFactory();
}
//得到session
public Session getSession(){
return sessionFactory.openSession();
}
(5),写一般常用的增删改查的封装类HibernateTemplate
public void save(Object obj) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
public void delete(Object obj) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
public void update(Object obj) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.update(obj);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
public List find(String hql,Object[] obj){
Session session=HibernateUtil.getSession();
Query query=session.createQuery(hql);
for (int i = 0; i < obj.length; i++) {
query.setParameter(i,obj[i]);
}
List list=query.list();
return list;
}
public Object get(Class clazz,int id){
Session session=HibernateUtil.getSession();
return session.get(clazz, id);
}
注意:(1)property主元素主要包含四个属性:name(JavaBean中属性名字),type(对应的数据类型),
column(对应数据库中的字段名)和not-null(数据库约束能否为空,true代表不能为空,默认false)
(2)通过Hibernate API编写访问数据库的代码
Hibernate的API中包含了五个主要接口
(a)Configuration接口:用于配置并且启动Hibernate。
(b)SessionFactory接口:一个SessionFactory实例对应一个数据存储源。从SessionFactory中获得Session
(c)Session接口:持久化管理器,提供了和持久化相关的操作,如保存,更新,删除和加载对象
(d)Transaction接口:Hibernate的数据库事务接口,对底层的事务接口做了封装,底层接口包括JDBC事务和JTA事务
(e)Query接口:Hibernate的查询接口,向数据库查询对象以及控制查询过程,Query实例包装了一个HQL查询语句
2,hibernate中常用方法:save,update,delete,get。query中常用的函数:uniqueResult(),list(),setFirstResult(0),setMaxResults(3);
save,persist在不开事物的时候,persist没有insert语句,save有但是没有显示的保存
delete,
update,脱管的记录更新时才调用这个方法
merge是更新或保存的意思,与saveOrUpdate一样,判断是瞬时还是脱管,根据判断id是否有值。调saveOrUpdate对象是持久的,调merge对象还是脱管的
get(User.class,id)和load:load不会立即访问数据库,在第一次访问的时候才访问数据库,牵涉到懒加载
HQL(Hibernate Query Language)查询语句:操作的全是对象
(1)一般的查询语句:
(a)查询某个表:String hql="select u from Users u";
(b)模糊查询某个表的字段:String hql="select u from Users u where u.userName like 'g%'";
(c)带条件的某范围查询:String hql="select u from Users u where u.scores>=80 and u.scores<=100";
(d)降序查询:String hql="select u from Users u where u.scores between 80 and 100 order by u.scores desc";
(e)值为1或2:String hql="select u from Users u where u.state in(1,2)";
均执行下面操作:
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
List
(2)带有占位符的查询:
(a)String hql="select u from Users u where u.userName=:uname and u.userPwd=:upass";
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
query.setString("uname", "jia");
query.setString("upass", "123");
List
(b)String hql="select u from Users u where u.userName=? and u.userPwd=?";
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
query.setString(0, "jia");
query.setString(1, "123");
List
(3)聚合函数的查询:count,max, min,avg,sum
//String hql="select count(u) from Users u";
//String hql="select max(u.scores) from Users u";
String hql="select avg(u.scores) from Users u";
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);//psmt.PreparedStatement(sql);
Object count = query.uniqueResult();//执行聚合函数获取返回值唯一语句(如果知道返回的只有一个结果时用这个函数)
//当hql是update或delete的时候可以用int rows=query.executeUpdate()方法,返回的是影响的对象数
System.out.println(count);
(4)分页查询:
//String hql="select u from Users u ";//select * from users limit 0,5
String hql="select u from Users u order by u.scores desc";//select * from users order by scores desc limit 0,5
Session session = HibernateSessionFactory.getSession(); //
Query query = session.createQuery(hql);//psmt.PreparedStatement(sql);
//query.setFirstResult(5); //设置起始位置:起始位置=(当前页-1)*分页单位
//query.setMaxResults(5);//设置分页单位
query.setFirstResult(0);
query.setMaxResults(3);
List
(4)多表联合查询:如果存在层级关系必须按层级顺序进行查询,不能越级查询,即使含有那个字段
//查询学生姓名为sss5所发表的评论
//select c.* from commentinfos c,studentinfos s,users u where s.userId=u.userId
and u.userId=c.userId and s.studentName='sss5'
String hql="select c from Commentinfos c,Studentinfos s,Users u where s.users.userId=u.userId
and u.userId = c.users.userId and s.studentName='sss5'";
Query query = session.createQuery(hql);
List
3,hibernate对象的三个状态:
瞬时状态:(Transient Object(new对象时))不在session管辖范围内,数据库中没有相应的记录(new 对象)
持久态:(Persist Object)在session中存在该对象,受session管理,数据库中有记录
离线状态:又叫游离态(Detached Object)session关闭或清空导致对象脱离了session管辖,数据库中有相应的记录
在持久态的对象如果发生变化,数据库会自动变化因为hibernate能检测到,要是有多个set,会更新一次,相同属性都是更新最后一次
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.save(u);
u.setDate("111");
u.setDate("222");
u.setName("lisi");
u.setName("wangwu");
tx.commit();
只有wangwu被自动更新进入数据库