使用JDBC做数据库相关功能开发会做很多重复性的工作,比如创建连接,关闭连接,把字段逐一映射到属性中。 Hibernate把这一切都封装起来了,使得数据库访问变得轻松而简单,代码也更加容易维护。
下面我们通过Hibernate直接操作数据库
项目结构图
首先是新建一个maven工程
(eclipse)File->new->Maven Project->勾选Create a simple project->next->Group id:com.hibernate_test Artifact id:hibernate_->finish
1.maven加入相关依赖
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hibernate.test</groupId>
<artifactId>hibernate_</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- 添加Hibernate依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.7.Final</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<!-- 添加mysql数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
</project>
2.新建实体类
User.java
package hibernate.entity;
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.新建实体类映射文件(用于提供类与表的映射,以及属性与表字段的映射关系)
User.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 package="hibernate.entity"><!-- 实体类所在的包名 -->
<class name="User" table="User_"><!-- <class name="User">指实体类名,table="User_"可以实现自动建表 -->
<id name="id" column="id">
<generator class="native"><!--<generator class="native"> 意味着id的自增长方式采用数据库的本地方式 -->
</generator>
</id>
<property name="name" />
<property name="age" />
</class>
</hibernate-mapping>
4.在src下的resource文件夹下新建hibernate配置文件
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据源配置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/AddressBook?serverTimezone=GMT%2B8&characterEncoding=UTF-8</property>
<property name="connection.characterEncoding">utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="hibernate/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
运行主类:App.java
测试添加
创建一个User对象,并通过hibernate把这个对象,插入到数据库中
hibernate的基本步骤是:
- 获取SessionFactory
- 通过SessionFactory 获取一个Session
- 在Session基础上开启一个事务
- 通过调用Session的save方法把对象保存到数据库
- 提交事务
- 关闭Session
- 关闭SessionFactory
package hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import hibernate.entity.User;
public class App {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
User p = new User();
p.setName("小明");
p.setAge(18);
s.save(p);
s.getTransaction().commit();//事务提交
s.close();//session关闭
sf.close();//SessionFactory关闭
}
}
添加成功
增加多组数据后
测试查询
通过ID获取一个对象顶折纠问
调用Session的get方法,根据id获取对象。 除了id之外,还需要传递一个类对象,毕竟需要知道获取的是哪个对象
除了使用get方法,还可以使用load获取对象。
区别:
load方式是延迟加载,只有属性被访问的时候才会调用sql语句
get方式是非延迟加载,无论后面的代码是否会访问到属性,马上执行sql语句
对于id不存在的对象的处理:(例:都通过id=10去获取对象)
- get方式会返回null
- load方式会抛出异常
修改测试
修改一个对象的属性,并更新到数据库中
1 根据id获取该对象
2 修改该对象的属性
3 通过Session的update方法把变化更新到数据库中
将小明的名字改成小丑
测试删除
根据id把对象从表里删除掉
注意:hibernate在删除一条数据之前,先要通过id把这条记录取出来
Hibernate的注解是什么? 简单的说,本来放在hbm.xml文件里的映射信息,现在不用配置文件做了,改由注解来完成
使用注解之后的User.java
User类声明前面有两个注解:@Entity 和 @Table(name = “User_”)
@Entity 表示这是一个实体类,用于映射表
@Table(name = “User_”) 表示这是一个类,映射到的表名:User_
package hibernate.entity;
import javax.persistence.Column;
import javax.persistence.Entity;//导包导javax.persistence的
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "User_")
public class User {
private int id;
private String name;
private int age;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "age")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然后是属性注解,属性注解是配置在属性对应的getter方法上的
@Id 表示这是主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表示自增长方式使用mysql自带的
@Column(name = “id”) 表示映射到字段id…
hibernate.cfg.xml 配置文件改动
为了能够让hibernate支持这种注解的方式,还需要做一个改动:
把hibernate.cfg.xml配置文件中的
<mapping resource="hibernate/entity/User.hbm.xml" />
注释掉,采用:
<mapping class="hibernate.entity.User" />
这种写法,其他所有代码都不用改变,这样就可以一样实现hibernate的CRUD操作
经过了一系列增删查改,小明又回来了~