目录
- 1. hibernate框架
- 2. 配置文件实体mapper和hibernate.cfg.xml
- 3. 操作单表增删改查
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 5driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mydatabaseMysql 8.0.15driver=com.mysql.cj.jdbc.Driverurl=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. 通过配置文件 获取 sessionFactorySessionFactory sessionFactory = config.buildSessionFactory();// 3. 通过session工厂获取sessionSession 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 existsSystem.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 {// 关闭sessionsession.close();// 关闭session工厂sessionFactory.close();}// hibernate中的缓存System.out.println(stuObj);}}