Hibernate保姆级入门
一、什么是hibernate
- 对象与关系型数据之间的映射管理框架
- ORM框架/持久层框架 ORM (Object Relational Mapping) : 对象关系映射
优点:跨数据库的无缝移植 (SqlServer、Oracle、MySql)
二、如何在MAVEN项目中添加hibernate支持(手动添加)
- 添加hibernate相关依赖
- 在resource目录下添加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.username">root</property>
<property name="connection.password">123</property>
<!-- 特殊字符需转义 -->
<property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 调试相关 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 实体相关 -->
<mapping resource="com/zking/hibernate/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
- 实体类必须实现Serializable接口
<?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>
<!--
name:指向定义实体类的全路径名
-->
<class name="com.zking.hibernate.entity.User" table="t_user_hb">
<!--
name:实体类的属性名
type:实体类属性的数据类型
column:数据库表中的字段名
-->
<id name="id" type="java.lang.Integer" column="id">
<generator class="increment"></generator>
</id>
<property name="userName" type="java.lang.String" column="user_name"></property>
<property name="userPwd" type="java.lang.String" column="user_pwd"></property>
<property name="realName" type="java.lang.String" column="real_name"></property>
<property name="sex" type="java.lang.String" column="sex"></property>
<property name="birthday" type="java.sql.Date" column="birthday"></property>
<property insert="false" update="false" name="createDatetime" type="java.sql.Timestamp" column="create_datetime"></property>
<property name="remark" type="java.lang.String" column="remark"></property>
</class>
</hibernate-mapping>
三、如何使用hibernate完成CRUD操作
- 增加
package com.zking.hibernate.test;
import java.sql.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.zking.hibernate.entity.User;
public class Demo01 {
/**
* 增
* @param args
*/
public static void main(String[] args) {
// 1 读取配置
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
// 2 创建SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3 打开Session
Session session = sessionFactory.openSession();
// 4 开启事务
Transaction transaction = session.beginTransaction();
// 5 CURD
User user = new User();
user.setUserName("wweee");
user.setUserPwd("123");
user.setRealName("王五");
user.setSex("男");
user.setBirthday(new Date(System.currentTimeMillis()));
//增加
session.save(user);
// 6 提交事务/回滚事务
transaction.commit();
// transaction.rollback();
// 7 关闭Session
session.close();
}
}
- 删除
package com.zking.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.zking.hibernate.entity.User;
public class Demo03 {
/**
* 删除
* @param args
*/
public static void main(String[] args) {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setId(3);
//提高代码健壮性,先查后删除
User u = session.get(User.class, user.getId());
if(null != u) {
session.delete(u);
}
transaction.commit();
// transaction.rollback();
session.close();
}
}
- 修改
package com.zking.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.zking.hibernate.entity.User;
public class Demo04 {
/**
* 修改
* @param args
*/
public static void main(String[] args) {
//获取配置文件
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
//创建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//开启会话
Session session = sessionFactory.openSession();
//开始执行
Transaction transaction = session.beginTransaction();
//CURD
User user = new User();
user.setId(1);
User u = session.get(User.class, user.getId());
if(null!=u) {
u.setUserPwd("123456");
}
//提交或者回滚
transaction.commit();
//关闭会话
session.close();
}
}
- 查单个
package com.zking.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.zking.hibernate.entity.User;
public class Demo02 {
/**
* 查单个
* @param args
*/
public static void main(String[] args) {
//1 读取配置
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
//2 创建SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//3 打开Session
Session session = sessionFactory.openSession();
//4 开启事务
Transaction transaction = session.beginTransaction();
//5 CURD
User user = new User();
user.setId(2);
User u = session.get(User.class, user.getId());
System.out.println(u);
//6 提交事务/回滚事务
transaction.commit();
//transaction.rollback();
//7 关闭Session
session.close();
}
}
对于以上代码可封装一个辅助类简化第 1、2、3、7步骤
package com.zking.hibernate.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryUtil {
//定义hibernate核心配置文件的默认位置
private static final String CONFIGURATION_FILE_NAME = "hibernate.cfg.xml";
/**
* 使用ThreadLocal模式 (线程局部变量模式) 管理Session
*
* ThreadLocal的原理:在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
* 作用:
* 1.避免Session被频繁的创建或销毁
* 2.在使用Session进行CRUD操作时,避免数据存取混乱
* 3.创建线程安全的Session
* 4.隔离多个线程的数据共享,避免冲突
*/
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration;
private static SessionFactory sessionFactory;
static {
try {
//读取配置文件
//采用默认的hibernate.cfg.xml来启动一个Configuration的实例
configuration = new Configuration();
configuration.configure(CONFIGURATION_FILE_NAME);
//创建SessionFactory实例
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 开启会话
* @return
*/
public static Session openSession() {
//通过线程对象.get()方法安全创建Session
Session session = threadLocal.get();
//如果该线程还没有Session,则创建一个新的Session
if(null == session) {
// 通过sessionFactory打开Session会话
session = sessionFactory.openSession();
// 将获得的Session变量存储在ThreadLocal变量session里
threadLocal.set(session);
}
return session;
}
/**
* 关闭会话
*/
public static void closeSession() {
Session session = threadLocal.get();
if(session != null) {
if(session.isOpen())
session.close();
threadLocal.set(null);
}
}
/**
* 用于测试核心配置文件的能否正确读取
* @param args
*/
public static void main(String[] args) {
Session session = SessionFactoryUtil.openSession();
System.out.println("Session会话状态:"+session.isOpen());
System.out.println("Session会话已打开");
SessionFactoryUtil.closeSession();
System.out.println("Session会话已关闭");
}
}