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 第四天 重点查询的方式
- Hibernate框架的第四天(查询方式和策略)
- Hibernate学习第四天
- Hibernate框架第四天
- Hibernate框架基础知识第四天查询
- Hibernate第四天——查询方式
- 笔记·Hibernate框架第四天
- 【Java EE 学习 47】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】
- ## Hibernate框架的第四天 ##
- 18.01.06,web学习第三十八天,还有一年,努力吧青年 hibernate第四天 HQL,Criteria,离线对象,查询策略
- Hibernate第四天
- hibernate的映射和延迟加载--第四天
- hibernate 学习笔记(马士兵教程) 第四天
- Hibernate的一个注释 @Transient
- 算法系列15天速成——第四天 五大经典查找【上】
- 让人无地自容的hibernate基础问题
- Spring中的Hibernate(一)
- 数据库属性hibernate.dialect的设置
- hibernate图片讲解(四)
- 在 Hibernate 中实现复杂的数据映射