hibernate之三:浅谈HQL和映射文件

前言

当我们想要精确的查找某一个数据库中的信息时,最理想的方法就是通过sql语句查询,一般hibernate中可以通过query接口来写语句进行查询,这个语句可以使sql,hql,当然推荐的是hql,事实上我认为hql和sql基本差不多

一:Query接口
Query接口类型的对象可以对数据库操作,它可以使用Hql和原生SQL(native Sql)对数据库操作.官方推荐使用Hql语句
先来看一个例子

测试代码:

1
2
3
4
@Test
public void selectone(){
User u=(User)session.createQuery(" from User where id=1").uniqueResult();
System.out.println(u.getName());}

分析:这里用了uniqueResult()方法 ,如果我们检索一个对象,明确知道最多只有一个对象,则建议使用该方法:

如果是取出集合对象,则使用如下方法:
测试代码:

1
2
3
4
5
6
@Test
public void selectone(){
List<User> list=session.createQuery("from User").list();
for(User user : list){
System.out.println(user.getName());
}

由此我们可以发现,使用list可以取出集合对象,同时方法里面写想要的hql语句

二:HQL简单语法
HQL是面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的;HQL中查的是对象而不是表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:

Query q = session.createQuery(hql);

1:between.. and..
测试代码:

List list=session.createQuery(“from User where id between 0 and 2”).list();

2:in /not in

List list=session.createQuery(“from User where id in (1,2)”).list();

其他如group by,having,聚集函数等都类似于sql语句,换汤不换药。

参数绑定:
先看例子:

1
2
3
4
5
6
7
org.hibernate.Query query= session.createQuery("from User where id between ? and ?");
query.setInteger(0, 1);
query.setInteger(1,2);
List<User> list=query.list();
for(User user : list){
System.out.println(user.getName());
}

主要通过set与?的形式来注入参数,注意这里第一个?对应set的序号为0
使用绑定参数的好处:
1.可读性好.
2.性能提高.
3.防止sql注入

HQL语句远不止这些,这里只简单介绍了其中一些,

三:映射文件的配置
映射文件的内容繁多,这里只简单介绍其中一些常见属性。大体说来,映射文件主要对class的映射,还包括属性,属性又分为主键,普通属性和集合属性,甚至还有复合属性,每种属性都需要进行不同的配置。

先从入门程序中的例子说起:

其中:package : 表示该类在哪个包下,name : 表示类名 table 表示 该类和哪个表映射
同时在class内部可以配置各种属性

主键:
主键就是持久化类中标识属性,用于唯一标识该对象,主要通过进行设置,有三个常用属性:name,column,type。
Name :表示类的哪个属性是主键 必须指定
Column:指定在数据库中主键对应的列明 不必须指定
Type:与数据库中对应字段类型一致 不必须指定
例外:主键需指定主键生产策略,即generator,一般用于自增长,针对不同数据库,关键词不一样,由于是mysql,所以自增长选择increment
以上的代码表示:

1
2
3
4
<id name="id" type="java.lang.Integer">
<generator class="increment">
</generator>
</id>

普通属性:
使用标签,该标签必须指定name属性,用于标记持久化类的属性名称。一般有如下常见属性:
Type,column,not-null(是否允许为空),lazy(是否支持延迟加载,默认为false不支持),
代码如下:

1
2
3
4
5
6
<property name="name" type="java.lang.String">
<column name="name" not-null="false"/>
</property>
<property name="age" type="java.lang.Integer">
<column name="age" not-null="false"/>
</property>

热评文章