一、hibernate是什么
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。(摘自百度)
从上图可知,hibernate就是简化与数据库打交道的过程,帮我们写好简单的增删查改语句。当然hibernate还有很多其他功能,这里也不加以讨论(但是在实际项目开发中,难免会有多表的联合查询或者复杂的sql语句,这可比写简单的JDBC麻烦多了,这就是为什么hibernate会被mybatis代替的原因)
二、为什么要用hibernate
- Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
- Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作 session.save(User);
- Hibernate使用java的反射机制
- Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
三、怎么用hibernate
1、jar包
2、文件结构
Uesr.hbm.xml是对应JavaBean的映射文件,一对一
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 元素用于配置Hibernate中的属性
键:值
-->
<!-- hibernate.connection.driver_class : 连接数据库的驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- hibernate.connection.username : 连接数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- hibernate.connection.password : 连接数据库的密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- hibernate.connection.url : 连接数据库的地址,路径 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myuser</property>
<!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- format_sql: 打印sql语句前,会将sql语句先格式化 -->
<property name="format_sql">true</property>
<!-- hbm2ddl.auto: 生成表结构的策略配置
update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构.
如果存在表结构,并且表结构与实体一致,那么不做修改
如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
-->
<property name="hbm2ddl.auto">update</property>
<!-- 数据库方言配置
org.hibernate.dialect.MySQLDialect (选择最短的)
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- hibernate.connection.autocommit: 事务自动提交 -->
<property name="hibernate.connection.autocommit">true</property>
<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 引入ORM 映射文件
填写src之后的路径 -->
<mapping resource="habernateOne/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后写个Test文件测试以下就ok
package habernateOne;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class Test {
public static void main(String[] args) {
/*configuration详解,手动填源
Configuration con = new Configuration().configure(resource);
加载全局SRC hibernate.cfg.xml*/
Configuration con = new Configuration().configure();
SessionFactory sessionFactory = con.buildSessionFactory();
// JDBC Connection
// 由工厂生产连接对象session 这个session不是Servlet里面的
Session session = sessionFactory.openSession();
/* 得到同一个session
* sessionFactory.getCurrentSession();*/
User user = new User();
// 增加
user.setPassword("123");
user.setUsername("曾理国");
session.save(user);
/* 查找并更新
User userTwo = (User) session.get(User.class, 1);
userTwo.setPassword("1123");
userTwo.setUsername("215");
session.update(userTwo);*/
/* 修改
* user.setId(id);
user.setPassword(password);
user.setUsername(username);
session.update(user);*/
/* 删除
* user.setId(id);
session.delete(user);*/
session.beginTransaction().commit();
// (设置了事务自动提交之后,还要flush一下)
/*
* session.flush(); session.close();
*/
// User user3= (User)session.load(user.getClass(), 2);
// User user2= (User)session.load(user.getClass(), 2);
// System.out.println(user2.toString());
// session.beginTransaction().commit();
// Query createQuery = session.createQuery("from User");
// List<User> list = createQuery.list();
// for (User user2 : list) {
// System.out.println(user2);
// }*/
session.close();
}
}