hibernate

一.idea新建一个hibrenate项目

New Project->Maven->勾选create from archetype->选择maven-archetype-webapp->next。选择archetype的目的就是让软件自动帮我们创建maven结构的文件,节省我们的时间。

创建项目之后文件结构一般都不完整,需要自己手动补充几个文件夹知道目录完整。

├─main
│  ├─java
│  ├─resources
│  └─webapp
└─test
    ├─java
    └─resources

到这一步,我们只创建了一个maven的项目而已,接下来给这个项目添加hibernate框架。为了创建表映射文件比较方便,我们先连接数据库。在右侧database中,点+,添加一个数据库

这一步的操作其实是帮我们导入了hibernate相关的包,但是mysql的连接包需要我们自己导入。在project structure->model->hibernate处添加hibernate.cfg.xml文件,在persistence处导入建立OR映射,根据数据库生成对应的实体类和hbm.xml文件。这样我们就建立了一个hibernate的项目。

二.各主要文件解析

2.1hibernate.cfg.xml

<?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://47.97.68.197:3307/springbootssm</property>
    <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>
    <mapping class="com.isgoto.table.User"/>
    <mapping resource="User.hbm.xml"/>
    <!-- DB schema will be updated if needed -->
    <!-- <property name="hibernate.hbm2ddl.auto">update</property> -->
  </session-factory>
</hibernate-configuration>

2.1.1<property name="hibernate.hbm2ddl.auto" value="create" />

这个是配置是用来自动创建|更新|验证数据库表结构的。如果不是此方面的需求建议设置为none

create:每次创建都会删除上一次生成的表,然后根据你的配置文件来重新生成新表,这也是导致数据丢失的一个重要原因。

create-drop:每次加载hibernate时根据你的配置文件来生成新表,但是sessionFactory关闭之后就把表全部删除了。

update:根据你的配置文件来校验表结构,如果不符合则修改。

validate:验证,也是修改不符合的表,只不过修改的都是存在的表,不新增缺失的表。

 

2.2Entity.hbm.xml实体类数据文件

<?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>
    <class name="com.isgoto.table.User" table="user" schema="springbootssm">
        <id name="id" column="id"/>
        <property name="username" column="username"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

2.3实体类

@Entity
@Table(name = "user")
public class User {
    private long id;
    private String username;
    private String password;

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    @Basic
    @Column(name = "username")
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Basic
    @Column(name = "password")
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User that = (User) o;
        if (id != that.id) return false;
        if (username != null ? !username.equals(that.username) : that.username != null) return false;
        if (password != null ? !password.equals(that.password) : that.password != null) return false;

        return true;
    }
    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (username != null ? username.hashCode() : 0);
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }
}

@Table(name = "user",schema = "", catalog = ""),schema在三大数据库中各自表示不同,mysql中表示的数据库名称,catalog里面也是表示数据库名称,可选的选项,干脆不配。

三.hibernate的执行原理


①xxx.hbm.xml文件注册到hibernate.cfg.xml文件中。通过Configuration加载hibernate.cfg.xml文件,生成SessionFactory对象。

②SessionFactory对象生成session对象。

③如果有增改删任务,session对象通过session.beginTransaction()开启事务,成功则提交,不成功则回滚。

四.各项小功能实现

3.1执行时打印sql语句

在hibernate.cfg.xml文件中添加,show_sql是打印sql语句,format_sql是格式化sql语句,让语句看起来不会是一长条。

<property name="show_sql">true</property>
<property name="format_sql">true</property>

3.2定义数据库自增

参考文章:https://blog.csdn.net/canot/article/details/51455967

JPA通过@GeneratedValue(strategy =GenerationType.SEQUENCE,generator="aaa")注解来实现,有四种通用策略

TABLE:使用一个特定的数据库表来保存主键

SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。

IDENTITY:主键由数据库自动生成(主要是自动增长型)

AUTO:主键由程序控制

hibernate主键策略生成器

hibernate提供多种主键生成策略,有的是hibernate特有的,下面只列出几种常用的

native:oracle采用sequence方式,对于mysql和sql server采用identity。

uuid:产生一个32位16进制的uuid

identity:由mysql和sqlserver等支持自增的数据自己生成。oracle不能用

increment:插入数据时hibernate会给主键添加一个自增的主键,但是一个hibernate实例只能维护一个计数器,所以多实例运行时不能使用这个方法。

我使用的自增方法如下,在User.hbm.xml中添加

<class name="com.isgoto.table.User" table="user" schema="springbootssm">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
</class>

五.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值