• JAVA框架:hibernate


    一:介绍

    hibernate是java中的dao层,即和持久层打交道。底层也是数据库驱动、连接等。他也有orm,类和数据库的映射。

    二、部署

    下载地址:https://sourceforge.net/projects/hibernate/?source=typ_redirect

    1)包介绍:

     2:)创建数据库

    1 create table customer (id BIGINT NOT NULL AUTO_INCREMENT primary key,name varchar(25),ipone_number varchar(40) );

    3)创建hibernate配置文件

      1)javabean文件 

     1 package jd.com.hibernatepro;
     2 
     3 public class Customer {
     4     public  Customer(){};
     5     private Long id;
     6     private String name;
     7     private String ipone_number;
     8 
     9     public void setId(Long id) {
    10         this.id = id;
    11     }
    12 
    13     public void setIpone_number(String ipone_number) {
    14         this.ipone_number = ipone_number;
    15     }
    16 
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20 
    21     public Long getId() {
    22         return id;
    23     }
    24 
    25     public String getIpone_number() {
    26         return ipone_number;
    27     }
    28 
    29     public String getName() {
    30         return name;
    31     }
    32 }

       2)创建映射文件(Customer.hbm.xml)

        名字没有强制要求,但是一般会起类名.hbm(hibernate mapping).xml

        配置文件内容:

     1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping>
     6     <!--配置类和表结构映射-->
     7     <class name="jd.com.hibernatepro.Customer" table="customer">
     8         <!--配置id name是javabean属性column是表的属性 属性纸一样的话可以省略column -->
     9         <id name="id"  column="id">
    10             <!--主键生成策略 native主键采取的本地策略 递增策略-->
    11             <!--注意语法 xml 不是<generator></generator-->
    12             <generator class="native"/>
    13         </id>
    14         <!--配置其他属性-->
    15         <property name="name"/>
    16         <property name="ipone_number"/>
    17     </class>
    18 
    19 </hibernate-mapping>

    其中约束:

    从WEB-INF/lib/hibernate-core-5.0.7.Final.jar 中的拷贝

    其中

      1是hibernate的核心配置文件的约束查找文件。

       2是映射配置文件的约束查找文件。

    我们这边选择3.0的

      3)创建核心配置文件: 文件名称必须是hibernate.cfg 

      约束拷贝如上。

       内容:

     1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 <!--记住先配置session-factory标签一个数据库对应一个session-factory标签-->
     6 <hibernate-configuration>
     7     <session-factory>
     8         <!--必须要配置的参数是5个  4个是连接数据库串 1个是数据库方言-->
     9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    10         <property name="hibernate.connection.url">jdbc:mysql://192.168.147.145:3306/day13</property>
    11         <property name="hibernate.connection.username">admin</property>
    12         <!--方言 告诉hibernate使用是 那个数据库类型-->
    13         <property name="hibernate.connection.password">123</property>
    14         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    15         <mapping resource="jd/com/hibernatepro/Customer.hbm.xml"/>
    16     </session-factory>
    17 </hibernate-configuration>

     需要注意:

    引用配置配置文件:<mapping resource="jd/com/hibernatepro/Customer.hbm.xml"/> 在windows的时候是转义符需要改成斜杠/。

    还有核心配置文件的位置需要在src下面。

     hibernate配置完了。

    4)测试代码:

    使用hibernate的步骤:

    1          * 使用hibernate的步骤:
    2          * 1)先加载配置文件。
    3          *2)创建sessionFactory对象,生成session对象(工厂方法主要是生成对象)。
    4          * 3)创建session对象(数据库会话对象)
    5          * 4)开启事务。
    6          * 5)编写保存代码。
    7          * 6)提交事务。
    8          * 7)释放资源。

    代码:

     1 package jd.com.test;
     2 
     3 
     4 import jd.com.hibernatepro.Customer;
     5 import org.hibernate.Session;
     6 import org.hibernate.SessionFactory;
     7 import org.hibernate.Transaction;
     8 import org.hibernate.cfg.Configuration;
     9 import org.junit.Test;
    10 
    11 
    12 public class TT {
    13     @Test
    14     public void  test(){
    15         /**
    16          * 使用hibernate的步骤:
    17          * 1)先加载配置文件。
    18          *2)创建sessionFactory对象,生成session对象(工厂方法主要是生成对象)。
    19          * 3)创建session对象(数据库会话对象)
    20          * 4)开启事务。
    21          * 5)编写保存代码。
    22          * 6)提交事务。
    23          * 7)释放资源。
    24          */
    25         //先加载配置文件。
    26         Configuration configuration=new Configuration();
    27         //加载配置文件
    28         configuration.configure();
    29         //创建sessionFactory对象
    30         SessionFactory sessionFactory=configuration.buildSessionFactory();
    31         //创建session对象
    32         Session session=sessionFactory.openSession();
    33 
    34         //开启事务。
    35         Transaction transaction=session.beginTransaction();
    36 
    37         //编写保存代码
    38         Customer customer=new Customer();
    39         customer.setIpone_number("110");
    40         customer.setName("tom");
    41         //数据保存
    42         session.save(customer);
    43         //提交事务。
    44         transaction.commit();
    45 
    46         //释放资源
    47         session.close();
    48 
    49     }
    50 
    51 }

     查看数据库:

    1 mysql> select * from  customer;
    2 +----+------+--------------+
    3 | id | name | ipone_number |
    4 +----+------+--------------+
    5 |  1 | tom  | 110          |
    6 +----+------+--------------+
    7 1 row in set (0.00 sec)

    测试完成。

     核心配置文件可选配置:

    sql语句控制台和日志输出(SQL in log and console)。

    1         <!--可选配置-->
    2         <!--输出sql语句-->
    3         <property name="hibernate.show_sql">true</property>
    4         <!--sql语句格式化-->
    5         <property name="hibernate.format_sql">true</property>

     

    创建表和添加值以及添加字段。

    hibernate.hbm2ddl.auto  update 如果表不存在他创建,如果存在插入值。可以添加额外字段。

    添加额外字段需要在映射文件和javabean里添加相应的配置。

    1         <!--update-->
    2         <property name="hibernate.hbm2ddl.auto">update</property>

     这个比较常用。

    不要用

    hibernate.hbm2ddl.auto create-drop 无论存不存在都建 在删。
    hibernate.hbm2ddl.auto create 每次都创建 存在先drop在创建。会把之前数据和表删除。。

    三、方法介绍

    sessionFactory 和session。

    SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

    所以在项目中sessionfactory不需要释放。一个数据库一个sessionfactory。

    基于上面写一个工具类:

     1 package jd.com.test;
     2 
     3 import org.hibernate.Session;
     4 import org.hibernate.SessionFactory;
     5 import org.hibernate.cfg.Configuration;
     6 
     7 public class hibernateUtils {
     8    private final  static Configuration CONFIURATION;
     9    private  final  static SessionFactory SESSIONFACTORY;
    10    static {
    11         CONFIURATION=new Configuration().configure();
    12         SESSIONFACTORY=CONFIURATION.buildSessionFactory();
    13     }
    14     public  static Session getSession(){
    15         return  SESSIONFACTORY.openSession();
    16     }
    17 }

     session:注意的是Session对象是非线程安全的。所有每次操作就创建一个session 使用完就释放!

    session的方法:

            * save(obj)    保存数据。
            * delete(obj)     删除数据。
            * get(Class,id)         获取数据。
            * update(obj)           更新数据。
            * saveOrUpdate(obj)                    -- 保存或者修改(如果没有数据,保存数据。如果有,修改数据)
            * createQuery()                       -- HQL语句的查询的方式

    我们在操作数据的时候,要遵循先查询在删除、更新等操作。

     1     @Test
     2     public void  Select(){
     3         Session session=hibernateUtils.getSession();
     4         Transaction transaction=session.beginTransaction();
     5         Customer customer=new Customer();
     6         //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。
     7         Customer c=session.get(Customer.class,2L);
     8         System.out.println(c);
     9         //提交事务。
    10         transaction.commit();
    11 
    12         //释放资源
    13         session.close();
    14     }
    15 
    16     @Test
    17     public void  Del(){
    18         Session session=hibernateUtils.getSession();
    19         Transaction transaction=session.beginTransaction();
    20         Customer customer=new Customer();
    21         //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。
    22         Customer c=session.get(Customer.class,3L);
    23         session.delete(c);
    24         //提交事务。
    25         transaction.commit();
    26 
    27         //释放资源
    28         session.close();
    29     }
    30     @Test
    31     public void  Update(){
    32         Session session=hibernateUtils.getSession();
    33         Transaction transaction=session.beginTransaction();
    34         Customer customer=new Customer();
    35         //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。
    36         Customer c=session.get(Customer.class,1L);
    37         c.setName("ok");
    38         session.update(c);
    39         //提交事务。
    40         transaction.commit();
    41 
    42         //释放资源
    43         session.close();
    44     }
    45     @Test
    46     public void  SavUp(){
    47         Session session=hibernateUtils.getSession();
    48         Transaction transaction=session.beginTransaction();
    49         Customer customer=new Customer();
    50         //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。
    51         Customer c=new Customer();
    52         c.setIpone_number("120");
    53         c.setName("oop");
    54         session.saveOrUpdate(c);
    55         //提交事务。
    56         transaction.commit();
    57         //释放资源
    58         session.close();
    59     }
    60     @Test
    61     public void  QuerY(){
    62         Session session=hibernateUtils.getSession();
    63         Transaction transaction=session.beginTransaction();
    64         Query query=session.createQuery("from Customer");
    65         List customers=query.list();//查询所有数据
    66         for (Object c:customers
    67              ) {
    68             System.out.println(c);
    69         }
    70         //提交事务。
    71         transaction.commit();
    72         //释放资源
    73         session.close();
    74     }
    75 }
  • 相关阅读:
    自我介绍
    工作流
    spring框架
    关于建立内部会议讨论规范的想法
    论文第3章:移动绘图平台的架构设计
    迭代器、推导式、函数式编程学习笔记
    Python装饰器学习(九步入门)
    Inkpad绘图原理浅析
    从零开始创建一个插件
    Entity Framework的启动速度优化
  • 原文地址:https://www.cnblogs.com/evilliu/p/8743414.html
Copyright © 2020-2023  润新知