hibernate中的sql语句写在xxx.hbm.xml中解决hibernate中原生sql的硬编码问题

Hibernate 专栏收录该内容
6 篇文章 0 订阅

hibernate中的sql语句写在xxx.hbm.xml中解决hibernate中原生sql的硬编码问题

在hibernate的查询中,hibernate为我们提供了三种查询方式,hql查询、QBC查询以及原生sql查询,但是当我们在操作多张表查询的时候,我们通常会选择原生的sql查询来编写复杂的sql语句,但是如果我们直接把复杂的sql语句写在dao中,就会有硬编码的问题,当我们的需求发生变化的时候,我们就需要去修改源代码,这样其实对后期的维护是不好的。所以我们如果把原生的sql语句写在xml中,再引用到dao中,就可以解决这个硬编码的问题了,修改需求是,只需修改xml配置文件中的内容。并且可以解决sql代码的重复。其实我感觉它的主要的思想与mybaits中的思想是类似的。
下面我写了一个小例子:
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.haha.domain.Customer" table="cst_customer">
	
		<id name="cust_id">
			<generator class="native"></generator>
		</id>
		<property name="cust_name"/>
		<property name="cust_source"/>
		<property name="cust_industry"/>
		<property name="cust_level"/>
		<property name="cust_phone"/>
		<property name="cust_mobile"/>
		<!-- 一方的配置,配置多方  name参考实体类中的属性字段     column参考数据库表中的字段 -->
		<set name="linkmans" cascade="save-update,delete" inverse="true">
		<!--  column参考数据库表中的字段  cid为外键的名称  -->
			<key column="cid"/>
			<!--class为多的那一方的全路径  -->
			<one-to-many class="com.haha.domain.Linkman"/>
		</set>
	</class>
	<!-- 
		原生sql的sql语句,其中一定要加返回值类型,不然返回的是object数据,不能转化成你想要的类型
	 -->
	<sql-query name="queryCustomer">
		<return  class="com.haha.domain.Customer"/>
		<![CDATA[
			select * from cst_customer
		]]>
	</sql-query>
	<!-- 
		hql语句查询,可以不加返回值。
	 -->
	<query name="hqlQuery">
		from Customer where cust_id=:cust_id
	</query>
</hibernate-mapping>
注意:
第一种原生的sql语句编写中,一定要加返回值类型,如果返回的是由几张表组成的数据,可以再写一个pojo类,注意起别名与pojo类中的属性名相同。
测试:
/*
	 * 测试原生sql
	 */
	@Test
	public void run4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		 Query query = session.getNamedQuery("queryCustomer");
		List<Customer> list = query.list();
		System.out.println(list.get(0).getCust_name());
		tx.commit();
	}
	/*
	 * 测试hql查询
	 */
	@Test
	public void run5(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		 Query query = session.getNamedQuery("hqlQuery");
		 query.setLong("cust_id", 3L);//设置条件
		List<Customer> list = query.list();
		System.out.println(list.get(0).getCust_name());
		tx.commit();
	}




  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值