Hibernate学习

Hibernate学习


一、Hibernate体系结构的要素

Hibernate体系结构的要素要创建第一个hibernate应用程序,我们必须知道Hibernate架构的元素。 它们如下:

1.会话工厂(SessionFactory)

SessionFactory是ConnectionProvider的会话和客户端工厂。 它拥有数据的二级缓存(可选)。 org.hibernate.SessionFactory接口提供了工厂方法来获取Session的对象。

2. 会话(Session)

Session对象提供应用程序和存储在数据库中的数据之间的接口。 它是一个短生命周期的对象并包装JDBC连接。 它是事务,查询和标准的工厂。 它拥有一级缓存(强制性)数据。 org.hibernate.Session接口提供插入,更新和删除对象的方法。 它还提供了事务,查询和标准的工厂方法。

3.事务(Transaction)

事务对象指定工作的原子单位,它是一个可选项。 org.hibernate.Transaction接口提供事务管理的方法。

4.连接提供者(ConnectionProvider)

它是一个JDBC连接工厂。 它从DriverManager或DataSource抽象出来的应用程序。 它是一个可选项。

5.事务工厂(TransactionFactory)

它是一个事务工厂,是一个可选项。

二、入门案例

1.创建maven工程并导入所需依赖

<dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.17.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.36</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2.编写核心配置文件(hibernate.cfg.xml)

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--数据库连接-->
        <property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=utf-8</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <!--选项配置-->
        <!--作用:反向生成表-->
        <property name="hbm2ddl.auto">update</property>
        <!--生成数据库的语法设置为MySQL-->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!--把hibernate生成的sql语句输出到控制台,调试方便-->
        <property name="show_sql">true</property>

        <!--映射配置文件的路径-->
        <!--<mapping resource="cn/ffcs/domain/Book.hbm.xml"/>-->

        <!--扫描注解-->
        <mapping class="cn.ffcs.domain.Book"/>
    </session-factory>
</hibernate-configuration>

3.编写实体类和映射配置文件

实体类:

package cn.ffcs.domain;

/**
 * 图书的实体类
 */
public class Book {

    private Integer id;     //主键
    private String name;    //图书名字
    private String author;  //图书作者
    private Double price;   //图书价格

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

映射配置文件(ORM的相关思想实现)

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!--实体类和表之间的映射关系配置-->
<hibernate-mapping>

    <class name="cn.ffcs.domain.Book" table="t_book">
        <id name="id">
            <column name="bid"/>
            <generator class="identity"/>   <!--数据库自增-->
        </id>

        <property name="name">
            <column name="name"/>
        </property>

        <property name="author">
            <column name="author"/>
        </property>

        <property name="price">
            <column name="price"/>
        </property>
    </class>

</hibernate-mapping>

4.编写实体类和通过注解实现

实体类:

package cn.ffcs.domain;

import javax.persistence.*;

/**
 * 图书的实体类
 */
@Entity
@Table(name = "t_book")
public class Book {

    @Id
    @Column(name = "bid")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;     //主键

    @Column(name = "name")
    private String name;    //图书名字

    @Column(name = "author")
    private String author;  //图书作者

    @Column(name = "price")
    private Double price;   //图书价格

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

hibernate的主配置文件中配置扫描注解的类

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--数据库连接-->
        <property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=utf-8</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <!--选项配置-->
        <!--作用:反向生成表-->
        <property name="hbm2ddl.auto">update</property>
        <!--生成数据库的语法设置为MySQL-->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!--把hibernate生成的sql语句输出到控制台,调试方便-->
        <property name="show_sql">true</property>

        <!--映射配置文件的路径-->
        <!--<mapping resource="cn/ffcs/domain/Book.hbm.xml"/>-->

