初识Hiberante框架和第一个案例

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

1、ORM概念

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

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

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

2、Hibernate HelloWorld案例

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

1. 下载源码oracle

         版本:hibernate-distribution-3.6.0.Finalapp

2. 引入jar文件框架

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

以下图:sqlserver

 

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>

最后的效果:

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

 

3、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();
    }

 

4、三种方式查询

1、主键查询:

         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();
    }

 

 

2、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();

    }

 

3、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();

        }

 

4、本地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语句,但数据没有结果影响。

         问题通常是事务忘记提交…….

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

相关文章
相关标签/搜索