javaEE之------Hibernate学习笔记

页面导航:首页 > 软件编程 > Java编程 > javaEE之------Hibernate学习笔记

javaEE之------Hibernate学习笔记

来源: 作者: 时间:2016-01-18 15:52 【

Hibernate框架需要配置hibernate cfg xml文件(里面设置的是连接数据库和映射对象)还需要对象:如 Custom hbm xml 通过hibernate里面进行配(里面是 数据库中的数据字段
Hibernate框架需要配置
hibernate.cfg.xml文件(里面设置的是连接和映射值对象)

还需要值对象:
如 Custom.hbm.xml 通过hibernate里面进行配值(里面是 数据库中的数据字段大小,是都是id等) 里面的字段必须要要和值对象中一致值对象和改xml文件存放在一起。
基本上里面的一些配置文件都是拷贝的。
单表:


  SessionFactory sessionfactory=config.buildSessionFactory();
	
		/*通过会话工厂类产生一个会话实例*/
	
	Session session=sessionfactory.openSession();


	/*通过会话产生一个查询对象Query*/
	
	Query query=session.createQuery("from bean.Customer");
	
		/*进行查询返回一个集合List*/
	
		List cuslist=query.list();

	Session session=HibernateSessionFactory.getSession();


	/*定义事务开始*/


	Transaction tran=session.beginTransaction();


	Dept dept=new Dept(new Long(1001),"math","shanghai");
	
session.save(dept);


	/*提交事务,真正保存到数据库中*/


	tran.commit(); 
删除
 Session session=HibernateSessionFactory.getSession();
	  
	 /*首先查找待删除记录 通过ID*/
	    
   	 Dept dept=(Dept)session.get(Dept.class,new Long(10));
	   
	 Transaction tran=session.beginTransaction();
	  
	  session.delete(dept);
	
	    tran.commit();
	}

修改
Session session=   HibernateSessionFactory.getSession();
	
  	 Transaction tran=session.beginTransaction();
	    
		/*首先查找待修改记录 通过ID*/
	   
	 Dept dept=
  (Dept)session.get(Dept.class,new Long(10));


	    dept.setDname("math");
	
	   session.saveOrUpdate(dept);
	
	   tran.commit();
数据中 主键的自动增加:
值对象的配置中generator的使用 。
 
            
            
        
有一下几种方式:
assigned  :自己设置,手动,主键由外部程序负责生成,无需Hibernate参与。
identity :自动生成,用户不用管理,自动增长列,则增加一条记录时主键的值可以不赋值。用数据		库提供的主键生成机制。

increment: 主键按数值顺序递增 有的数据不支持,由hibernate生成,多线程会出现问题
sequence:  采用数据库提供的sequence 机制生成主键,给定序列 1  --3---5---7--。。。。
native:由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成	方式。
	
uuid.hex:由Hibernate为ID列赋值,可以不用指定。
Hibernate 查询语句:
Session session=HibernateSessionFactory.getSession();

	Query query=session.createQuery("from Customer");
	//相当于 limit 10 ,10  下标从10开始,往后10个,  分页技术中就是这样的。
	
query.setFirstResult(10); //设置查询记录开始位置,索引从0开始。
	query.setMaxResults(10);//设置查询返回的最大记录个数。
	
List list=query.list();

条件查询:
一 ,部分查询:
Session session=HibernateSessionFactory.getSession();


	Query query=session.createQuery("from Customer cus where cus.name='zhou'");
//查询		name是zhou的名

二:单一属性查询

session = HibernateSessionFactory.getSession();

List cnames = session.createQuery("select cname from Customer").list();
//java中的变量名。
for (int i=0;i< cnames.size();i++) {

String name = (String)cnames.get(i);

System.out.println(name);
}

三:多个属性的查询,使用对象数组
session = HibernateSessionFactory.getSession();
//查询多个属性,其集合元素是对象数组

//数组元素的类型,跟实体类的属性的类型相关

List students = session.createQuery("select sno, sname from Students").list();
for (int i=0;i< students.size();i++) {
Object[] obj = (Object[])students.get(i);

System.out.println(obj[0] + ", " + obj[1]);

}


四:可以封装成一个list,多个属性的查询,使用List集合装部分列

Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(
"select new list(cus.name,cus.phone) from Customer cus"//这里封装一个集合
);

List list = query.list();
for (int i = 0; i < list.size(); i++) {
List temp=(List)list.get(i);
System.out.println(temp.get(0));
//0是索引
}

五:使用Map集合装部分列
Session session = HibernateSessionFactory.getSession();

Query query = session.createQuery(
"select new map(cus.name,cus.phone) from Customer cus"
);

List list = query.list();
for (int i = 0; i < list.size(); i++) {
Map temp=(Map)list.get(i);
System.out.println(temp.get("1"));
//"1"是key
}

六,内连接查询
Query query=session.createQuery("select c.name, s.name from Student s join s.classes c ").list();
for (Iterator iter = students.iterator();iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + ", " + obj[1]);

}

七:外链接:
这是写到Query query=session.createQuery(内容);
select c.name, s.name from Classes c left join c.students s
select c.name, s.name from Classes c right join c.students s

八:带参数的查询
?作为参数
如" from Customer cus where cus.name=?";
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery("from Customer cus where cus.name=?");
query.setParameter(0, "zhou");
//设置参数,从0开始。
List list = query.list();

参数名称:name
如" from Customer cus where cus.name=:name";
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery("from Customer cus where cus.name=:name ");
query.setParameter("name", "zhou");
//设置参数,就不用写数字了,直接可以设置名字
List list = query.list();
条件查询,使用 ?的方式传递参数
Query query = session.createQuery("SELECT s.id, s.name FROM Student s WHERE s.name LIKE ?");

query.setParameter(0, “%周%”); //传递参数参数的索引是从0开始的。
如条件查询,使用":参数"名称的方式传递参数

Query query = session.createQuery("SELECT s.id, s.name FROM Student s WHERE s.name LIKE :myname");
query.setParameter("myname", "张三");
//传递参数
因为setParameter方法返回Query接口,
所以可用省略方式来查询
List students = session.createQuery("SELECT s.id, s.name FROM Student s WHERE s.name LIKE :myname and s.id = :myid")
setParameter("myname", "%周%").setParameter("myid", 15).list();

嵌入原生sql测试

SQLQuery sqlQuery = session.createSQLQuery("select * from t_student");

List students = sqlQuery.list();
for (Iterator iter = students.iterator();iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + ", " + obj[1]);
}

多表操作:
比如 学生和院系
多 对 一

配置 学生 .xml

这就是多 对 一 的关系


对于部门端:
Dept.hbm.xml

上面是测试的:
我们在部门中,我们添加了一个set集合,名字为students,我们这里可以直接获得
Session s=HibernateSessionFactory.getSession();
Query q=s.createQuery("from Dept");
List l=q.list();
for(int i=0;i Dept dept=(Dept)l.get(i);
System.out.println(dept.getDeptid());
Set stu= dept.getStudents();//通过院系实例可以查询该院学生
Iterator it=stu.iterator();
while(it.hasNext()){
Student st=(Student)it.next();
System.out.print(st.getSno()+" ");
}
}

级联:
表 多对多
学生类映射文件
......<many-to-many class="Teacher”
column=" teacher_id"="">


教师类映射文件
......

column="student_id"/>


注意:把多对多关联分解为两个一对多关联,具有更好的可扩展性和操作性
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<