您的位置:首页 > 其它

Hibernate第四天

2017-09-11 00:42 92 查看

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 Language

SQL—>本地的查询

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方法之后的对象称为游离对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate