1. hibernate框架
数据持久层的框架
功能定位:专门用来访问数据库,对数据库进行增删改查操作
Hibernate是一个ORM框架 MyBatis MyBatisPlus、JPA(springdata jpa)
ORM:Object Relational Mapping(对象关系映射)
特点
1. 上手较难
2. 灵活度低
3. 全自动(不写sql语句操作数据库)
2. 配置文件实体mapper和hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-mapping>
<!-- 配置stu info 实体类与表的映射关系 -->
<!-- 类的全路径 和 表名 -->
<class name="cn.bitqian.entity.StuInfo" table="stu_info">
<!-- 主键 -->
<!-- name 为属性 -->
<!-- id 为列 -->
<id name="sid" column="id">
<!-- 配置主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- 可以配置列的长度 -->
<property name="name" column="name"></property>
<property name="birthday" column="birth_day"></property>
</class>
<!-- <class name="cn.bitqian.entity.User" table="users2">
<id name="userId" column="user_id">
主键生成策略
<generator class="native"></generator>
</id>
实体属性与列的映射关系!
<property name="userName" column="user_name"></property>
<property name="userPasswrod" column="user_password"></property>
<property name="userGender" column="user_gender"></property>
<property name="userAddress" column="user_address"></property>
<property name="registerDate" column="register_date"></property>
</class> -->
</hibernate-mapping>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!-- mysql 5.x 版本sql 连接配置 -->
<property name="connection.url">jdbc:mysql://localhost:3306/ssh_study</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 数据库方言 mysql -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 在命令执行时是否显示sql语句 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 用于更新表的变化 -->
<property name="hbm2ddl.auto">update</property>
<!-- 引用实体类 与 数据库表的 映射文件 -->
<mapping resource="cn/bitqian/entity/stuInfo.hbm.xml"/>
<!-- 引用user映射文件 -->
<mapping resource="cn/bitqian/entity/user.hbm.xml"/>
</session-factory>
</hibernate-configuration>
驱动包注意
Mysql 5
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydatabase
Mysql 8.0.15
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
&需转译成&
3. 操作单表增删改查
- 实体类
package cn.bitqian.entity;
import java.io.Serializable;
import java.util.Date;
public class StuInfo implements Serializable {
/**
* 唯一 serial id
* 用于序列化和返序列化的校验
*/
private static final long serialVersionUID = -3784274218883718429L;
private Integer sid;
private String name;
private Date birthday;
// 省略set/get
}
- SessionFactory
package cn.bitqian.dao;
import java.io.Serializable;
import java.util.Date;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
//import org.hibernate.dialect.MySQL5InnoDBDialect;
import cn.bitqian.entity.StuInfo;
/**
* get / load distinct
* single table curd
* @author echo lovely
*
*/
public class Test1 {
public static void main(String[] args) {
test1();
}
/**
* stuInfo 表测试
*/
static void test1() {
// 1. 读取配置文件
Configuration config = new Configuration().configure();
// 2. 通过配置文件 获取 sessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
// 3. 通过session工厂获取session
Session session = sessionFactory.openSession();
// 4. 开启事务
session.beginTransaction();
Object stuObj = null;
// 数据库操作
try {
// 新增
/*StuInfo stu = new StuInfo();
stu.setName("jack");
stu.setBirthday(new Date());
// 返回新增主键值
Serializable primaryValue = session.save(stu);
System.out.println(primaryValue);
*/
// 修改
/*StuInfo stu = new StuInfo();
stu.setSid(1);
stu.setName("rose");
stu.setBirthday(new Date());
session.update(stu);
System.out.println("修改成功...");*/
// 删除
/*StuInfo stu = new StuInfo();
stu.setSid(1);
session.delete(stu);*/
// 单个查询
// load 懒加载 和 get的区别
// load 查询 延时加载
System.out.println("load 查询前");
stuObj = session.load(StuInfo.class, 1);
System.out.println("load 查询后");
if (stuObj != null) {
System.out.println("使用对象");
StuInfo stu = (StuInfo) stuObj;
System.out.println(stuObj + "\n转型后的对象: \n" + stu);
}
System.out.println("null stu by load:");
// load查询不存在的
// org.hibernate.ObjectNotFoundException: No row with the given identifier exists
System.out.println(session.load(StuInfo.class, 2));
// get 查询 即时加载
/*System.out.println("get 查询前:");
stuObj = session.get(StuInfo.class, 1);
System.out.println("get 查询后:");*/
/**
* 延时加载和即时加载的区别:
* 相同点:
* 1. 都能查询单条数据,在Session关闭后不能再查询
* 2. 都存在缓存
* 不同点:
* 1. 即时加载不管数据是否存在,都会返回结果,返回null或者数据。
* 而延时load加载查不到数据时报错。
* 2. 延时load加载只能在 你使用数据时,发送查询请求
*
*/
// 提交事务
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} finally {
// 关闭session
session.close();
// 关闭session工厂
sessionFactory.close();
}
// hibernate中的缓存
System.out.println(stuObj);
}
}