zoukankan      html  css  js  c++  java
  • hibernate4入门

    hiernate4入门

      【实战】本文将讲述hibernate4的入门,我写是以实用入门为主,不作过多展开,我写东西如果开头标了实战二字,必然会保证读者能够获取源代码并且能够按要求做的话一定能跑起来,否则没有意义。

    【环境说明:】 jdk8,eclipse4.7,hibernate4.3.11,mysql。

    一、什么是ORM

      orm是object relation mapping的一个缩写,对象关系映射,常见的ORM框架有mybatis,hibernate,此处介绍hibernate,暂时不作比较,从我个人理解来看,java程序员在后台编写代码的过程当中,只有在持久层进行的工作是非OOP思想的,这个时候如果有办法让dao层也能够保持这样一种编写习惯无疑是挺舒服的,hibernate要帮助我们完成的核心事情就是这一件,其次就是事务管理,以及缓存之类的东西。

    二、hibernate入门实战

      此处我会使用maven来构建项目,同时会使用父子工程的方式来编写,下面的一些步骤我会以图文说明。

    1.新建一个maven父项目

        

     

     

     

    注意:由于我们需要将其用作父工程,所以需要修改pom.xml看图。

    如果你的项目报红色的×,或者jdk版本为1.5,你需要将maven项目update一下即可,maven项目红×问题经常会有,后面我会专门为此写一篇博客说明。

    另外我们指定一下项目编译版本为1.8,编码为UTF-8,pom.xml作出如下修改。

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     3   <modelVersion>4.0.0</modelVersion>
     4 
     5   <groupId>com.qiudaozhang</groupId>
     6   <artifactId>hibernate-parent</artifactId>
     7   <version>0.0.1-SNAPSHOT</version>
     8   <packaging>pom</packaging>
     9 
    10   <name>hibernate-parent</name>
    11   <url>http://maven.apache.org</url>
    12 
    13   <properties>
    14     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    15     <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version>
    16     <java.version>1.8</java.version>
    17   </properties>
    18 
    19   <dependencies>
    20   </dependencies>
    21   
    22   <build>
    23   
    24        <plugins>  
    25         <plugin>  
    26             <groupId>org.apache.maven.plugins</groupId>  
    27             <artifactId>maven-compiler-plugin</artifactId>  
    28             <version>${maven-compiler-plugin.version}</version>  
    29             <configuration>  
    30                 <source>${java.version}</source>  
    31                 <target>${java.version}</target>  
    32                 <encoding>${project.build.sourceEncoding}</encoding>  
    33             </configuration>  
    34         </plugin>  
    35     </plugins>  
    36   </build>
    37 </project>

    2.引入hibernate的依赖,mysql的依赖。

      修改pom.xml如下:

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     3   <modelVersion>4.0.0</modelVersion>
     4 
     5   <groupId>com.qiudaozhang</groupId>
     6   <artifactId>hibernate-parent</artifactId>
     7   <version>0.0.1-SNAPSHOT</version>
     8   <packaging>pom</packaging>
     9 
    10   <name>hibernate-parent</name>
    11   <url>http://maven.apache.org</url>
    12 
    13   <properties>
    14     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    15     <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version>
    16     <java.version>1.8</java.version>
    17     <hibernate.version>4.3.11.Final</hibernate.version>
    18     <mysql.version>5.1.38</mysql.version>
    19   </properties>
    20 
    21   <dependencies>
    22         <dependency>
    23             <groupId>org.hibernate</groupId>
    24             <artifactId>hibernate-core</artifactId>
    25             <version>${hibernate.version}</version>
    26         </dependency>
    27     <dependency>
    28         <groupId>mysql</groupId>
    29         <artifactId>mysql-connector-java</artifactId>
    30         <version>${mysql.version}</version>
    31     </dependency>
    32         
    33   </dependencies>
    34   
    35   <build>
    36   
    37        <plugins>  
    38         <plugin>  
    39             <groupId>org.apache.maven.plugins</groupId>  
    40             <artifactId>maven-compiler-plugin</artifactId>  
    41             <version>${maven-compiler-plugin.version}</version>  
    42             <configuration>  
    43                 <source>${java.version}</source>  
    44                 <target>${java.version}</target>  
    45                 <encoding>${project.build.sourceEncoding}</encoding>  
    46             </configuration>  
    47         </plugin>  
    48     </plugins>  
    49   </build>
    50 </project>

    3  新建maven子项目(因为我会以多个工程的方式来描述它的知识点,尽量不让描述问题混乱,虽然有点啰嗦,但是其实好处很多)

      

     

     子项目可以直接使用父项目的依赖,后面我建hibernate项目就不需要重复写依赖了。

    按照maven约定,我们需要有专门放配置文件的地方,如果你的没有请如下图操作。

     

     然后填写

     4 编写hibernate的核心配置文件hibernate.cfg.xml将其放在resources目录下。

    核心需要配置的就是会话工厂,里面有几样核心内容配置:

    1. 数据库连接的描述信息
    2. sql是否打印,是否格式化
    3. 是否根据实体类生成表。

     具体的配置内容如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     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 <hibernate-configuration>
     6     <session-factory>
     7         <!-- 一、数据库连接相关信息 -->
     8         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
     9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    10         <property name="hibernate.connection.username">root</property>
    11         <property name="hibernate.connection.password">111111</property>
    12         <!-- 二、SQL显示与格式化 -->
    13         <!-- 显示SQL语句 -->
    14         <property name="hibernate.show_sql">true</property>
    15         <!-- 格式化SQL -->
    16         <property name="hibernate.format_sql">true</property>
    17         <!-- 三、 是否根据javabean生成数据库的实体类,前提你得有这个数据库 -->
    18         <!-- 常用的值是create,update,或者不配置, create每次回删除重建,update是有修改的话才会重建,第一次我们可以使用create,后期一般就不会再配置 
    19             了。 -->
    20         <property name="hibernate.hbm2ddl.auto">create</property>
    21     </session-factory>
    22 </hibernate-configuration>

    5 编写javabean,此处就以一个Users为例。

     1 package com.qiudaozhang.model;
     2 
     3 import java.io.Serializable;
     4 import java.util.Date;
     5 
     6 public class Users implements Serializable{
     7 
     8     /**
     9      * 
    10      */
    11     private static final long serialVersionUID = -7790992747243804816L;
    12 
    13     private Integer id;
    14     
    15     private String username;
    16     
    17     private String password;
    18     
    19     private Date birthday;
    20 
    21     public Integer getId() {
    22         return id;
    23     }
    24 
    25     public void setId(Integer id) {
    26         this.id = id;
    27     }
    28 
    29     public String getUsername() {
    30         return username;
    31     }
    32 
    33     public void setUsername(String username) {
    34         this.username = username;
    35     }
    36 
    37     public String getPassword() {
    38         return password;
    39     }
    40 
    41     public void setPassword(String password) {
    42         this.password = password;
    43     }
    44 
    45     public Date getBirthday() {
    46         return birthday;
    47     }
    48 
    49     public void setBirthday(Date birthday) {
    50         this.birthday = birthday;
    51     }
    52     
    53     
    54 }

    6 在于这个Users同包之下书写一个hbm文件,取名为Users.hbm.xml,建议遵守约定,不要玩个性随意改名字。

    其注意的细节点直接看下面的代码:
     

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <hibernate-mapping>
     5     <!--     下面的class元素用来描述java实体类与数据库表之间的关系 -->
     6     <!--     class属性说明:
     7                 name:编写实体类的全限定类名,大家应该能想到是使用反射方式来获取它的信息。
     8                 table:数据库表名。
     9      -->
    10     <class name="com.qiudaozhang.model.Users" table="users">
    11         <!--         id,必须说明字段当中哪个字段与数据库的主键对应
    12                         属性说明:
    13                             name:javabean中要对应数据库逐渐的字段
    14                             type:javabean主键字段对应的数据类型
    15                         内部元素说明:
    16                             column:对应数据库主键的列
    17                                 name:数据库主键列名
    18                             generator:主键的策略,这里使用assgined是手工赋值的意思,有很多种,我们暂时就使用它。
    19          -->
    20         <id name="id" type="java.lang.Integer">
    21             <column name="ID" />
    22             <generator class="assigned" />
    23         </id>
    24         <!--         property元素用来描述其它普通字段与数据库列的关系,name,type等于上面描述的内容同样含义 -->
    25         <property name="username" type="java.lang.String">
    26             <column name="USERNAME" />
    27         </property>
    28         <property name="password" type="java.lang.String">
    29             <column name="PASSWORD" />
    30         </property>
    31         <property name="birthday" type="java.util.Date">
    32             <column name="BIRTHDAY" />
    33         </property>
    34     </class>
    35 </hibernate-mapping>

    7 创建一个数据库hibernate。

    8 将书写的Users.hbm.xml加入到前面配置的核心hibernate.cfg.xml当中,否则无法生效,修改后的hibernate.cfg.xml如下

     1 <?xml version="1.0" encoding="UTF-8"?>
     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 <hibernate-configuration>
     6     <session-factory>
     7         <!-- 一、数据库连接相关信息 -->
     8         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
     9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    10         <property name="hibernate.connection.username">root</property>
    11         <property name="hibernate.connection.password">111111</property>
    12         <!-- 二、SQL显示与格式化 -->
    13         <!-- 显示SQL语句 -->
    14         <property name="hibernate.show_sql">true</property>
    15         <!-- 格式化SQL -->
    16         <property name="hibernate.format_sql">true</property>
    17         <!-- 三、 是否根据javabean生成数据库的实体类,前提你得有这个数据库 -->
    18         <!-- 常用的值是create,update,或者不配置, create每次回删除重建,update是有修改的话才会重建,第一次我们可以使用create,后期一般就不会再配置 
    19             了。 -->
    20         <property name="hibernate.hbm2ddl.auto">create</property>
    21         
    22         <!-- 引入配置的hbm文件 -->
    23         <mapping resource="com/qiudaozhang/model/Users.hbm.xml"/>
    24     </session-factory>
    25 </hibernate-configuration>

    9 编写测试类(为了方便测试,请添加一下junit4),需要注意的是,hibernate4获取会话工厂有点不一样,而且官方文档是错误的,所以大家要注意一下。

     1 package com.qiudaozhang.test;
     2 
     3 import java.util.Date;
     4 
     5 import org.hibernate.Session;
     6 import org.hibernate.SessionFactory;
     7 import org.hibernate.Transaction;
     8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
     9 import org.hibernate.cfg.Configuration;
    10 import org.junit.Test;
    11 
    12 import com.qiudaozhang.model.Users;
    13 
    14 public class Test1 {
    15 
    16     @Test
    17     public void helloHibernate() {
    18         // 1 获取核心的配置对象
    19         Configuration cfg = new Configuration();
    20         // 2 调用配置方法让其读取我们配置的hibernate.cfg.xml
    21         cfg.configure();
    22         // 3 获取一个服务注册建造者对象
    23         StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
    24                 .applySettings(cfg.getProperties());
    25         // 4 创建会话工厂
    26         SessionFactory sessionFactory = null;
    27         sessionFactory = cfg.buildSessionFactory(builder.build());
    28         // 5 获取会话
    29         Session session = null;
    30         session = sessionFactory.openSession();
    31         // 6 获取事务对象
    32         Transaction tx = session.beginTransaction();
    33         // 7 准备一个javabean
    34         Users u = new Users();
    35         u.setId(1008);
    36         u.setUsername("王菲");
    37         u.setPassword("123123");
    38         u.setBirthday(new Date());
    39         // 8 通过会话保存这个对象
    40         session.save(u);
    41         // 9 提交事务
    42         tx.commit();
    43         // 10 关闭资源
    44         if(session != null && session.isOpen()) {
    45             session.close();
    46         }
    47         
    48         if(sessionFactory != null) {
    49             sessionFactory.close();
    50         }
    51                 
    52     }
    53     
    54     
    55 }

    执行测试方法,在数据库中如果你看到了“王菲”,那就代表成功了,我没有对大家每个地方有多个选择的地方做出说明,在学习之处过多让你选择,你的学习将奇慢无比,后面我们会展开细说。

    代码在码云上可直接下载,地址: 项目下载

  • 相关阅读:
    在工作中你可能会遇见的事情哈
    原生js判断某个区域的滚动条滚动到了底部
    震惊p div 标签 可以编辑高度随内容的编辑而发生变化
    Codeforces Round #628 (Div. 2) B. CopyCopyCopyCopyCopy(Set)
    Codeforces Round #628 (Div. 2) A. EhAb AnD gCd(LCM & GCD)
    Codeforces Round #613 (Div. 2) C. Fadi and LCM(LCM & GCD)
    Codeforces Round #613 (Div. 2) B. Just Eat It!(前缀和)
    Codeforces Round #613 (Div. 2) A. Mezo Playing Zoma(逻辑)
    GPLT L2-006 树的遍历(二叉树)
    poj 3278 Catch That Cow(记忆化广度优先搜索)
  • 原文地址:https://www.cnblogs.com/qiudaozhang/p/8433428.html
Copyright © 2011-2022 走看看