1基于主键来进行映射
人和身份证的问题
身份证这一端 人的这一端是不用配置的
<hibernate-mapping package="com.qf.one2one"> <class name="IdCard" table="t_idcard"> <!--配置的是表里面的主键--> <id name="pId" type="java.lang.Integer"> <!--下面这个表示的是要使用别的对象的主键来最为主键--> <generator class="foreign"> <!--下面的这个name值是不能改变的 后面的值 使用下面one2one的name的值就OK了--> <param name="property">people</param> </generator> </id> <!--配置的是普通的列--> <property name="cardNum"></property> <!--是不是就要配置映射的关系了 constrained:表示的是要作为外键--> <one-to-one name="people" class="People" constrained="true" cascade="all"></one-to-one> </class> </hibernate-mapping>
2. 查询(HQL/SQL/Cretiria)
hql的查询方式
HQL—>Hibernate Query LanguageSQL—>本地的查询
Cretiria查询:是Hibrnate的设计者为了方便 不会编写Sql语句的人使用的
HQL(在Hibernate中使用最多的) 面向对象的查询 具有高的可移植性 和底层的表没有关系 即使有关系那也是间接性的关系 查询的时候直接查询的我们的JAVA对象
HQL如何使用呢?
将我们原来的SQL语句中的 表字段换成对象的属性 表的名字换成类的名字就OK了 (还是要SQL的基础)
SQL—>本地的SQL查询(就是我们前面写的那种)
Cretiria查询(面向对象的查询) 跟HQL一样 主要方便的是 不会SQL的人使用的
HQL查询
//查询所有的数据
// Query query=session.createQuery("select d from Dept d");
//带条件的查询
// Query query=session.createQuery("select d from Dept d where d.deptId>2");
//between and
// Query query=session.createQuery("select d from Dept d where d.deptId between 4 and 6");
//查询数据并封装成对象
// Query query=session.createQuery("select new Employ(e.empName,e.empAddress) from Employ e ");
//模糊查询
//Query query=session.createQuery("select new Employ(e.empName) from Employ e where empName like '%狗%'");
//Query query=session.createQuery("select new Employ(e.empName) from Employ e where empName like ?");
//query.setString(0,"%狗%");
//给占位符整个名字
/*Query query=session.createQuery("select new Employ(e.empName) from Employ e where empName=:empName");
query.setParameter("empName","狗娃1");*/
//分组查询(统计用户表里面 男和女的人数)
Query query=session.createQuery("select u.gender,count(*) from User u group by u.gender");
List list=query.list();
System.out.println(list);
session.close();
/**
* 分页查询
* @throws Exception
*/
@Test
public void testFY() throws Exception {
Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
Query query=session.createQuery("select new User(u.uName,u.gender) from User u");
//分页:获取一共有所少数据
ScrollableResults results=query.scroll();
//表示的是滚动到末尾
results.last();
//下面就可以获取一共的数据条目数了
long count=results.getRowNumber()+1;
//打印我们的一共的数据条目数
System.out.println("获取到的一共的数据是:"+count);
//接下来我们就应该设置
//分页查询的重点 要设置要从那一条数据查询 要查询多少条数据
query.setFirstResult(1);
query.setMaxResults(2);
//接下来就应该查询数据了
List list=query.list();
System.out.println(list);
}
/**
* 内连接查询
* @throws Exception
*/
@Test
public void testInnerJoin() throws Exception {
Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
//Query query=session.createQuery("from Dept d inner join d.emps");
Query query=session.createQuery("from Employ e inner join e.dept");
List list=query.list();
//以谁为主查询那么水谁就在前面
for (Object object : list) {
Object[] b =(Object[]) object;
System.out.println(b[0]);
System.out.println(b[1]);
}
//System.out.println(list);
}
/**
* 左连接查询
* @throws Exception
*/
@Test
public void testLeftJoin() throws Exception {
Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
//Query query=session.createQuery("from Dept d inner join d.emps");
Query query=session.createQuery("from Dept d left join d.emps");
List list=query.list();
//以谁为主查询那么水谁就在前面
for (Object object : list) {
Object[] b =(Object[]) object;
System.out.println(b[0]);
System.out.println(b[1]);
}
//System.out.println(list);
}
@Test
public void testRightJoin() throws Exception {
Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
//Query query=session.createQuery("from Dept d inner join d.emps");
Query query=session.createQuery("from Dept d right join d.emps");
List list=query.list();
//以谁为主查询那么水谁就在前面
for (Object object : list) {
Object[] b =(Object[]) object;
System.out.println(b[0]);
System.out.println(b[1]);
}
//System.out.println(list);
}
/**
* 迫切连接
* @throws Exception
*/
@Test
public void testFetchJoin() throws Exception {
Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
//Query query=session.createQuery("from Dept d inner join d.emps");
Query query=session.createQuery("from Employ e left join fetch e.dept");
List list=query.list();
//以谁为主查询那么水谁就在前面
System.out.println(list);
}
/**
* 懒加载的问题
* @throws Exception
*/
@Test
public void testLazy() throws Exception {
Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
session.beginTransaction();
User user=session.load(User.class,1);
//持久化的状态
user.setuName("xxxxxxx");
session.flush(); //强制缓存于数据库同步
session.getTransaction().commit();
session.close();
//System.out.println(user);
}
懒加载的问题
就是如果我们的session关闭之后 懒加载的数据还能使用吗?
如果没有进行任何设置 那么懒加载的数据 是没有办法在session关闭之后进行使用
如果我就是要使用呢?
//解决方案一:强制代理对象初始化
//Hibernate.initialize(dept);
//解决方案二:先使用一下数据
//user.getuName();
//解决方案三:就是在session关闭之前来使用数据
//解决方案四:设置步支持懒加载
3 Hibernate中对象的状态问题
1>:临时对象
就是创建了对象但是没有save find load get ....之前的对象称为临时对象
在数据库没有对应的记录
2>:持久化对象
就是调用了 save find load get ....操作数据库方法之后的对象
持久化对象有啥特点呢?在数据有对应的记录
持久化对象是可以和数据库同步的.....
3>:游离对象
调用了session的close方法之后的对象称为游离对象