hibernate_02

一.使用HQL查询所有的User

1.获取session

String sql = "from com.lanou.3g"//这里填写全类名

Query<User> query = new createQuery(hql);

//***要预判结果集(多个用List处理,单个用uniqueResult处理)

List<User> list = query.list();

3.提交事务,关闭session

二.设置占位符的两种方式

查询语句:

String hql = "from User where id = ?";

Query<User> query = session.createQuery(hql,User.class);

query.setParameter(0,7);//前面是位置,后面是内容

//***要预判结果集(多个用List处理,单个用uniqueResult处理)

List<User> list = query.list();


方法二:

String hql = "from User where username = :username and password= :password;//注意!冒号后面千万不能加空格!

Query<User> query = session.createQuery(hql);

query.setParameter("username",wanglong);

query.setParameter("password","123");

List<User> list = query.list();


二:创建一对多的多表查询.

举例:一个客户(Customer)对应多个联系人(LinkMan)

分析如下:

1.分析表中关系

2.分析对象中的变量

3.配置实体类与表之间的关系

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">
<!-- 配置表与实体类的关系 name:实体类的全类名 table:表名 package:包名 填上后 下面写全类名时可以省略包名 -->
<hibernate-mapping package="com.lanou3g">
	<class name="Customer" table="cst_customer">
		<id name="cust_id" column="cust_id">
			<generator class="native"></generator>
		</id>
		<property name="cust_name" column="cust_name"></property>
		<property name="cust_source" column="cust_source"></property>
		<property name="cust_industry" column="cust_industry"></property>
		<property name="cust_level" column="cust_level"></property>
		<property name="cust_linkman" column="cust_linkman"></property>
		<property name="cust_phone" column="cust_phone"></property>
		<property name="cust_mobile" column="cust_mobile"></property>

		<!-- 配置一对多关系 
			name表示 实体类对象中的属性名
			column: 两张表联系的外键(在这里就是linkman中设置的外键)
			注意:两张表外键的名字必须填一致的
			class: 与哪张表进行的联系(一对多)	
		-->
		<!-- 
			级联操作
			作用:减化的代码量(量不大)
			cascade
			save-update 级联保存和更新
			delete  		级联删除
			all			save-update + delete
			建议:要写最多写到save-update
		 -->
		 <!-- 
		 	inverse(反转) 
		 	默认值是 false 不放弃维护主键
		 	作用:提高效率的
		 	linkman 能不能放弃维护外键?
		 	一对多的表关系
		 	如果要放弃维护外键关系这能是一的一方
		  -->
		<set name="linkmans" cascade="save-update" inverse="true">
			<key column="lkm_cust_id"></key>
			<one-to-many class="Linkman"/>
		</set>
	</class>


</hibernate-mapping>

linkman.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 package="com.lanou3g">
    	<class name="Linkman" table="cst_linkman">
    		<id name="lkm_id" column="lkm_id">
    			<generator class="native"></generator>
    		</id>
    		<property name="lkm_name" column="lkm_name"></property>
 
    		<property name="lkm_gender" column="lkm_gender"></property>
    		<property name="lkm_phone" column="lkm_phone"></property>
    		<property name="lkm_mobile" column="lkm_mobile"></property>
    		<property name="lkm_email" column="lkm_email"></property>
    		<property name="lkm_qq" column="lkm_qq"></property>
    		<property name="lkm_position" column="lkm_position"></property>
    		<property name="lkm_memo" column="lkm_memo"></property>
    		
    			<!-- 配置多对一的关系
    				name 表示多对一对象的属性名
    				class 表示多对一对象的类
    				column 表示外键
    				注意:上面在配置property时 不要重复配置外键
    			 -->
    	<many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>
    		
    	</class>
    	
    
    
    </hibernate-mapping>
package com.lanou3g;

import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

public class Demo02 {
	@Test
	public void fun1() {
		Session session = HibernateUtil.getOpenSession();
		Transaction transaction = session.beginTransaction();
		
		//创建一个客户
		Customer customer = new Customer();
		customer.setCust_name("董大海");
		//创建两个联系人
		Linkman l1 = new Linkman();
		l1.setLkm_name("威姐");
		Linkman l2 = new Linkman();
		l2.setLkm_name("欣姐");
		//相互表示客户和联系人的关系
		customer.getLinkmans().add(l1);
		customer.getLinkmans().add(l2);
		l1.setCustomer(customer);
		l2.setCustomer(customer);
		//将以上添加到数据库中
		session.save(customer);
		session.save(l1);
		session.save(l2);
		
		transaction.commit();
		session.close();
		
	}
	//为id为1的客户添加一个联系人
	@Test
	public void fun2() {
		Session session = HibernateUtil.getOpenSession();
		Transaction transaction = session.beginTransaction();
		
		//根据id获取客户
		Customer customer = session.get(Customer.class, 1);
		//创建一个联系人
		Linkman linkman = new Linkman();
		linkman.setLkm_name("penger");
		//添加关系
		customer.getLinkmans().add(linkman);
		linkman.setCustomer(customer);
		//保存到数据库
		session.save(linkman);
		session.save(customer);
		
		transaction.commit();
		session.close();
		
		
		
	}
	
