24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

Hibernate框架的使用及Hibernate的常见查询方法

2017-07-17 19:53:33 东方博宜 阅读

1hibernate:实现了DAO设计模式的框架!

从开发效率的角度:hibernate是高于jdbc的!

从运行效率的角度(程序员的sql水平良好):hibernate的运行效率略低于jdbc的!

 

2hibernate框架搭建

A、配置数据库连接源

mysql配置子账户!

 

B、添加hibernate框架

Hibernate中的Sessionorg.hibernate包中的),和HttpSession完全不同!

Hibernate中的Session负责数据库的交互!

 

com.xx.domain:实体包,存放自动生成的HibernateSessionFactoryORM文件、POJO类!

 

C、翻转POJO类(和表对应的类)以及ORM文件(描述POJO类和表的对应关系的文件)

image.png

image.png

 


 

3、入门案例

UserService:(com.user.service.UserService):

image.png

 

如何显示hibernate生成的sql语句?

image.png

 

 

注意:Hibernate默认是面向对象的查询模式,不是面向表的查询,特别注意,不能写sql,而是要写hqlquery操作hql语句(Hibernate Query Lanagage))

 

 

什么是ORM

Object relationship mapping:对象关系映射,用来描述对象(POJO类)和数据库的表之间的映射关系的文件,帮助hibernate来生成sql,做到面向对象查询!

4hibernate中的配置文件和ORM机制

Ahibernate.cfg.xmlhibernate的核心配置文件,存放数据库连接的信息以及ORM文件的位置!

BORM文件:xx.hbm.xml,存放了POJO类和数据库的表的关系的描述!(POJO类的属性和数据库表的字段的关系)

CPOJO类:和数据库的表对应的Java类!

DHibernateSessionFactory:读取hibernate配置文件,生成核心的数据库访问对象Session的类!

 

5Hibernate的基础原理?

HibernateSessionFactory读取hibernate.cfg.xml核心配置文件,得到数据库的访问对象Session

hibernate.cfg.xml中描述了ORM文件的位置!

ORM文件存放了POJO类的位置!

 

6、查询

A、查询某个对象(映射到某张表)的所有数据

 

B、子查询:查询部分数据

       List list = getList("from Student where gender='M' and num >= 10");

       for(Object obj:list){

           Student s = (Student) obj;

           System.out.println(s.getNum() + " " + s.getName() + " " + s.getTel() + " " + s.getGender());

       }

 

 

C、属性查询:默认的属性查询,查询出的结果不是对象类型,而是Object[]类型

       List list = getList("select num,name,address from Student");

       for(Object obj:list){

           Object[] stu = (Object[]) obj;

           System.out.println(stu[0] + " " + stu[1] + " " + stu[2]);

       }

 

D、实例化查询:将属性查询的结果直接封装为对象

       List list = getList("select new Student(num,name,address) from Student");

       for(Object obj:list){

           Student s = (Student) obj;

           System.out.println(s.getNum() + " " + s.getName() + " " + s.getAddress());

       }

 

注意:在Student这个POJO类中添加我们需要的构造方法!

6、查询单个数据:根据主键查询

Aget查询

image.png

 


 

Bload查询

image.png

 

常见错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

 

注意:load查询是基于延迟加载(load时不真正查询,而是等到使用时才查询)设计的,因此在load时,没有真正查询,而是在输出(使用)时查询!

 

解决方法:要么在关闭session前使用(不合理),要么关闭Hibernate对于该对象load时的延迟加载的设计!

image.png

问题:load查询和get查询的区别?

Aload查询是基于延迟加载设计的,load时不真正查询,而是在使用时查询;

Bget查询,如果查不到,返回nullload查询查不到,抛出异常!

 

7、数据操作

注意:Hibernate默认的事物管理是手动管理的,而非自动管理!(JDBC是自动管理)

什么是事物管理?多个操作要同时成功或者失败!(成功了,也需要commit才能进到数据库)

JDBC事物管理例子:

                   try{

                            //加载驱动类

                            Class.forName("com.mysql.jdbc.Driver");

                           

                            //获取数据库连接

                            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/company","root","root");

                            //第一步:取消jdbc的自动事物提交

                            con.setAutoCommit(false);

                           

                            //获取语句分析容器

                            st = con.createStatement();

                            //两条操作的sql语句,需要同时成功或者失败

                            String sql1 = "";

                            String sql2 = "";

                            st.executeUpdate(sql1);

                            st.executeUpdate(sql2);

                           

                            //第二步:如果两个操作都成功了,则提交

                            con.commit();

                           

                   }catch(Exception e){

                            e.printStackTrace();

                           

                            //第三步:如果有一个操作失败了,则会产生异常,撤销所有的操作

                            try {

                                     con.rollback();

                            } catch (SQLException e1) {

                                     // TODO Auto-generated catch block

                                     e1.printStackTrace();

                            }

                           

                   }finally{

                            try{

                                     //关闭资源

                                     if(rs != null){

                                               rs.close();

                                     }

                                    

                                     if(st != null){

                                               st.close();

                                     }

                                    

                                     if(con != null){

                                               con.close();

                                     }

                                    

                            }catch(Exception e){

                                     e.printStackTrace();

                            }

                   }

