zoukankan      html  css  js  c++  java
  • 初识Hiberante框架和第一个案例

    今天想回顾一下一个月前学的hibernate框架,也让我了解了持久层的概念(访问数据库).

    一、ORM概念

    首先提的是ORM概念,O表示Object,

    R表示Relation(关系),关系型数据库,如mysql,oracle等,M表示mapping,ORM连起来对象关系映射.

    Hibernate 实现了ORM,解决了两个问题:一是存储:把对象的数据直接保存到数据库中,二是获取,直接从数据库中拿到一个对象,中间必须通过映射这个概念

    二、Hibernate HelloWorld案例

    搭建一个Hibernate环境,开发步骤:

    1. 下载源码

             版本:hibernate-distribution-3.6.0.Final

    2. 引入jar文件

             hibernate3.jar核心  +  required 必须引入的(6个) +  jpa 目录  + 数据库驱动包

    如下图:

    3. 写对象以及对象的映射

             Employee.java            对象

             Employee.hbm.xml        对象的映射 (映射文件)

    4. src/hibernate.cfg.xml  主配置文件

             -à 数据库连接配置

             -à 加载所用的映射(*.hbm.xml)

    5. App.java  测试

    Employee.java对象

    package cn.itcast.a_hello;
    
    import java.util.Date;
    
    public class Employee {
        
        private int empId;
        private String empName;
        public int getEmpId() {
            return empId;
        }
        public void setEmpId(int empId) {
            this.empId = empId;
        }
        public String getEmpName() {
            return empName;
        }
        public void setEmpName(String empName) {
            this.empName = empName;
        }
        public Date getEmpDate() {
            return empDate;
        }
        public void setEmpDate(Date empDate) {
            this.empDate = empDate;
        }
        private Date empDate;
        public Employee() {
            // TODO Auto-generated constructor stub
        }
        @Override
        public String toString() {
            return "Employee [empId=" + empId + ", empName=" + empName
                    + ", empDate=" + empDate + "]";
        }
    
    }

    Employee.hbm.xml配置文件

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping SYSTEM
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      
    <hibernate-mapping package="cn.itcast.a_hello">
        <class name="Employee" table="employee">
            <!-- 主键映射值 -->
              <id name="empId" column="id">
              <generator class="native">
              </generator>
              </id>
              
              <!-- 非主键映射 -->
              <property name="empName" column="empName"></property>
              <property name="empDate" column="empDate"></property>
        </class>
    </hibernate-mapping>

    hibernate.cfg.xml主配置文件

    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory name="foo">
            
            <!-- 数据库连接配置 -->
            <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
            <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=Employee</property>
            <property name="hibernate.connection.username">sa</property>
            <property name="hibernate.connection.password">XXXXXX</property>
            <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
            <!-- 2.其它配置设置 -->
            <!-- 2.1设置运行时是否显示执行的sql语句 -->
            <property name="show_sql">true</property>
            
            <!-- 2.2设置运行的sql语句格式化 -->
            <property name="hibernate.format_sql">true</property>
            
            <!-- 2.3设置是否创建表
                1.create不存在表直接创建,存在则先删除表再创建表
                2.update如果存在就不会创建表,如果不存在则创建
                3.create-drop createSessionFactory()时创建表
                        sf.close()删除表
             -->
            <property name="hibernate.hbm2ddl.auto">create</property>
            <!-- 加载所有映射 
            <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
        </session-factory>
    </hibernate-configuration>

    最后的效果:

    最后看到数据库多了一条记录

    三、Hibeanate的API

    |-- Configuration       配置管理类对象

             config.configure();    加载主配置文件的方法(hibernate.cfg.xml)

                                                            默认加载src/hibernate.cfg.xml

             config.configure(“cn/config/hibernate.cfg.xml”);   加载指定路径下指定名称的主配置文件

             config.buildSessionFactory();   创建session的工厂对象

    |-- SessionFactory     session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)

             sf.openSession();   创建一个sesison对象

             sf.getCurrentSession();  创建session或取出session对象

    |--Session       session对象维护了一个连接(Connection), 代表了与数据库连接的会话。

                                   Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象

                       session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

    更新:

             session.save(obj);   保存一个对象

             session.update(emp);  更新一个对象

             session.saveOrUpdate(emp);  保存或者更新的方法:

                                                                     à没有设置主键,执行保存;

    à有设置主键,执行更新操作;

    à如果设置主键不存在报错!

     配置SessfionFactory

        private static SessionFactory sf;
        
        //加载配置文件,只执行一次
        static{
            /**
             * 创建SessionFactory对象,指定了class对象后就
             * 可以不用在主配置文件中指定<mapping resource=""/>
             */
            
            sf = new Configuration()
            .configure()
            .addClass(Employee.class)//(测试)会自动加载Employee.hbm.xml文件,必须和该类在同一包下
            .buildSessionFactory();
            
        }

    测试保存:

    @Test
        public void testSave() throws Exception{
            // TODO Auto-generated method stub
            //对象
            Employee emp = new Employee();
            emp.setEmpName("张三");
            emp.setEmpDate(new Date());
            
        
            
        
            Session session = sf.openSession();
            
            //开启事务alt+shift+l快速生成左边的变量,但鼠标要放在放在方法后面
             Transaction tx = session.beginTransaction();
            //保存到数据库
            session.save(emp);
    //         session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
            //提交事务
            tx.commit();
            session.close();
            
        }

    测试更新

    @Test
        public void testUpdate()
        {
            //对象
            Employee emp = new Employee();
            emp.setEmpName("李四2");
            emp.setEmpId(4);
            
            //1.创建session
            Session session = sf.openSession();
            
            //2.开启事务
            Transaction tx = session.beginTransaction();
            //3.执行更新操作,必须设置主键
            //session.update(emp);
            
            //根据主键得到对应的对象
            Employee employee = (Employee) session.get(Employee.class, 5);
            System.out.println(employee);
            
            //save或者update,当设置主键时,执行更新操作,当没有设置主键时执行插入操作
            session.saveOrUpdate(emp);
            tx.commit();
            session.close();
        }

    四、三种方式查询

    一、主键查询:

             session.get(Employee.class, 1);    主键查询

    session.load(Employee.class, 1);   主键查询 (支持懒加载)

     例如:

        @Test
        public void testGet()
        {
            Session session = sf.openSession();
            //2.开启事务
            Transaction tx = session.beginTransaction();
            Employee emp = (Employee) session.get(Employee.class,5);
            System.out.println(emp);
            tx.commit();
            session.close();
        }

    二、HQL查询:

             HQL查询与SQL查询区别:

                       SQL: (结构化查询语句)查询的是表以及字段;  不区分大小写。

                       HQL: hibernate  query  language 即hibernate提供的面向对象的查询语言

                                查询的是对象以及对象的属性。

                                区分大小写。优点跨平台

    //HQL查询
        @Test
        public void testSQL()
        {
            //1.创建session
            Session session = sf.openSession();
            //2.开启事务
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Employee where id= 2 or id=5");
        
            List<Employee> list = q.list();
            System.out.println(list);
            tx.commit();
            session.close();
    
        }

    三、Criteria查询:

              完全面向对象的查询。

        @Test
            public void testCRQ()
            {
                //1.创建session
                Session session = sf.openSession();
                //2.开启事务
                Transaction tx = session.beginTransaction();
                Criteria crita = session.createCriteria(Employee.class);
                //查询条件
                crita.add(Restrictions.eq("id", 8));
                List<Employee> list = crita.list();
                System.out.println(list);
                tx.commit();
                session.close();
    
            }

    四、本地SQL查询:

             复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!

             (缺点: 不能跨数据库平台!)

     //本地SQL查询
        @Test
        public void testSQL()
        {
            //1.创建session
            Session session = sf.openSession();
            //2.开启事务
            Transaction tx = session.beginTransaction();
            SQLQuery se = session.createSQLQuery("select * from employee");
            //查询条件
        
            List<Employee> list = se.list();
            System.out.println(list);
            tx.commit();
            session.close();
        
        }

    Hibernate 实现分页查询

    //HQL实现分页查询
        @Test
        public void testFenYe()
        {
            //1.创建session
            Session session = sf.openSession();
            //2.开启事务
            Transaction tx = session.beginTransaction();
            Query query = session.createQuery("from Employee");
            //设置分页参数.起始从零开始
            query.setFirstResult(0);//查询的起始记录
            query.setMaxResults(4);//查询的记录数
            List<Employee> list = query.list();
            System.out.println(list);
            tx.commit();
            session.close();
        
        }

     值得注意的问题:

    共性问题1:

             ClassNotFoundException…., 缺少jar文件!

    问题2:

             如果程序执行程序,hibernate也有生成sql语句,但数据没有结果影响。

             问题一般是事务忘记提交…….

    遇到问题,一定看错误提示!

    一个愿意分享技术和生活的码农
  • 相关阅读:
    content-type
    文件上传
    注册案例
    20 行代码极速为 App 加上聊天功能
    一步一步带你安装史上最难安装的 vim 插件 —— YouCompleteMe
    iOS 调试心得
    Playground 你不知道的小技巧, CoreData 的使用
    令人眼前一亮的下拉式终端 Tilda & Guake
    代码可读性提升指南
    iOS 推送问题全解答《十万个为啥吖?》
  • 原文地址:https://www.cnblogs.com/zhuixun/p/6575939.html
Copyright © 2011-2022 走看看