Hibernate简单入门

Hibernate简单入门

  通过度娘可以知道,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

  所谓ORM(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping)是指对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。对象-关系映射系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构。简单的说,我们使用ORM可以将我们的对象(POJO)去进行映射,使得我们可以去操作对象就能够完成对表的CRUD操作。


怎么使用Hibernate


开始使用Hibernate

通过一个实例来更直观的了解Hibernate框架。

使用Maven直接引用依赖:

1
2
3
4
5
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.2.Final</version>
</dependency>

再导入mysql数据库的驱动包。


创建一个user表

1
2
3
4
5
6
7
create table h_user(
id int primary key auto_increment,
name varchar(20),
password varchar(20),
phone varchar(20),
address varchar(50)
);

创建实体类

  创建一个实体类当做user表的映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class User {
private int id;
private String name;//对应表里的name
private String password;//对应表里的password
private String phone;//对应表里的phone
private String address;//对应表里的address

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 String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}
}

配置Hibernate相关文件

  • ***.hbm.xml:**它主要用于描述类与数据库中的表的映射关系。
  • **hibernate.cfg.xml:**它是Hibernate框架的核心配置文件。

User.hbm.xml

  详细看注释.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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="model">
<!--
name:映射实体类的名称
table:映射到数据库里面的表的名称
catalog:数据库名称
-->
<class name="User" table="h_user" catalog="hibernateTest">
<!--每个class必须有一个id子元素,用来描述主键-->
<id name="id" column="id">
<!--生成主键策略-->
<generator class="native"></generator>
</id>
<!--使用property来描述属性与字段的对应关系,length不写默认为255-->
<property name="name" column="name" length="20"></property>
<property name="password" column="password" length="20"></property>
<property name="phone" column="phone" length="20"></property>
<property name="address" column="address" length="20"></property>
</class>
</hibernate-mapping>

hibernate.cfg.xml

  详细看注释。如果使用的是IDEA Maven的项目结构,记得把配置文件放到resources文件夹里,不然找不到相应的xml文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernateTest</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">987654zmd</property>

<!--将向数据库发送的SQL语句显示出来-->
<property name="hibernate.show_sql">true</property>

<!--格式化SQL语句,显示出来的SQL语句会更加可读-->
<property name="hibernate.format_sql">true</property>
<!--设置方言:HQL语句会翻译成SQL语句-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!--配置映射文件所在的位置-->
<mapping resource="model/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
public class HibernateTest {
static SessionFactory sessionFactory;
static Configuration config;
static Session session;

public void init(){
config=new Configuration().configure();
sessionFactory=config.buildSessionFactory();
session=sessionFactory.openSession();//相对于得到一个Connec连接
session.beginTransaction();//开启事务
}

@Test
public void saveTest(){//存储信息
User u=new User();
User u1=new User();
u.setName("小东");
u.setPassword("987654zmd");
u.setPhone("10086");
u.setAddress("广西");
u1.setName("小明");
u1.setPassword("987654");
u1.setPhone("10010");
u1.setAddress("广东");
init();
session.save(u);
session.save(u1);
session.getTransaction().commit();//获取事务并提交
session.close();
sessionFactory.close();
}

@Test
public void findUserIdTest(){//通过主键获取一个信息
init();
User u=(User) session.load(User.class,1);
System.out.println(u.getName()+" "+u.getPassword()+" "+u.getPhone());
session.getTransaction().commit();//获取事务并提交
session.close();
sessionFactory.close();
}

@Test
public void updateUserTest(){//更新信息
init();
User u=(User)session.load(User.class,1);
u.setName("狗剩");
session.update(u);
session.getTransaction().commit();
session.close();
sessionFactory.close();
}

@Test
public void deleteUserTest(){//通过主键删除一个信息
init();
User u=(User) session.load(User.class,2);
session.delete(u);
session.getTransaction().commit();
session.close();
sessionFactory.close();
}

@Test
public void findAllUserTest(){//获取表里的所有信息
init();
//hibernate 中createQuery与createSQLQuery两者区别是:
//前者用的hql语句进行查询,后者可以用sql语句查询
//前者以hibernate生成的Bean为对象装入list返回,后者则是以对象数组进行存储
//所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
//突然发现createSQLQuery有这样一个方法可以直接转换对象
//Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
//XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。但是这个bean必须有映射
//Query query=session.createSQLQuery("select * from h_user").addEntity(User.class);

//项目设置->Facets ->添加Hibernate检测-> 再给Hibernate添加Hibernate.cfg.xml的配置,
// 不然User会报错(因为没有HQL检测,但是可以运行)
Query query1=session.createQuery("from User");

List<User> list=query1.list();
for(User user:list)
System.out.println(user.getName()+" "+user.getPassword());
session.getTransaction().commit();
session.close();
sessionFactory.close();
}

}

使用单元测试需要引用依赖:

1
2
3
4
5
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

测试存储功能

  控制台输出:

数据库:

剩下的功能测试如都无问题,那么我们就算简单入门Hibernate了。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×