Hibernate——Native SQL Queries

Native SQL Queries

本地SQL检索

本地SQL查询是直接使用数据库SQL语言进行查询。
在JDBC的SQL查询中,必须面对繁琐的ResultSet操作,而Hibernate的SQL查询接口对查询结果进行了妥善的封装,返回的结果是映射过的实体对象,从ResultSet中取出数据并组装成对象的过程由Hibernate透明地完成。

//1.基本的SQL查询,查询所有属性
public void testQueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			NativeQuery nq = session.createNativeQuery("select * from T_USER u where u.age > 40",User.class);
			List users = nq.getResultList();
			
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

User.hbm.xml

<sql-query name="QueryUsers">
		<![CDATA[
			select * from T_USER u
		]]>
		<return alias="u" class="cn.hrbust.pojo.User"/>
</sql-query>
//2.基本的SQL查询,通过标签进行查询
	public void testQueryUserByTag() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			Query sqlQuery = session.getNamedQuery("QueryUsers");
			List users = sqlQuery.getResultList();
			
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

自定义insert、update、delete

Hibernate 3的映射文件中新增了、与三个卷标,您可以在这三个卷标中使用SQL自定义你的INSERT、UPDATE、DELETE,也就是储存、更新、删除资料时的行为

<class name="User" table="table_User" dynamic-update="true">
<id name="id" column="userid">
<generator class=“assigned”/> <!—如果是native的话,就不用插入userid>
</id>
<property name="name" column="username"/>
<property name="password"/>
<property name="age"/>
<property name="birthday"/>
<sql-insert>       
 INSERT INTO table_user (username,password,age,birthday,userid) VALUES (?,?,?,?,?)              
</sql-insert>     
<sql-update>       
 UPDATE table_user SET username=?,password=?,age=?,birthday=? WHERE userid=?              
</sql-update>      
<sql-delete>       
 DELETE FROM table_user WHERE userid=?              
</sql-delete>    
</class>

在这里插入图片描述

//保存瞬时用户对象
	public void testSaveUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		//创建user
		User u = new User();
		u.setName("李四");
		u.setGender("女");
		u.setAge(18);
		u.setBirthday(Date.valueOf("2001-1-1"));
		//u:瞬时对象,没有对象id,没有纳入session管理,他的任何变化不会自动地发送SQL语句
		u.setName("赵六");
		try {
//				//创建Configuration对象
//				cfg = new Configuration().configure();
//				//创建Session工厂
//				sf = cfg.buildSessionFactory();
			//使用单例模式创建Configuration对象和Session工厂
			sf = HibernateUtil.getSessionFactory();
			//创建Session
			//session = sf.openSession();
			//保证每个读写线程有唯一的session实例
			session = sf.getCurrentSession();
			//创建事务
			ts = session.beginTransaction();
			//持久化操作:session保存对象
			session.save(u);
			//u:持久对象,有对象id,纳入session管理,他的任何变化会自动地发送SQL语句
			//姓名并没有发生改变,只执行一次insert
			u.setName("王五");//属性改变,持久化对象的属性变化会发送update语句
			//提交事务
			ts.commit();
			u.setName("zhaowu");//事务提交后,session关闭,属性改变,此时的对象的属性变化不会发送update语句
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
			//关闭session
			//session.close();
			//sf.close();
		}	
	}

在这里插入图片描述

总结

HQL功能最强大,适合各种情况,但是动态条件查询构造起来很不方便。
QBC最适合动态条件查询,不太适合统计查询,QBE还不够强大,只适合相当简单的查询。
NativeSQL课时实现特定数据库的SQL,但是可移植性不好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值