hibernate的映射关系:
映射包括:一对多,多对多和一对一的关系
①一对多:
Address:
User.hbm.xml:
Address.hbm.xml:
测试类:
②多对多的关系:
Student:
Student.hbm.xml:
Course.hbm.xml:
测试类:
③一对一的关系:
IdCard:
IdCard.hbm.xml
Person.hbm.xml:
测试类:
在对数据库的操作中比较多的操作是对实体对象之间的关联关系进行操作,所以关联关系是一个重点。
hibernate的hql语句:
hql:类似于sql的基本语法,不过是面向对象的数据库查询语言,而sql是特定数据库查询语言
在实际项目开发中,如果只是使用session的核心api方法是不能实现多表查询和一些条件查询的,这时是需要hql去带条件和对多表进行操作
映射包括:一对多,多对多和一对一的关系
①一对多:
在许多的情况下,对象之间的关系是一对多的双向关联关系。表示是两个对象之间有一个对象对另一个对象有多个值
package demo1_one2many;
import java.util.HashSet;
import java.util.Set;
public class User {
private int id;
private String name;
private Set<Address> address = new HashSet<Address>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Address> getAddress() {
return address;
}
public void setAddress(Set<Address> address) {
this.address = address;
}
}
Address:
package demo1_one2many;
public class Address {
private int id;
private String name;
private String phone;
private String addre;
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddre() {
return addre;
}
public void setAddre(String addre) {
this.addre = addre;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo1_one2many">
<class name="User" table="t_users">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- address属性,表示本类与Address类的一对多关系
cascade:表示级联操作:save-update 、delete、none、all
inverse:表示维护关联关系,从一方进行维护
-->
<set name="address" cascade="save-update" inverse="true">
<key column="uid"></key>
<one-to-many class="demo1_one2many.Address"/>
</set>
</class>
</hibernate-mapping>
Address.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo1_one2many">
<class name="Address" table="t_address">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<property name="phone" column="phone"></property>
<property name="addre" column="addre"></property>
<!-- user属性,表示本类与User的多对一 -->
<many-to-one name="user" class="demo1_one2many.User" column="uid"></many-to-one>
</class>
</hibernate-mapping>
测试类:
package demo1_one2many;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;
public class App {
@Test
public void test01(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setName("张三");
Address address1 = new Address();
address1.setName("xx");
address1.setPhone("123456");
address1.setAddre("sadasda");
address1.setUser(u);
Address address2 = new Address();
address2.setName("xx2");
address2.setPhone("1234562");
address2.setAddre("sadasda2");
address2.setUser(u);
u.getAddress().add(address1);
u.getAddress().add(address2);
session.save(u);
tx.commit();
session.close();
}
}
②多对多的关系:
在一些实体中,有着两个对象之间相互有着对方多个值的关系
package demo2_many2many;
import java.util.HashSet;
import java.util.Set;
/**
* @author Mao
*
*/
public class Course {
private int id;
private String name;
private Set<Student> student = new HashSet<Student>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudent() {
return student;
}
public void setStudent(Set<Student> student) {
this.student = student;
}
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + ", student=" + student
+ "]";
}
}
Student:
package demo2_many2many;
import java.util.HashSet;
import java.util.Set;
public class Student {
private int id;
private String name;
private Set<Course> course = new HashSet<Course>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course> getCourse() {
return course;
}
public void setCourse(Set<Course> course) {
this.course = course;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", course=" + course
+ "]";
}
}
Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo2_many2many">
<class name="Student" table="t_student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- course属性,表示与Course类的多对多的关系 -->
<set name="course" table="student_course" cascade="all" inverse="true">
<key column="sid"></key>
<many-to-many class="demo2_many2many.Course" column="cid" />
</set>
</class>
</hibernate-mapping>
Course.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo2_many2many">
<class name="Course" table="t_course">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- student属性,表示与Student类的多对多的关系 -->
<set name="student" table="student_course">
<key column="cid"></key>
<many-to-many class="demo2_many2many.Student" column="sid" />
</set>
</class>
</hibernate-mapping>
测试类:
package demo2_many2many;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;
public class App {
//添加
@Test
public void test01(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Student student1 = new Student();
student1.setName("zs");
Student student2 = new Student();
student2.setName("ls");
Course course1 = new Course();
course1.setName("java");
Course course2 = new Course();
course2.setName("php");
student1.getCourse().add(course1);
student1.getCourse().add(course2);
student2.getCourse().add(course1);
student2.getCourse().add(course2);
course1.getStudent().add(student1);
course1.getStudent().add(student2);
course2.getStudent().add(student1);
course2.getStudent().add(student2);
session.save(student1);
session.save(student2);
tx.commit();
session.close();
}
//查询
@Test
public void test02(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Student student = (Student) session.get(Student.class, 3);
for(Course course : student.getCourse()){
System.out.println(course.getName());
}
tx.commit();
session.close();
}
}
③一对一的关系:
在一对一的关系中,比较少见,一个对象对另一个对象有且只有一个值
package demo3_one2one;
public class Person {
private int id;
private String name;
private IdCard idcard;
public IdCard getIdcard() {
return idcard;
}
public void setIdcard(IdCard idcard) {
this.idcard = idcard;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
IdCard:
package demo3_one2one;
public class IdCard {
private int id;
private String num;
private Person person;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
IdCard.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo3_one2one">
<class name="IdCard" table="t_idcard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="num" column="num"></property>
<!-- 方式一:不用设置外键,把主键当成外键来映射 -->
<one-to-one name="person" class="demo3_one2one.Person" constrained="true"></one-to-one>
<!-- 方式二:设置一个外键来映射
<many-to-one name="person" class="demo3_one2one.Person" column="pid">
</many-to-one>
-->
</class>
</hibernate-mapping>
Person.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo3_one2one">
<class name="Person" table="t_person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- idcard属性,表示与IdCard类的一对一关系 -->
<one-to-one name="idcard" class="demo3_one2one.IdCard" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
测试类:
package demo3_one2one;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;
public class App {
//添加
@Test
public void test01(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//设置各个对象的属性,并保存
Person person = new Person();
IdCard id = new IdCard();
person.setName("zs");
id.setNum("123123");
person.setIdcard(id);
id.setPerson(person);
session.save(person);
tx.commit();
session.close();
}
//查询
@Test
public void test02(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Person p = (Person) session.get(Person.class, 1);
System.out.println(p.getIdcard());
tx.commit();
session.close();
}
}
在对数据库的操作中比较多的操作是对实体对象之间的关联关系进行操作,所以关联关系是一个重点。
hibernate的hql语句:
hql:类似于sql的基本语法,不过是面向对象的数据库查询语言,而sql是特定数据库查询语言
package demo4_hql;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;
public class App {
/**
* hql语法:
* 1)单表查询
* 1.1 全表查询
* 1.2 指定字段查询
* 1.3 排除重复记录
* 1.4 条件查询(重点)
* 1.5 分页查询
* 1.6 聚合查询
* 1.7 查询排序
* 1.8 分组查询
* 1.9 分组后筛选
*
* 2)多表查询
* 1.1 内连接
* 1.2 左外连接/右外连接
* @author APPle
*/
@Test
public void test01(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//1、查询 一个对象
//String hql = "from Employee e ";
//2、查询有条件的对象
String hql = "from Employee e where e.id = 1";
Query query = session.createQuery(hql);
/*List list = query.list();
for(Object object : list){
System.out.println(list);
}*/
Employee employee = (Employee) query.uniqueResult();
System.out.println(employee);
tx.commit();
session.close();
}
@Test
public void test02(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//1、全表查询
//String hql = "select e from Employee e";
//auto-import :自动导包,自动在每个包下面搜索对应的这个类名,但是如果有多个同名类的时候会冲突
//String sql = "from Employee";默认情况下,hibernate会自动导包功能
//2、查询指定的字段
//String hql = "select new Employee(e.name,e.title) from Employee e";
//3、排除重复
//String hql ="select distinct(e.gender) from Employee e";
//4、条件查询一、逻辑条件and or
//String hql = "from Employee e where e.name =? and e.gender=?";
//String hql = "from Employee e where e.name=? or e.gender = ?";
//4、条件查询二、比较条件
//String hql = "from Employee e where e.salary>=4500 and e.salary<=6000";
//String hql = "from Employee e where e.salary between 4500 and 6000";
//4、条件查询三、判空条件
//String hql = "from Employee e where e.gender is not null and e.gender<>''";
//String hql = "from Employee e where e.gender id null or e.gender=''";
//4、条件查询四、模糊条件
//String hql = "from Employee e where e.name like '李%'";
//String hql ="from Employee e where e.name like '李_'";
//5、按顺序查询
//String hql = "from Employee e order by e.id desc";
//6、分组查询
//String hql = "select e.gender,count(*) from Employee where e.gender is not null and e.gender<>'' group by e.gender";
//7、聚合查询
//String hql ="select max(e.salary) from Employee e";
//String hql = "select avg(e.salary) from Employee e";
//8、分组后筛选
//String hql = "select e.gender,count(e) from Employee e where e.gender is not null and e.gender <>'' group by e.gender having count(e)>2";
//9、分页查询
String hql =" from Employee";
Query query = session.createQuery(hql);
//给Query对象进行赋值,参数从0开始
//query.setParameter(0,"xx"); query.setParameter(1,"xxx");
query.setFirstResult(0); //设置分页查询的当前页
query.setMaxResults(5); //设置分页查询的每页显示的数量
/*List<Object[]> list = query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object + "\t");
}
}*/
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
tx.commit();
session.close();
}
@Test
public void test03(){
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//多表查询一、内连接查询
//(1)String hql = "select e.name,d.deptName from Employee e,Dept d where e.dept.id=d.id";
//(2)String hql = "select e.name,d.deptName from Employee e inner join e.dept d ";
//多表查询二、左外连接查询
//String hql = "select e.name,d.deptName from Dept d left outer join d.emps e";
//多表查询三、右外连接查询
String hql = "select e.name,d.deptName from Employee e right outer join e.dept d";
Query query = session.createQuery(hql);
/*List list = query.list();
for (Object object : list) {
System.out.println(object);
}
*/
List<Object[]> list = query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println();
}
tx.commit();
session.close();
}
}
在实际项目开发中,如果只是使用session的核心api方法是不能实现多表查询和一些条件查询的,这时是需要hql去带条件和对多表进行操作