        <!--扫描注解-->
        <mapping class="cn.ffcs.domain.Book"/>
    </session-factory>
</hibernate-configuration>

5.注意错误

Mapping (RESOURCE) not found : cn/ffcs/domain/Book.hbm.xml : origin(cn/ffcs/domain/Book.hbm.xml)

原因:maven工程没有把xm读取到。
解决办法:
      在pom.xml文件中配置:以下代码

 <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

6.测试CRUD

import cn.ffcs.domain.Book;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;


/**
 * Book的测试类
 */
public class BookTest {

    private Configuration cfg;
    private SessionFactory factory;
    private Session session;
    private Transaction tx;
    @Before
    public void init(){
        //1.解析hibernate的核心配置文件
        cfg = new Configuration().configure();
        //2.解析映射信息(在此步骤创建了sql语句)
        factory = cfg.buildSessionFactory();
        //3.得到Session对象
        session = factory.openSession();
        //4.开启事务
        tx = session.beginTransaction();
    }

    @After
    public void after(){
        //6.提交事务
        tx.commit();
        //7.释放资源
        session.close();
    }

    /**
     * 测试保存
     */
    @Test
    public void testSave(){

        //5.保存数据
        Book book = new Book();
        book.setName("java");
        book.setAuthor("黑马");
        book.setPrice(100d);
        session.save(book);

    }

    /**
     * 测试查询(按id查)
     */
    @Test
    public void testGet(){

        Book book = session.get(Book.class, 2);
        System.out.println(book);

    }

    /**
     * 测试删除(根据id删除)
     */
    @Test
    public void testDelete(){

        Book book = new Book();
        book.setId(4);
        session.delete(book);

    }

    /**
     * 测试更新(根据id进行更新锁定)
     */
    @Test
    public void testUpdate(){

        Book book = new Book();
        book.setId(1);
        book.setName("java入门");
        book.setAuthor("黑马培训班");
        book.setPrice(200d);
        session.update(book);

    }

    /**
     * 测试查询所有——方法1
     */
    @Test
    public void testQuery1(){
        /**
         * 当使用方法时from下面红线信息:'from' unexpected
         * 解决方法:项目名右击 - >add framework support ->选中hibernate 和 j2EE persistence
         *          含义:添加 hibernate 和 j2EE persistence 的框架支持
         * 注:红线不影响运行。(作为强迫症,还是要修改一下。)
         */
        Query query = session.createQuery("from cn.ffcs.domain.Book");
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }

    /**
     * 测试查询所有——方法2
     */
    @Test
    public void testQuery2(){
        Criteria criteria = session.createCriteria(Book.class);
        List<Book> list = criteria.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }

    /**
     * 测试查询所有方法——方法3
     */
    @Test
    public void testQuery3(){
        SQLQuery sqlQuery = session.createSQLQuery("select * from t_book").addEntity(Book.class);
        List<Book> list = sqlQuery.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }

    /**
     * 测试多条件查询(利用离线查询条件)
     */
    @Test
    public void testMultiConditionQuery(){
        DetachedCriteria criteria = DetachedCriteria.forClass(Book.class);
        criteria.add(Restrictions.eq("name","java入门")).add(Restrictions.eq("author","黑马培训班"));
//        criteria.add(Restrictions.eq("name","java")).add(Restrictions.eq("price",100D));
        Criteria c = criteria.getExecutableCriteria(session);
        List<Book> list = c.list();
        for (Book book : list) {
            System.out.println(book);
        }


        /**
         * uniqueResult()方法表示只有唯一返回值(要注意的是上面的criteria.add(...)的方法所做的条件在数据库中有且只有一条数据否则会报错)
         * 报错信息:org.hibernate.NonUniqueResultException: query did not return a unique result: 2(表示查询到数据库中存在符合条件的两条数据,封装进一个bean对象错误)
         */
//        Book book = (Book) criteria.getExecutableCriteria(session).uniqueResult();
//        System.out.println(book);
    }
}


三、hibernate的缓存机制与Session、SessionFactory、Transaction、Query、Criteria和Configuration核心API

相关资料请转载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值