	//为id为1的客户删除一个id=1联系人
	@Test
	public void fun3() {
		Session session = HibernateUtil.getOpenSession();
		Transaction transaction = session.beginTransaction();
		
		//根据id获取客户
		Customer customer = session.get(Customer.class, 1);
		//获取id为1的联系人
		Linkman linkman = session.get(Linkman.class, 1);
		//处理关系
		customer.getLinkmans().remove(linkman);
		linkman.setCustomer(null);
		//删除联系人这条数据
		session.delete(linkman);
		//保存到数据库
		transaction.commit();
		session.close();

	}
	

}

三.多对多的表关系

举例:多个人对应多个职业,我们还是先来看配置文件

<?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">
<!-- 配置表与实体类的关系 name:实体类的全类名 table:表名 package:包名 填上后 下面写全类名时可以省略包名 -->
<hibernate-mapping package="com.lanou3g">
	<class name="User" table="sys_user">
		<!-- id:表示主键 注意:没有主键不能使用hibernate name:表示类中的成员变量名 column:表示这个成员变量所代表的表中的字段名 -->
		<id name="user_id" column="user_id">
			<!-- 主键的生成策略 这里用主键自增策略 -->
			<generator class="native"></generator>
		</id>
		<!-- property:表示除主键以外的属性 -->
		<property name="user_code" column="user_code"></property>
		<property name="user_name" column="user_name"></property>
		<property name="user_password" column="user_password"></property>
		<property name="user_state" column="user_state"></property>
		<!-- 配置多对多关系 
		 ***name 容器的名字
		 table 中间表的名字 
		 column:外键,别人引用"我"的外键列名
		 class: 我与哪个类是多对多关系
		 column:外键.我引用比人的外键列名 -->
		 <!-- 注意多对多时必须要有一方放弃外键的维护,否则无法插入 -->
		<set name="roles" table="sys_user_role">
			<key column="user_id"></key>
			<many-to-many class="Role" column="role_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>
<?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">
<!-- 配置表与实体类的关系 name:实体类的全类名 table:表名 package:包名 填上后 下面写全类名时可以省略包名 -->
<hibernate-mapping package="com.lanou3g">
	<class name="Role" table="sys_role">
		<!-- id:表示主键 注意:没有主键不能使用hibernate name:表示类中的成员变量名 
		column:表示这个成员变量所代表的表中的字段名 -->
		<id name="role_id" column="role_id">
			<!-- 主键的生成策略 这里用主键自增策略 -->
			<generator class="native"></generator>
		</id>
		<!-- property:表示除主键以外的属性 -->
		<property name="role_name" column="role_name"></property>
		<property name="role_memo" column="role_memo"></property>
		<!-- 配置多对多关系 
		 name 容器的名字
		 table 中间表的名字 
		 column:外键,别人引用"我"的外键列名
		 class: 我与哪个类是多对多关系
		 column:外键.我引用比人的外键列名 -->
		<set name="users" table="sys_user_role" inverse="true">
			<key column="role_id"></key>
			<many-to-many class="User" column="user_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

package com.lanou3g;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

/*
 * 测试多对多
 */
public class Demo04 {
	@Test
	public void fun1() {
		Session session = HibernateUtil.getOpenSession();
		Transaction transaction = session.beginTransaction();
	
		//创建两个员工
		User u1 = new User();
		u1.setUser_name("王龙");
		User u2 = new User();
		u2.setUser_name("王一鸣");
		//创建两个角色 保镖,保姆
		Role r1 = new Role();
		Role r2 = new Role();
		r1.setRole_name("保镖");
		r2.setRole_name("保姆");
		//建立关系
		//这两个员工 都既是保姆又是保镖
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		u2.getRoles().add(r1);
		u2.getRoles().add(r2);
		r1.getUsers().add(u1);
		r1.getUsers().add(u2);
		r2.getUsers().add(u1);
		r2.getUsers().add(u2);
		session.save(u1);
		session.save(u2);
		session.save(r1);
		session.save(r2);
		transaction.commit();
		session.close();
	}
	//为王龙 添加一个新角色
	@Test
	public void fun2() {
		Session session = HibernateUtil.getOpenSession();
		Transaction transaction = session.beginTransaction();
		//创建两个员工
		User u1 = session.get(User.class, 1);
	
		Role r1 = new Role();
		r1.setRole_name("男优");
		u1.getRoles().add(r1);
		r1.getUsers().add(u1);
		session.save(r1);
		session.save(u1);
		
		transaction.commit();
		session.close();
	}
	
	//为王龙 删除一个新角色
	@Test
	public void fun3() {
		Session session = HibernateUtil.getOpenSession();
		Transaction transaction = session.beginTransaction();
		//创建两个员工
		User u1 = session.get(User.class, 1);
		Role r3 = session.get(Role.class, 3);
		
		//表示关系
		u1.getRoles().remove(r3);
		r3.getUsers().remove(u1);
		
		transaction.commit();
		session.close();
	}
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值