Hibernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
框架:其实就是可复用的程序集。
Hibernate 框架:是一个全自动的持久层框架。
使用方法:
1、创建项目,导入相关jar包。或直接创建Maven项目,如何构建Maven项目?
引入相关依赖:
<!-- 全自动持久层框架 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.7.Final</version>
</dependency>
2、在 classpath 目录下(代码中一般放在 src/main/resources目录下)创建配置文件:hibernate.cfg.xml (命名必须为它)
核心配置信息:
<?xml version='1.0' encoding='UTF-8'?>
<!--hibernate配置文件的相关约束-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!-- 自动建表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 方言 根据不同方言生成不同sql语句 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--数据库相关配置-->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernateDemo?characterEncoding=utf-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--是否打印 自动生成的 sql 语句-->
<property name="show_sql">true</property>
<!--是否格式化 生成的sql 语句-->
<property name="format_sql">true</property>
<!--关系映射 在第四点有说明-->
<mapping resource ="demo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3、新建一个POJO(普通的Java对象)
示例:
public class User {
private int id;
private String name;
private String password;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4、新建一个配置文件 xxx.xml(命名随便取) 用于 实体类和数据库的映射。
在 hibernate.cfg.xml 中添加配置:<mapping resource ="xxx.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="demo.User" table="user" >
<!--name指类中属性名,column指对应的表中列名 -->
<id name = "id" column ="user_id">
<generator class="identity"></generator> <!--主键从0自增-->
</id>
<property name="name" column ="namedemo" type="string" length ="20"></property>
<!--默认column 和 name 值相同,其他属性也都有默认值-->
<property name="password"></property>
<property name="age"></property>
</class>
</hibernate-mapping>
5、新建一个测试类
示例:
public class HibernateDemo {
public static void main(String[] args) {
// .configure()方法会读取classpath下的hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
// 会启动一个线程
SessionFactory fac = cfg.buildSessionFactory();
//打开一条数据库会话,底层会建立jdbc连接
Session session = fac.openSession();
System.out.println("Hibernate 已成功连接数据库");
session.getTransaction().begin(); //开启事务
User user = new User();
user.setName("张三");
user.setPassword("123456");
user.setAge(15);
session.save(user); //保存数据
session.getTransaction().commit(); //提交事务
//关闭资源
session.close();
fac.close();
}
}
6、运行测试:
根据程序输入可以看出,Hibernate 首先会根据映射创建 一张表,再执行插入语句,进行数据的添加。
补充:删除、修改、查询操作。
代码说明:只是从事务开启到事务结束的代码,其他代码和添加的代码一样。
删除: 通过面向对象思想删除,new 一个对象,传入要删除的记录的id即可。
session.getTransaction().begin(); //开启事务
try {
User u = new User();
u.setUserId(12);
session.delete(u);
session.getTransaction().commit(); //提交事务
} catch (Exception e) {
session.getTransaction().rollback(); //若有异常 则回滚事务
}
修改: 修改时首先要将需要修改的记录查询出来,再将其中某个属性修改,最后保存。
session.getTransaction().begin();//开启事务
try {
//错误方法
/*User u = new User();
u.setUserId(12);
u.setAge(0);
session.update(u);*/
//先查询 再修改 再更新
User u = session.get(User.class, 12);
u.setAge(100);
session.update(u);
session.getTransaction().commit();//提交事务
} catch (Exception e) {
session.getTransaction().rollback();//回滚事务 要么全部执行,要么全不执行。
}
查询:
//HQL(Hibernate Query Language)语句,纯查询语句,面向对象的语言,在HQL中没有数据库的概念
//方式一 list集合
String hql = "from User u";
Query<User> query = session.createQuery(hql);
//query.list() 返回list 集合
List<User> list = query.list();
for(User u: list){
System.out.println(u.getName());
}
//方式二 使用迭代器
String hql = "from User u where u.age > 5";
Query query = session.createQuery(hql);
Iterator it = query.iterate(); //先查询符合条件的id
while(it.hasNext()){
User u = (User)it.next(); //再根据id查具体值
System.out.println(u.getName());
}
//方式三 唯一值
String hql = "from User u where u.age = 5";
Query query2 = session.createQuery(hql);
User u =(User) query2.uniqueResult(); //确定只有一个返回值时使用 否则会抛出异常
System.out.println(u.getName());