【Hibernate】02 快速入门

时间:2020-05-10 12:15:56   收藏:0   阅读:40

环境搭建 :

Windo7 x64 +

IDEA 2018+

JDK 8+

Maven 3.0+

MySQL 5.0+


创建Hibernate工程:

技术分享图片

 

导入依赖坐标

<dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.15.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.5.6-Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.2.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.1.3.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.27.0-GA</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.4.1.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-jta_1.1_spec -->
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jta_1.1_spec</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/antlr/antlr -->
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.15.Final</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

 

编写数据库映射的实体类

- 如果数据库没有这张数据表,Hibernate会进行创建

- 如果有了也没关系,Hibernate会进行更新

- 不同于Myabtis的包目录,Hibernate的包目录使用entity实体来表示

package cn.dai.entity;

/**
 * @author ArkD42
 * @file Hibernate
 * @create 2020 - 05 - 09 - 21:47
 */

public class User {
    private Integer user_id;
    private String user_name;
    private String user_password;

    public User() {
    }

    public User(Integer user_id, String user_name, String user_password) {
        this.user_id = user_id;
        this.user_name = user_name;
        this.user_password = user_password;
    }

    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getUser_password() {
        return user_password;
    }

    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }

    @Override
    public String toString() {
        return "User{" +
                "user_id=" + user_id +
                ", user_name=‘" + user_name + ‘\‘‘ +
                ", user_password=‘" + user_password + ‘\‘‘ +
                ‘}‘;
    }
}

 

在建立完数据库映射类和配置、测试之后

IDEA会自动帮我们表示一些信息,让其看起来是一个ORM类

技术分享图片

 

使用配置文件描述我们的数据表&实体类的关系

编写映射配置文件

命名规范以实体类的类名命名,首字母大小写皆可

【不推荐把此配置文件放在实体类包下,Maven会造成导出资源过滤问题】

技术分享图片

配置约束信息:

<?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"
>

声明映射元素:

package属性:我们要映射的类的所在包的位置

<?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    package="cn.dai.entity" >

</hibernate-mapping>

指明具体的实体映射类和映射的数据表名

name属性:指向映射类的位置

table属性:指向数据库中的表名

<?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    package="cn.dai.entity" >

   <class name="cn.dai.entity.User" table="user" >
       
   </class>


</hibernate-mapping>

设置主键字段

id元素表示主键

name表示类的属性名称【有辅助提示】

column表示对应的数据表字段

generator 表示主键的增长策略

class的值native 表示策略为自增

<?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    package="cn.dai.entity" >

   <class name="cn.dai.entity.User" table="user" >
       <id name="user_id" column="user_id" >
           <generator class="native" />
       </id>
      
   </class>


</hibernate-mapping>

设置其他字段映射

<?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    package="cn.dai.entity" >

   <class name="cn.dai.entity.User" table="user" >
       
       <id name="user_id" column="user_id" >
           <generator class="native" /> 
       </id>
       

    <property name="user_name" column="user_name" /> <property name="user_password" column="user_password" /> </class> </hibernate-mapping>

 

创建Hibernate核心配置文件:

技术分享图片

- 文件名称只能是【hibernate.cfg.xml

- 文件的位置必须在classpath的根路径下

引入配置约束

<?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>
 

</hibernate-configuration>

配置会话工厂

<?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>

    </session-factory>

</hibernate-configuration>

编写连接参数

<?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="connection.url">jdbc:mysql:///ssm?serverTimezone=Asia/Shanghai</property>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

    </session-factory>

</hibernate-configuration>

配置Hibernate参数信息和映射文件位置

hibernate.show_sql

  表示 执行时输出SQL语句的样子

hibernate.format_sql

  表示 SQL语句会进行格式工整化 【否则输出直接一行一把梭】

hibernate.hbm2ddl.auto

  表示 Hibernate会自动执行DDL语句,用UPDATE表示,没有就创建表,有则更新表

hibernate.dialect

  表示SQL方言,就是每一个数据库厂商的每一个版本都有略微不同的语法

  这个根据Hibernate提供的方言和我们实际安装的数据库版本相匹配即可

  【匹配原则,按数据库的版本为主语法】

mapping

  类似Mybatis的映射器配置,注意这里是直接写文件名即可

  如果是多级目录,要使用的是斜杠分隔,不是按包结构用点分隔

<?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="connection.url">jdbc:mysql:///ssm?serverTimezone=Asia/Shanghai</property>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>

        <mapping resource="user.hbm.xml" />
    </session-factory>

</hibernate-configuration>

 

编写测试代码

import cn.dai.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author ArkD42
 * @file Hibernate
 * @create 2020 - 05 - 09 - 22:40
 */
public class HibernateTest {

    @Test
    public void letsGetThisWork(){
       
        // 创建配置对象
        Configuration configuration = new Configuration();
        
        // 调用配置方法,这个方法会直接去找hibernate.cfg.xml 不需要按名字注入配置
        configuration.configure();
       
        // 从配置对象中调用工厂建造方法,创建会话工厂实例
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        
        // 调用开启会话 获取会话对象
        Session session = sessionFactory.openSession();

        // 事务对象 会话开启事务对象
        Transaction transaction = session.beginTransaction();
        
        // 实体类的 对象,映射成一个SQL记录
        User user = new User(null, "程序员1010", "337848");
        
        // Hibernate不需要我们来写具体SQL语句,调用这些方法即可
        // save是插入的意思
        session.save(user);

        // 提交事物
        transaction.commit();
        
        // 资源释放
        session.close();
        sessionFactory.close();
    }
}

 

查看测试:

技术分享图片

 

关于日志:

这里的LOG4J异常不用担心,我们已经在Maven中导入了这些依赖。

只是没有配置日志的配置文件

log4j.properties

技术分享图片

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

# Settings About ConsoleOutput
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

# Settings About FileOutput
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/logging.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

# LogOutput Level
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

再次测试就会生成日志记录,控制台也会输出日志信息了


 

问题总结:

 - 实体类的编写规范要求:

  1、构造器必须要声明无参构造器和全参构造器

  2、每一个属性都要提供对应的SETTER & GETTER

  3、提供toString方法,打印可以查看对象的字段值

- 映射文件配置:

  1、把文件放在实体类的包中,Maven就会过滤配置文件

技术分享图片

测试结果就会报错,这时候翻看我们的生成文件目录

里面的映射文件根本就没有【就是Maven的资源过滤问题】

技术分享图片

可以使用 过滤条件进行调整

pom.xml

<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

再次测试,成功

技术分享图片

  2、主键和其他字段有一些区别,例如元素使用的是ID,还有内部的增长策略要注意

- Hibernate核心配置文件

  1、连接参数不要写错,注意MySQL的驱动要求

  比如8.0我不写时区参数就会报错【?serverTimezone=Asia/Shanghai】

技术分享图片

  2、注意SQL方言选择,不要导致不兼容的方言问题

  3、注册映射器,用斜杠分隔,不要按包目录用点号分隔

 

原文:https://www.cnblogs.com/mindzone/p/12862350.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!