JavaWeb框架——Hibernate(一)

1、JavaEE开发三层结构
这里写图片描述
2、什么是Hibernate
Hibernate是持久化层框架之一,是一个开放源代码的ORM(Object Relational Mapping,对象关系映射)框架,它对JDBC进行了轻量级的对象封装,将POJO((JavaBean)与数据表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java开发人员可以使用面向对象的变成思想来操作数据库。

为什么用Hibernate
使用传统的JDBC开发应用系统时,如果是小型应用系统,并不觉得有什么麻烦,但是对于大型应用系统的开发,使用JDBC就会显得力不从心,例如对几十、几百张包含几十个字段的表进行插入操作时,编写的SQL语句不但很长,而且繁琐,容易出错。在读取数据时,需要写多条getXXX语句从结果集中取出各个字段的信息,不但枯燥重复而工作量非常大。
这里写图片描述
这里写图片描述
这里写图片描述
3、Hibernate框架的搭建
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
配置详解和代码
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
Customer.java

package cn.ctgu.domain;
/*CREATE TABLE customer(
        id BIGINT(32) NOT NULL PRIMARY KEY  AUTO_INCREMENT COMMENT'客户编号(主键)',
        NAME VARCHAR(32) NOT NULL COMMENT '客户名称(公司名称)',
        source VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
        industry VARCHAR(32)DEFAULT NULL COMMENT '客户所属行业',
        LEVEL VARCHAR(32) DEFAULT NULL COMMENT '客户级别',
        phone VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
        mobile VARCHAR(16) DEFAULT NULL COMMENT '移动电话'
    );*/
public class Customer {
    private Long id;

    private String name;
    private String source;
    private String industry;
    private String level;
    private String phone;
    private String mobile;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSource() {
        return source;
    }
    public void setSource(String source) {
        this.source = source;
    }
    public String getIndustry() {
        return industry;
    }
    public void setIndustry(String industry) {
        this.industry = industry;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    @Override
    public String toString() {
        return "Customer [id=" + id + ", name=" + name + "]";
    }

}

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--配置表与实体对象的关系  -->
<!-- package属性:填写一个包名,在元素内部凡是需要书写完整类名的属性,可以直接写简单类名 -->
<hibernate-mapping package="cn.ctgu.domain">
    <!-- 
        Class元素:配置实体与表的对应关系
            name:完整类名
            table:数据库表名
     -->
    <class name="Customer" table="customer">
        <!-- 
            id元素:配置主键映射的属性
                name:填写主键对应实体中的属性名
                column:填写表中的主键列名
                column(可选):填写表中对应属性的列名
                    type(可选):填写列(属性)的类型,不写的话hibernate会自动检测实体的属性类型
                        有三种写法:java类型   hibernate类型  sql类型
                        java.lang.String     string    varchar
                    not-null(可选):配置该属性(列)是否为空,默认值:false
                    length(可选):配置数据库中列的长度,默认值:使用数据库类型的最大长度(varchar最大长度为255)
         -->
        <id name="id"  column="id">
            <!-- generator:主键生成策略 -->
            <generator class="native"></generator>
        </id>
            <!-- property元素:出id之外的普通属性映射
                    name:填写属性名

                    column(可选):填写表中对应属性的列名,默认值:列名为属性名
                    type(可选):填写列(属性)的类型,不写的话hibernate会自动检测实体的属性类型
                        有三种写法:java类型   hibernate类型  sql类型
                        java.lang.String     string    varchar
                    not-null(可选):配置该属性(列)是否为空,默认值:false
                    length(可选):配置数据库中列的长度,默认值:使用数据库类型的最大长度(varchar最大长度为255)
             -->
        <!-- <property name="name" column="NAME" type="" not-null="" length=""></property>-->
        <property name="name" column="NAME" ></property>
        <property name="source" column="source"></property>
        <property name="industry" column="industry"></property>
        <property name="level" column="LEVEL"></property>
        <property name="phone" column="phone"></property>
        <property name="mobile" column="mobile"></property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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>
        <!--
        #hibernate.dialect org.hibernate.dialect.MySQLDialect
        #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
        #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
        #hibernate.connection.driver_class com.mysql.jdbc.Driver
        #hibernate.connection.url jdbc:mysql:///test
        #hibernate.connection.username gavin
        #hibernate.connection.password 
         -->
        <!-- 必选配置 5个-->

        <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库url -->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
        <!-- 数据库用户名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 数据库连接密码 -->
        <property name="hibernate.connection.password">123456</property>
        <!-- 数据库方言
            不同的数据中,sql语法略有差别,指定方言可以让hibernate框架
            在生成sql语句时,针对数据库的方言生成。
            不同的数据库方言只有细微差别,因都按sql99标准: DDL  定义语言    库、表的增删改查
                                                 DML    控制语言    事务、权限
                                                 DCL    操纵语言    增删改查
            注意:Mysql在选择方言时,选择最短的方言,因为这个引擎是通用的,而其他的引擎在解析语法可能有差别,导致我们与导入的包不匹配产生异常
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>


        <!-- 可选配置3个 -->
        <!--
         hibernate.show_sql true
         hibernate.format_sql true
          -->
          <!-- 将hibernate生成的sql语句打印到控制台 -->
        <property name="hibernate.show_sql">true</property>
          <!--将hibernate生成的sql语句格式化(语法缩进)  -->
        <property name="hibernate.format_sql">true</property>

        <!-- 
        ## auto schema export  自动到处表结构,自动建表,意思就是即使数据库中没有建立与实体相对应的表,它也不会插入数据
        失败,因为它会自动创建一个表到数据库中,然后在插入数据

        #hibernate.hbm2ddl.auto create-drop 自动建表,每次框架运行都会将所有表删除(开发环境中使用)
        #hibernate.hbm2ddl.auto create  自动建表,每次框架运行都会创建新的表,以前的表将会被覆盖,表数据会丢失(开发环境中测试使用)
        #hibernate.hbm2ddl.auto update  (推荐使用)自动生成表,如果已经存在就不会生成,如果表有变动,自动更新表(不会删除任何数据)
        #hibernate.hbm2ddl.auto validate    校验,不自动生成表,每次启动会校验数据库中表是否正确,也就是校验是否与实体匹配,校验失败则抛出异常
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>       

        <!-- 引入orm元数据
                路径书写:填写src下的路径
         -->
        <mapping resource="cn/ctgu/domain/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

APIDemo.java

package cn.ctgu.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.ctgu.domain.Customer;

//测试Hibernate框架
public class APIDemo {
    @Test
    //插入数据、事务操作
    public void fun1() {
        //Configuration功能:配置加载类,用于加载主配置,orm原数据加载
        //1、创建调用空参构造
        Configuration conf=new Configuration();
        //2、读取指定主配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件
        conf.configure();
        //3、读取指定orm元数据(hibernate1.0版本用的,那时配置文件都是properties格式的无法引入orm原数据),如果主配置中

        //已经引入映射配置,不需要手动加载
        /*conf.addResource(resourceName);
        conf.addClass(persistentClass);*/

        /*
         * 注意:
         * 1、sessionfactory负责保存和使用所有配置信息,消耗
         * 内存资源非常大
         * 2、sessionfactory属于线程安全的对象设计
         * 结论:保证在web项目中,只创建一个sessionFactory
         * 
         * */
        //4、根据配置信息,创建sessionFactory对象
        SessionFactory sessionFactory=conf.buildSessionFactory();
        //打开一个新的session对象(获得session)
        Session session=sessionFactory.openSession();

        /*
         * session对象功能:表达hibernate框架与数据库之间的连接(会话),session
         * 类似于JDBC年代的connection对象,还可以完成对数据库中数据的增删改查操作
         * session是hibernate操作数据库的核心对象
         * 
         * */
        //5、session获得操作事务的Transaction对象
        /*//获得操作事务的tx对象
        Transaction tx=session.getTransaction()*/
        //开启事务并获得操作事务的tx对象(建议使用)
        Transaction tx=session.beginTransaction();
        //------------------------
        Customer c=new Customer();
        c.setName("百度公司");
        session.save(c);//执行保存

        //------------------------
        tx.commit();//提交事务
        //tx.rollback();//回滚事务
        session.close();//释放资源
        sessionFactory.close();//释放资源
    }

    @Test
    //session的查询
    //查询id为1的customer对象
    public void fun2() {
        //Configuration功能:配置加载类,用于加载主配置,orm原数据加载
        //1、创建调用空参构造
        Configuration conf=new Configuration();
        //2、读取指定主配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件
        conf.configure();
        //3、读取指定orm元数据(hibernate1.0版本用的,那时配置文件都是properties格式的无法引入orm原数据),如果主配置中
        //已经引入映射配置,不需要手动加载
        /*conf.addResource(resourceName);
        conf.addClass(persistentClass);*/

        /*
         * 注意:
         * 1、sessionfactory负责保存和使用所有配置信息,消耗
         * 内存资源非常大
         * 2、sessionfactory属于线程安全的对象设计
         * 结论:保证在web项目中,只创建一个sessionFactory
         * 
         * */
        //4、根据配置信息,创建sessionFactory对象
        SessionFactory sessionFactory=conf.buildSessionFactory();
        //打开一个新的session对象(获得session)
        Session session=sessionFactory.openSession();

        /*
         * session对象功能:表达hibernate框架与数据库之间的连接(会话),session
         * 类似于JDBC年代的connection对象,还可以完成对数据库中数据的增删改查操作
         * session是hibernate操作数据库的核心对象
         * 
         * */
        //5、session获得操作事务的Transaction对象
        /*//获得操作事务的tx对象
        Transaction tx=session.getTransaction()*/
        //开启事务并获得操作事务的tx对象(建议使用)
        Transaction tx=session.beginTransaction();
        //------------------------
        Customer customer=session.get(Customer.class, 1l);//因为在实体中定义id为Long型所以为1l
        System.out.println(customer);
        //------------------------
        tx.commit();//提交事务
        //tx.rollback();//回滚事务
        session.close();//释放资源
        sessionFactory.close();//释放资源
    }
    @Test
    //session的修改
    //修改id为1的customer对象的name属性为谷歌
    public void fun3() {
        //Configuration功能:配置加载类,用于加载主配置,orm原数据加载
        //1、创建调用空参构造
        Configuration conf=new Configuration();
        //2、读取指定主配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件
        conf.configure();
        //3、读取指定orm元数据(hibernate1.0版本用的,那时配置文件都是properties格式的无法引入orm原数据),如果主配置中
        //已经引入映射配置,不需要手动加载
        /*conf.addResource(resourceName);
        conf.addClass(persistentClass);*/

        /*
         * 注意:
         * 1、sessionfactory负责保存和使用所有配置信息,消耗
         * 内存资源非常大
         * 2、sessionfactory属于线程安全的对象设计
         * 结论:保证在web项目中,只创建一个sessionFactory
         * 
         * */
        //4、根据配置信息,创建sessionFactory对象
        SessionFactory sessionFactory=conf.buildSessionFactory();
        //打开一个新的session对象(获得session)
        Session session=sessionFactory.openSession();

        /*
         * session对象功能:表达hibernate框架与数据库之间的连接(会话),session
         * 类似于JDBC年代的connection对象,还可以完成对数据库中数据的增删改查操作
         * session是hibernate操作数据库的核心对象
         * 
         * */
        //5、session获得操作事务的Transaction对象
        /*//获得操作事务的tx对象
        Transaction tx=session.getTransaction()*/
        //开启事务并获得操作事务的tx对象(建议使用)
        Transaction tx=session.beginTransaction();
        //---------增删改查操作,--------------
        //1、获得要修改的对象
        Customer c=session.get(Customer.class, 1l);
        //2、修改
        c.setName("谷歌");
        //3、执行update
        session.update(c);

        //------------------------
        tx.commit();//提交事务
        //tx.rollback();//回滚事务
        session.close();//释放资源
        sessionFactory.close();//释放资源
    }
    @Test
    //session的查询
    //删除id为1的customer对象
    public void fun4() {
        //Configuration功能:配置加载类,用于加载主配置,orm原数据加载
        //1、创建调用空参构造
        Configuration conf=new Configuration();
        //2、读取指定主配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件
        conf.configure();
        //3、读取指定orm元数据(hibernate1.0版本用的,那时配置文件都是properties格式的无法引入orm原数据),如果主配置中
        //已经引入映射配置,不需要手动加载
        /*conf.addResource(resourceName);
        conf.addClass(persistentClass);*/

        /*
         * 注意:
         * 1、sessionfactory负责保存和使用所有配置信息,消耗
         * 内存资源非常大
         * 2、sessionfactory属于线程安全的对象设计
         * 结论:保证在web项目中,只创建一个sessionFactory
         * 
         * */
        //4、根据配置信息,创建sessionFactory对象
        SessionFactory sessionFactory=conf.buildSessionFactory();
        //打开一个新的session对象(获得session)
        Session session=sessionFactory.openSession();

        /*
         * session对象功能:表达hibernate框架与数据库之间的连接(会话),session
         * 类似于JDBC年代的connection对象,还可以完成对数据库中数据的增删改查操作
         * session是hibernate操作数据库的核心对象
         * 
         * */
        //5、session获得操作事务的Transaction对象
        /*//获得操作事务的tx对象
        Transaction tx=session.getTransaction()*/
        //开启事务并获得操作事务的tx对象(建议使用)
        Transaction tx=session.beginTransaction();
        //---------增删改查操作--------------
        //1、获得要修改的对象
        Customer c=session.get(Customer.class, 1l);
        //2、调用delete删除对象
        session.delete(c);

        //------------------------
        tx.commit();//提交事务
        //tx.rollback();//回滚事务
        session.close();//释放资源
        sessionFactory.close();//释放资源
    }
}

HibernateUtils.java(工具类)

package cn.ctgu.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static SessionFactory sessionFactory;
    static {
        //1、创建调用空参构造
                Configuration conf=new Configuration();
                //2、读取指定主配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件
                conf.configure();
                //3、根据配置信息,创建sessionFactory对象
                sessionFactory=conf.buildSessionFactory();
    }
    //获得session=>获得全新session
    public static Session openSession() {
        //4、打开一个新的session对象(获得session)
        Session session=sessionFactory.openSession();
        return session;
    }
    //获得session=>获得与线程绑定的session
    public static Session getCurrentSession() {
                //打开一个新的session对象(获得session)
                Session session=sessionFactory.getCurrentSession();
                return session;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值