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 }
原文地址:https://www.cnblogs.com/evilliu/p/8743414.html