A、增加

    /**

     * 增加

     * @param obj

     */

    public static void saveObj(Object obj){

       //打开数据库的连接对象Session(类似Connection

       Session session = HibernateSessionFactory.getSession();

       //获取事物管理对象Transaction

       Transaction ta = session.beginTransaction();

      

       session.save(obj);

       //提交事物

       ta.commit();

       //关闭数据库连接对象Session

       HibernateSessionFactory.closeSession();

    }

   

    public static void main(String[] args) {

       Student s = new Student();

       s.setName("王晓飞");

       s.setAddress("江苏常州市天宁区延陵中路");

       saveObj(s);

    }

 

B、修改:由于修改是默认修改所有字段,因此被修改对象最好是先查出来,然后修改需要修改的字段,然后修改!

    /**

     * 根据主键修改对象(注意:默认修改所有字段)

     * @param obj

     */

    public static void updateObj(Object obj){

       //打开数据库的连接对象Session(类似Connection

       Session session = HibernateSessionFactory.getSession();

       //获取事物管理对象Transaction

       Transaction ta = session.beginTransaction();

      

       session.update(obj);

       //提交事物

       ta.commit();

       //关闭数据库连接对象Session

       HibernateSessionFactory.closeSession();

    }

   

    public static void main(String[] args) {

       Student s = (Student) getObj(Student.class,37);

       s.setPassword("123");

       s.setGender("F");

       updateObj(s);

    }

 

C、删除

    /**

     * 根据主键删除对象

     * @param obj

     */

    public static void delObj(Object obj){

       //打开数据库的连接对象Session(类似Connection

       Session session = HibernateSessionFactory.getSession();

       //获取事物管理对象Transaction

       Transaction ta = session.beginTransaction();

      

       session.delete(obj);

       //提交事物

       ta.commit();

       //关闭数据库连接对象Session

       HibernateSessionFactory.closeSession();

    }

   

    public static void main(String[] args) {

       Student s = new Student();

       s.setNum(37);

       delObj(s);

    }

 

8、批量操作:query.executeUpdate(hql);

    /**

     * 批量操作

     * @return

     */

    public static int update(String hql){

       Session session = HibernateSessionFactory.getSession();

       //获取事物管理对象Transaction

       Transaction ta = session.beginTransaction();

      

       Query query = session.createQuery(hql);

       int x = query.executeUpdate();

      

       ta.commit();

       //关闭数据库连接对象Session

       HibernateSessionFactory.closeSession();

       return x;

    }

   

    public static void main(String[] args) {

       String hql = "update Student set password='321' where password is null";

       update(hql);

    }

 

9uniqueResult() 返回唯一的结果集

    /**

     * 返回唯一结果集(要确保返回值只有一条记录)

     * @return

     */

    public static Object getObj(String hql){

       Session session = HibernateSessionFactory.getSession();    

       Query query = session.createQuery(hql);

       Object obj = query.uniqueResult();//返回唯一的结果集

       //关闭数据库连接对象Session

       HibernateSessionFactory.closeSession();

       return obj;

    }

   

    public static void main(String[] args) {

       Student s = (Student) getObj("from Student where num=1");

       System.out.println(s.getNum() + " " + s.getName());

      

       long c = (Long)getObj("select count(num) from Student");

       System.out.println(c);

    }

 

10、分页查询

    /**

     * 分页查询

     * @return

     */

    public static List getList(String hql,int page,int pageSize){

       Session session = HibernateSessionFactory.getSession();

      

       Query query = session.createQuery(hql);

       int start = (page - 1) * pageSize;

       //设置从哪条开始查

       query.setFirstResult(start);

       //查询多少条

       query.setMaxResults(pageSize);

      

       List list = query.list();

      

       //关闭数据库连接对象Session

       HibernateSessionFactory.closeSession();

       return list;

    }

   

    public static void main(String[] args) {

       List list = getList("from Student",3,8);

       for(int i = 0;i < list.size();i++){

           Student s = (Student) list.get(i);

           System.out.println(s.getNum() + " " + s.getName());

       }

    }


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn