在Java的Hibernate框架中使用SQL语句的简单介绍
hibernate中有hql查询语法。但我们用得比较熟的还是数sql语句,那么应该怎么来让hibernate支持sql呢?这个不用我们去考虑了,hibernate团队已经早就做好了。
废话不说,直接来例子啦。
select * from t_user usr
上面是一条sql语句,又是废话,是个人都知道。我们想让hibernate执行这条语句,怎么办呢?看代码:
query query = session.createsqlquery("select * from t_user usr");
就这样,剩下来的,大家应该都知道了,平常的查询。
那查询完之后,返回的是什么东西呢?
while(iter.hasnext()){ object[] objs = (object[])iter.next(); for (int i = 0; i < objs.length; i++) { system.out.print(objs[i]); } system.out.println(); }
返回的每个结果都是object[]数组,
这时又有人跑出来说面向对象啦。对,就是面向对象,唉,没办法。
我们继续看:
select {usr.*} from t_user usr
看到这里,估计某些童鞋开始鸡动啦,那个大括号什么东西啦?
别急,慢慢来。我们先继续看代码。
query query = session.createsqlquery("select {usr.*} from t_user usr").addentity(tuser.class);
我们直接api,看到这样一串解释:
addentity sqlquery addentity(string tablealias, class entitytype) declare a "root" entity parameters: tablealias - the sql table alias entitytype - the java type of the entity to add as a root
有跟没一个样,杯具。只能自己动手用用。
第一个参数是指表的别名,就像上面的语句,我们表的别名是usr,所以第一个参数为usr,而第二个是指查询到的结果需要映射到哪个类,这里由于我们在映射文件中是通过tuser映射到t_user表,所以我们这里当然也就是tuser啦。然后一查,有sql语句出来,而且查到的结果是tuser类型的。
我们查到的结果是:
org.hibernate.tutorial.domain6.tuser@198cb3d
当然,你们的肯定跟我不一样的。不要鸡动。
也许我们并不需要全部进行查出,这时,我们需要的只是设定别名即可:
select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u
我们看到我们用了as指定了字段的别名,程序中还是一样:
query query = session.createsqlquery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addentity("usr",tuser.class);
以前我们讲到,有些团队会规定不给在代码中写sql语句,这又需要配置文件出马啦。
我们可以在配置文件中添加:
<sql-query name="querytuser"> <return alias="usr" entity-name="org.hibernate.tutorial.domain6.tuser" /> select {usr.*} from t_user usr where name=:name </sql-query>
注意,这里的entity-name需要写完整的包名,不然会报错的。这里我们有子标签return,它指定了表的别名和类名,这样我们在运行时就不需要再addentity了。
看代码:
query query = session.getnamedquery("querytuser"); query.setparameter("name","shun"); list list = query.list(); iterator iter = list.iterator();
我们直接这样就ok了,注意,我们并没有加addentity了,主要还是归功于配置文件中的配置。
注意,如果在配置文件中配置,一定要有return子标签指定表别名和类名。这个主要是避免了我们读取语句时的重复判断。
上面讲了这么久,我们一直在讲有别名的表,那么如果我们的表没有别名,但又想返回的结果封装在对象内,我们应该怎样呢?
select * from t_user usr
很简单,只要调用addentity的重载方法addentity(class clazz)就行了,只需要提供一个类名,而不需要表别名。
当然,hibernate也支持存储过程,只需要在配置文件中把sql-query的callable属性设为true即表示当前调用的是存储过程,由于存储过程我接触地不多,以后多研究一下再跟大家一起研究。
我们在调用session.save等相应的对数据操作的方法时,它会转换成hibernate内置的sql语句,但如果我们想自己控制sql语句的格式呢,怎么办?
hibernate实际上也想到了。
我们直接在映射文件中加入:
<sql-insert> insert into t_user (name,age) values (?,?) </sql-insert> <sql-update> update user set user_name=?,age=? where user_id=? </sql-update>
注意,这个需要添加在class标签内,作为子标签。我们这里全部是大写字母,是为了跟hibernate默认的语句分清,没有其他意思。
我们先来看一下insert的调用:
user user = new user(); user.setname("shun123123"); user.setage(23);
当我们调用保存时,hibernate的语句是:
hibernate:
insert into user(user_name,age) values(?,?)
它调用了我们配置的sql-insert标签内的语句
我们再来看一下update的调用:
user user = (user)session.get(user.class,new long(29)); user.setname("shun123123"); user.setage(23); session.save(user);
我们调用保存,它会自动调用更新,此时的语句是:
hibernate:
update user set user_name=?,age=? where user_id=?
delete语句也是同样的配置。
推荐阅读
-
在Java的Hibernate框架中使用SQL语句的简单介绍
-
详解Java的Hibernate框架中的缓存与原生SQL语句的使用
-
在Java的Hibernate框架中对数据库数据进行查询操作
-
简单说明Java的Struts框架中merge标签的使用方法
-
在Java的Struts框架中ONGL表达式的基础使用入门
-
ASP.NET中在一般处理程序中使用session的简单介绍
-
ASP.NET中在一般处理程序中使用session的简单介绍
-
ASP.NET中在一般处理程序中使用session的简单介绍
-
Oracle中SQL语句连接字符串的符号使用介绍
-
在Python的Django框架中simple-todo工具的简单使用