一.使用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();
}
}