一.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>
五.