专栏首页安卓圈Hibernate文件配置

Hibernate文件配置

ORM : 对象关系映射

映射需要通过XML的配置文件来完成,这个配置文件尽量统一(xxx.hbm.xml) Hibernate核心的配置:必须的配置、可选的配置、映射文件的引入

Configuration的作用:1.加载核心配置文件 2.加载映射文件 SessionFactory:内部维护了Hibernate的连接池和Hibernate的二级缓存,是线程安全的对象,一个项目创建一个对象即可 Session:代表Hibernate和数据库的连接对象,不是线程安全的,所以不能定义成全局的变量 Transaction:Hibernate中管理事务的对象

文件结构

工具类

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

public class HibernateUtils {
    public static final Configuration cfg;
    public static final SessionFactory sf;

    static {
        cfg = new Configuration().configure();
        sf = cfg.buildSessionFactory();
    }

    public static Session openSession() {
        return sf.openSession();
    }
}

对象类

public class Customer {
    private int id;
    private String name;
    private String source;
    private String industry;
    private String level;
    private String phone;
    private String mobile;

    public int getId() {
        return id;
    }

    public void setId(int 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 + '\'' +
                ", source='" + source + '\'' +
                ", industry='" + industry + '\'' +
                ", level='" + level + '\'' +
                ", phone='" + phone + '\'' +
                ", mobile='" + mobile + '\'' +
                '}';
    }
}

映射配置文件

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!--建立类与表的映射-->
    <!--如果类中的属性名和表中的字段名一直,column可以省略-->
    <class name="com.jinke.hibernate.Customer" table="customer">
        <!--建立类中的属性与表中的主键对应-->
        <id name="id" column="id">
            <generator class="native"/>
        </id>

        <!--建立类中的普通属性和标的字段的对应-->
        <property name="name" column="name" length="32" type="string" not-null="true" unique="true"/>
        <property name="source" column="source"/>
        <property name="industry" column="industry"/>
        <property name="level" column="level"/>
        <property name="phone" column="phone"/>
        <property name="mobile" column="mobile"/>
    </class>
</hibernate-mapping>

总配置类

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spring_database?characterEncoding=utf8
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>
        <!--配置Hibernate的方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!--可选配置===============-->
        <!--打印sql-->
        <property name="hibernate.show_sql">true</property>
        <!--格式化sql-->
        <property name="hibernate.format_sql">true</property>
        <!--自动创建表-->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!--映射文件的引用===============-->
        <mapping resource="com/jinke/hibernate/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

测试类

import com.jinke.hibernate.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class HibernateDemo1 {

    @Test
    public void demo() {
       /* //1.加载hibernate核心配置文件
        Configuration configuration = new Configuration().configure();
        //2.创建一个sessionfactory对象:类似于jdbc中连接池
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        //3.通过sessionFactory获取到session对象:类似于jdbc中connection
        Session session = sessionFactory.openSession();*/

        Session session = HibernateUtils.openSession();
        //4.手动开启事务
        Transaction transaction = session.beginTransaction();
        //5.编写代码

        Customer customer = new Customer();
        customer.setName("王东");
        //保存
        session.save(customer);


        //6.事务提交
        transaction.commit();
        //7.资源释放
        session.close();
        /*sessionFactory.close();*/
    }

    /**
     * get方法:(一般用这种)
     * 采用立即加载,执行到这行代码的时候,马上发送SQL语句去查询
     * 查询后返回的是真是对象本身
     * 查询一个找不到的对象会返回null
     * <p>
     * load方法:
     * 采用延迟加载(懒加载),执行到这行代码的时候,不会发送SQL语句,当真正使用项目的时候才会发送SQL语句
     * 查询后返回的是代理对象
     * 查询一个找不到的对象会抛出一个异常
     */
    @Test
    //查询
    public void demo2() {
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //使用get方法
        Customer customer = session.get(Customer.class, 1);
        System.out.println(customer);

        //使用load方法
        /*Customer load = session.load(Customer.class, 2);
        System.out.println(load);*/

        tx.commit();
        session.close();
    }

    @Test
    //修改
    public void demo3() {
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();

        //直接创建对象,进行修改
        /*Customer customer = new Customer();
        customer.setId(1);
        customer.setName("李达");
        session.update(customer);*/
        //先查询,再修改(一般用这种)
        Customer customer = session.get(Customer.class, 1);
        customer.setName("张三");
        session.update(customer);

        tx.commit();
        session.close();
    }

    @Test
    //删除
    public void demo4() {
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();

        //直接创建对象,进行删除
        /*Customer customer = new Customer();
        customer.setId(1);
        session.delete(customer);*/
        //先查询,再删除(一般用这种)  级联删除
        Customer customer = session.get(Customer.class, 1);
        session.delete(customer);

        tx.commit();
        session.close();
    }

    @Test
    //保存或更新
    public void demo5() {
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();

        Customer customer = new Customer();
        /*customer.setName("李飞");
        session.saveOrUpdate(customer);*/

        customer.setId(3);
        customer.setName("如花");
        session.saveOrUpdate(customer);

        tx.commit();
        session.close();
    }

    @Test
    //查询所有
    public void demo6() {
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //接收HQL:hibernate query language 面向对象的查询语言
        Query query = session.createQuery("from Customer");
        List<Customer> list = query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }

        //接收sql:
        NativeQuery sqlQuery = session.createSQLQuery("select * from customer");
        List<Object[]> sqlList = sqlQuery.list();
        for (Object[] objects : sqlList) {
            System.out.println(Arrays.toString(objects));
        }

        tx.commit();
        session.close();
    }
}

结果在MySql Workbench里看

本文分享自微信公众号 - 安卓圈(gh_df75572d44e4)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java面试题及答案解析

    Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:

    yaohong
  • 细说log4j之log4j 1.x

    官网:http://logging.apache.org/log4j/1.2/manual.html

    2Simple
  • 细说shiro之四:在web应用中使用shiro

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。 而且,由于shiro-web组件使用apac...

    2Simple
  • mvn打包时添加日期参数

    maven打包时想添加日期参数,如:将"xxx.jar"打包为"xxx-yyyyMMdd.jar"这样的格式。如何实现?

    2Simple
  • 细说shiro之三:在独立应用中使用shiro

    1. 下载 在非Web环境的独立应用中使用Shiro时,只需要shiro-core组件。 在Maven项目中的依赖配置如下:

    2Simple
  • 细说shiro之五:在spring框架中集成shiro

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。 在此,以使用log4j为日志实现为例:

    2Simple
  • 细说shiro之二:组件架构

    Shiro主要组件包括:Subject,SecurityManager,Authenticator,Authorizer,SessionManager,Cach...

    2Simple
  • 细说shiro之一:shiro简介

    一. Shiro是什么 Shiro是一个Java平台的开源权限框架,用于认证和访问授权。具体来说,满足对如下元素的支持:

    2Simple
  • HTTP -- 请求/响应 结构

      2.Content- Type:表示属于什么类型文档。一般默认是 text/plain.通常指定为 text/html

    小蔚
  • 细说shiro之六:session管理

    我们先来看一下shiro中关于Session和Session Manager的类图。

    2Simple

扫码关注云+社区

领取腾讯云代金券