这是本人在自学网站上自学HIbernate的一些小笔记。希望对学习这方面知识的人有所帮助。也是自己对自己学习知识,不断充实自己,提高自己的一种鞭策。 Hibernate基本类型:
Hibernate对象类型: 三、hibernate的关联映射 一对多(常用) 多对一(常用) 一对一 多对多
(1)一对多关系 Hibernate工具类,封装数据库的操作。新建一个sql文件,编写sql语句,创建两个表,这两个表中的关系是一对多关系。 Hibernate.cfg.xml的配置文件,配置基本信息。最后要在此配置mapping映射。<mapping resource=”完整的类路径,包名+类名” /> 1.构造持久化类,在一方的持久化类中设置多方的集合。 2.建立持久化类的hbm.xml文件。除了设置好基本信息外(PS注意class的name=“完整的类路径”),在一方的hbm.xml文件设置set标签。 <!-- 配置一对多关联映射关系 --> <set name="students" table="student"> <!-- 配置关联的外键列 --> <key column="cid"></key> <one-to-many class="entity.Student"/> </set> 3.编写测试类Test,注意的一点如下。 //如果希望学生表中的班级编号与班级关联起来,则需要在班级中添加学生。 c.getStudent().add(stu1); c.getStudent().add(stu2);
(2)多对一
1、在多方实体类添加一方的引用。 2、修改多方的hbm.xml文件。增加<many-to-one> <!-- 配置多对一关联关系 --> <many-to-one name="Grade" class="entity.Grade" column="cid"></many-to-one>
(3)双向多对一 1.分别在双方的持久化类中定义另一方的引用 Student类:(省略getter、setter方法) //在多方定义一个一方的引用 private Grade grade; Grade类: //在一方定义一个多方的集合 private Set<Student> students = new HashSet<Student>(); 2.在双方的hbm.xml文件中定义关联映射 Grade.hbm.xml: <!-- 配置一对多关联映射关系 --> <set name="students" table="student"> <!-- 配置关联的外键列 --> <key column="cid"></key> <one-to-many class="entity.Student"/> </set> Student.hbm.xml: <!-- 配置多对一关联关系 --> <many-to-one name="Grade" class="entity.Grade" column="cid"></many-to-one>
3.在测试类中设置关联关系 //设置关联关系 g.getStudent().add(stu1); //多对一的关联关系,为班级设置加入的学生对象 g.getStudent().add(stu2); stu1.setGrade(g);//将学生1加入g班级对象。即加入java一班。 stu2.setGrade(g);
PS:xml会多执行一次维护双方关系的sql语句,即班级再次设置学生的gid。这样会影响性能。提高性能的方法要用到inverse属性。
Inverse属性 <set>节点的inverse属性可以指定关联方向,默认由one维护。默认为false,由一方进行维护双方关联关系。设置为true,由多方进行关联关系的维护。
Cascade属性: 用于级联操作。
4.MyEclipse可视化数据库连接 MyEclipse首先要创建一个项目。然后在MyEclipse右上方找到标志,点击,出现如下界面,选择红色方框选项,代表是MyEclipse数据库视图化。
在左边空白处右键---new---出现如下配置界面
选择MySQL数据库,设置driver name:随意 Url:设置准确,否则连接不成功 添加MySQL JAR包。Driver classname:选择com.mysql.jdbc.Driver 点击Test Driver测试连接情况,出现下图表示连接成功。
最后finish后,左边出现一个数据库。双击可查看当前的所有数据库。 5.实现为项目添加hibernate的支持 选中工程,右键。如下图操作
6.使用MyEclipse反向工程生成映射关系 先创建一个com.xhl.entity。切换数据库可视化,找到student,grade两个表, 选中两个,鼠标右键
HQL数据查询 Hibernate Query Language Hibernate查询语言 HQL是面向对象的查询语言 查询主题是实体化类和属性,对这两者比较敏感。 HQL对关键字大小不区分。习惯上对HQL关键字小写。 HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。
(1)Query实例创建 Session的CreateQuery(hql)方法创建实例。 使用Query接口的list()执行HQL语句查询。 执行HQL语句查询返回一个数据结果类型为java.util.List,list对象存放符合查询条件的持久化对象。
HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象。使用HQL查询可按如下步骤进行:
(1)获取Hibernate Session对象,可以先写好一个Util工具类,里面封装好相应的方法。; (2)编写需要实现功能HQL语句; (3)调用Session的createQuery(HQL语句)方法创建查询对象; (4)如果HQL语句包含需要查询的参数(where age=?:这里?就是需要手动设置的查询条件),调用Query的setXxx方法为参数赋值。如:query.setInt(0,20)就是设置age为20; (5)调用Query对象的list等方法遍历查询结果。
(2)查询对象---from字句 l From字句的介绍 HQL语句的最简形式。SQL语句中需要select和from才能被解析,而HQL语句只要from字句就能被hibernate框架正常解析。From字句指定了HQL语句的主体----映射的持久化类及其属性。在只有from语句的情况下,默认Hibernate框架查询该持久化类的所有实例和该持久化类的映射配置所有属性信息。当hibernate框架把HQL语句解析成SQL语句后,就会查询该持久化类所有字段信息,并将查询结果封装,返回一个list集合。 l From字句在持久化类的引用 1.不需要引入持久化类的全限定名,直接引入类名。 2.Auto-import(自动引入)缺省情况。 l 如何使用别名 As 关键字设置别名,例如:from Seller as seller。 别名的命名习惯符合java变量命名习惯。 命名别名时,as关键字是可选的。如:from Seller s,但为了增加可读性,建议保留。 from后还可同时出现多个持久化类。 如:from Seller s,Customer c,此时将产生一个笛卡儿积或跨表的连接。 HQL语句其他部分通过别名引用该类。
(3)select字句 Ø Object Ø List集合 Ø Map集合 Ø 自定义类 .在持久化类定义对应的构造器,构造器参数就是要返回的属性信息。 所有查询方法代码如下: public class SelectTest {
private Session session;
@Before public void setUp() throws Exception { session = HibernateSessionFactory.getSession(); }
@After public void tearDown() throws Exception { HibernateSessionFactory.closeSession(); }
@Test public void testSelectObjectArray() { /* * 1,name 2,tel 3,address 4,star */ String hql ="select s.name,s.tel,s.address,s.star from Seller s";
Query query = session.createQuery(hql); //通过Object[]返回查询多个结果,注意当只查询一个属性时,集合内为Object,不是Object[] List<Object[]> objs = query.list();
for(Object[] o:objs){ System.out.println("name:"+o[0]); System.out.println("tel:"+o[1]); System.out.println("address:"+o[2]); System.out.println("star:"+o[3]); }
}
@Test public void testSelectClauseList() { /* * 1,name 2,tel 3,address 4,star */ String hql ="select new list(s.name,s.tel,s.address,s.star) from Seller s";
Query query = session.createQuery(hql); //通过List返回查询多个结果 List<List> lists = query.list();
for(List l:lists){ System.out.println("name:"+l.get(0)); System.out.println("tel:"+l.get(1)); System.out.println("address:"+l.get(2)); System.out.println("star:"+l.get(3)); } }
@Test public void testSelectClauseMap(){ String hql = "select new map(s.name,s.tel,s.address,s.star) from Seller s"; Query query = session.createQuery(hql); //通过Map返回查询结果 List<Map> maplist = query.list();
for(Map m:maplist){ System.out.println("name:"+m.get("0")); System.out.println("tel:"+m.get("1")); System.out.println("address:"+m.get("2")); System.out.println("star:"+m.get("3"));
} }
@Test public void testSelectClauseSelf(){ String hql = "select new Seller(s.name,s.tel,s.address) from Seller s"; Query query = session.createQuery(hql); //通过自定义类返回查询结果 List<Seller> listself = query.list(); for(Seller s:listself){ System.out.println("name:"+s.getName()); System.out.println("tel:"+s.getTel()); System.out.println("address:"+s.getAddress());
} } }
Ø Distinct关键字去除查询结果中的重复元素 @Test public void testSelectClauseDistinct(){ //通过distinct关键字去掉重复的元素 String hql = "select distinct c.sex from Customer as c"; Query query = session.createQuery(hql);
//通过自定义类返回查询结果 List<Object> list = query.list(); for(Object o:list){ System.out.println("sex:"+o); } }
(4)限制--where字句 1.比较运算 2.范围运算 3.字符串模式匹配 4.逻辑运算 5.集合运算 6.在HQL中使用+、-、*、/运算符 7.查询单个对象(uniqueResult方法)
u 比较运算符 HQL--->SQL HQL中的x=null会被解析为SQL中的x is null、x<>null会被解析为SQL中的x is not null。 u 范围运算 (not)in(值1,值2) (not)between 值1 and 值2 u 字符串模式匹配 1.like关键字 2.通配符 %:任意个字符 _:一个字符 u 逻辑运算 and与,or或,not非 u 集合运算 Is (not) empty 集合(不)为空。不包含任何元素 Member of 元素属于集合 u 四则运算 +、-、*、/运算符 u 查询单个对象 1.Query接口的uniqueResult方法 2.Where字句的设置,设置恰当的条件,保证查询的结果只有一个或者没有。否则会抛出异常。 (5)Order By字句 asc:升序 Desc:降序 @Test public void testOrderBy() { String hql = "from Commodity order by price desc"; Query query = session.createQuery(hql); List<Commodity> listcom = query.list(); for(Commodity o:listcom){ System.out.println("name:"+o.getName()); System.out.println("age:"+o.getPrice()); } }
复杂的order by字句 @Test public void testOrderBy() { //首先进行seller‘id进行升序,若遇到ID相同的,则按价格降序排序,若id,价格都相同,那么按名称升序排序。 String hql = "from Commodity order by seller.id asc, price desc,name asc"; Query query = session.createQuery(hql); List<Commodity> listcom = query.list(); for(Commodity o:listcom){ System.out.println("seller'id:"+o.getSeller().getId()); System.out.println("price:"+o.getPrice()); System.out.println("name:"+o.getName()); } }
|
|
来自: 昵称45782478 > 《编程》