• Hibernate(1)


    相信很多伙伴和我一样,之前接触的JDBC->mybatis。至于hibernate只知道它是全自动的,而mybatis是半自动的。比较熟悉的或者用的比较多的可能是SSM,而SSH则接触比较少。最近几天将重新较细致认识一下hibernate。Let’s go~~

    一、hibernate和mybatis区别:

    二、我的第一个hibernate-demo:

    2.1 准备数据库文件:

    2.2 导入相关依赖:

    2.3 创建相关实体类:

    2.4 配置hibernate.cfg.xml文件:

    2.5 创建实体类映射:

    2.6 测试:

    2.7 测试中可能遇到的问题和解决措施:

    一、hibernate和mybatis区别:

    1. hibernate是全自动的,而mybatis是半自动的;hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象后实际关系仍然需要通过手写sql来实现和管理
    2. hibernate数据库移植性远大于mybatis;hibernate通过强大的映射结构和hql语言,大大降低了对象与数据库(Oracle、mysql等)的耦合性,而mybatis由于需要手写SQL,因此与数据库的耦合性直接取决于程序员写SQL的方法,如果SQL不具通用性而用了很多某数据库特性的SQL语句的话,移植性也会随之降低很多,成本很高
    3. hibernate拥有完整的日志系统,mybatis则欠缺一些;hibernate日志系统非常健全,涉及广泛,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多
    4. mybatis相比于hibernate关心很多细节;hibernate配置要比mybatis复杂得多,学习成本也比mybatis高,但也正因为mybatis使用简单,才导致他要比hibernate关心很多的技术细节,mybatis由于不用考虑很多细节,开发模式上与传统的jdbc区别很小,因此很容易上手开发项目,但忽略细节导致bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好相反。但是如果使用hibernate很熟练的话,实际开发效率四号不差于甚至超越mybatis
    5. SQL直接优化上,mybatis要比hibernate方便很多;由于mybatis的SQL都是写在xml里,因此优化SQL比hibernate方便很多。二hibernate的SQL很多都是自动生成的,无法直接维护SQL;虽有hql,单功能还是不及SQL强大,见到报表等便要需求时,hql也歇菜,也就是说hql有局限性,hibernate虽然也支持原生的SQL,但是开发模式上却与orm不同,需要转换思维,因此使用上不是很方便,总之写SQL的灵活度上hibernate不及mybatis

    二、我的第一个hibernate-demo:

    2.1 准备数据库文件:

    customer表&orders表 SQL语句
    customer表orders表

    /*
    Navicat MySQL Data Transfer

    Source Server         : MySQL
    Source Server Version : 80026
    Source Host           : localhost:3306
    Source Database       : hibernate

    Target Server Type    : MYSQL
    Target Server Version : 80026
    File Encoding         : 65001

    Date: 2022-11-12 11:47:54
    */

    SET FOREIGN_KEY_CHECKS=0;

    -- ----------------------------
    -- Table structure for `customer`
    -- ----------------------------
    DROP TABLE IF EXISTS `customer`;
    CREATE TABLE `customer` (
      `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(255) DEFAULT NULL COMMENT '姓名',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='顾客表';

    -- ----------------------------
    -- Records of customer
    -- ----------------------------
    INSERT INTO `customer` VALUES ('10', '张三');
    INSERT INTO `customer` VALUES ('11', '李四');
    INSERT INTO `customer` VALUES ('12', '王五');
    INSERT INTO `customer` VALUES ('13', '马六');
     

    /*
    Navicat MySQL Data Transfer

    Source Server         : MySQL
    Source Server Version : 80026
    Source Host           : localhost:3306
    Source Database       : hibernate

    Target Server Type    : MYSQL
    Target Server Version : 80026
    File Encoding         : 65001

    Date: 2022-11-12 11:45:16
    */

    SET FOREIGN_KEY_CHECKS=0;

    -- ----------------------------
    -- Table structure for `orders`
    -- ----------------------------
    DROP TABLE IF EXISTS `orders`;
    CREATE TABLE `orders` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(10) DEFAULT NULL,
      `cid` int NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

    -- ----------------------------
    -- Records of orders
    -- ----------------------------
    INSERT INTO `orders` VALUES ('16', '订单1', '10');
    INSERT INTO `orders` VALUES ('17', '订单2', '10');
    INSERT INTO `orders` VALUES ('19', '订单3', '11');
    INSERT INTO `orders` VALUES ('20', '订单4', '12');
    INSERT INTO `orders` VALUES ('21', '订单5', '12');
    INSERT INTO `orders` VALUES ('22', '订单6', '13');
     

    2.2 导入相关依赖:

    导入lombok、mysql-connector-java、hibernate-core依赖

    1. org.projectlombok
    2. lombok
    3. 1.18.24
    4. provided
    5. mysql
    6. mysql-connector-java
    7. 8.0.28
    8. org.hibernate
    9. hibernate-core
    10. 5.6.9.Final

    2.3 创建相关实体类:

    Customer:

    1. package com.xgsm.entity;
    2. import lombok.Data;
    3. import java.util.List;
    4. @Data
    5. public class Customer {
    6. private Integer id;
    7. private String name;
    8. // 在Customer中添加与Orders表的关系(一对多)
    9. private List orders;
    10. }

    Orders: 

    1. package com.xgsm.entity;
    2. import lombok.Data;
    3. @Data
    4. public class Orders {
    5. private Integer id;
    6. private String name;
    7. private Integer cid;
    8. // 在Orders中添加与Customer的关系(一对一)
    9. private Customer customer;
    10. }

    2.4 配置hibernate.cfg.xml文件:

    在hibernate.cgf.xml中配置数据源以及配置连接池等信息

    1. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    2. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    3. "connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true
    4. "connection.username">root
    5. "connection.password">990501
    6. "connection.driver_class">com.mysql.cj.jdbc.Driver
    7. "hibernate.c3p0.acquire_increment">10
    8. "hibernate.c3p0.idle_test_period">10000
    9. "hibernate.c3p0.timeout">5000
    10. "hibernate.c3p0.max_size">30
    11. "hibernate.c3p0.min_size">5
    12. "hibernate.c3p0.max_statements">10
    13. "dialect">org.hibernate.dialect.MySQL8Dialect
    14. "show_sql">true
    15. "format_sql">true
    16. "hibernate.hbm2ddl.auto"/>
    17. "current_session_context_class">thread
    18. "hbm2ddl.auto">create
    19. "com/xgsm/entity/Customer.hbm.xml"/>

    2.5 创建实体类映射:

    直接在entity(实体)包下创建映射实体类文件即可,具体配置如下:

    1. "1.0" encoding="UTF-8"?>
    2. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    3. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    4. <class name="com.xgsm.entity.Customer" table="customer">
    5. 顾客表
    6. "id" type="java.lang.Integer">
    7. "id" length="10">
    8. 主键
    9. "identity">
    10. "name" type="java.lang.String">
    11. "name">
    12. 姓名

    2.6 测试:

    创建test测试类,向数据库中添加一个数据。

    1. import com.xgsm.entity.Customer;
    2. import org.hibernate.Session;
    3. import org.hibernate.SessionFactory;
    4. import org.hibernate.cfg.Configuration;
    5. public class Test {
    6. public static void main(String[] args) {
    7. // 创建Configuration,读取hibernate.cfg.xml
    8. Configuration configuration = new Configuration().configure();
    9. // 获取SessionFactory
    10. SessionFactory sessionFactory = configuration.buildSessionFactory();
    11. // 获取session
    12. Session session = sessionFactory.openSession();
    13. Customer customer = new Customer();
    14. customer.setName("wahaha");
    15. session.save(customer);
    16. session.beginTransaction().commit();
    17. session.close();
    18. }
    19. }

    运行结果如下: 

    2.7 测试中可能遇到的问题和解决措施:

    上面的测试过程还是蛮顺利的,没有遇到什么bug。但是对于初学者来说有几个需要避免的错误,在这里总结一下,后续如果有其他的bug,再进行收集。

    1、如果我们将实体类映射文件,放在实体类中,我们需要在pom.xml中设置一下,让maven能够读取到entity包下的文件,要不然会报错。具体实例如下:“Exception in thread "main" org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found : com/xgsm/entity/Customer.hbm.xml : origin(com/xgsm/entity/Customer.hbm.xml)”

     解决措施:在maven中配置一下,让maven能够扫描到

    1. src/main/java
    2. **/*.xml

     2、在创建好实体映射文件后,没有注入到‘hibernate.cfg.xml’中,导致找不到实体类文件“Unknown entity: com.xgsm.entity.Customer”

     解决措施:在‘hibernate.cfg.xml’文件中注册实体类映射关系

    1. "com/xgsm/entity/Customer.hbm.xml"/>

    3、在hibernate.cfg.xml文件中设置数据库方言的时候,要根据自己mysql的版本去设置,要不然会报错,所以要注意。

     

  • 相关阅读:
    Django笔记三十八之发送邮件
    伦敦银一手是多少?
    面试题 17.16. 按摩师
    【计算机视觉】不来试试图片轮廓提取?
    什么是RBAC?
    如何远程、在线调试app?
    openmp 通用核心 学习 1
    一文读懂 Jetpack 组件开源库中 MVVM 框架架构
    卡片懸停毛玻璃效果
    深入理解MyBatis一级缓存和二级缓存【超详细源码解析】
  • 原文地址:https://blog.csdn.net/weixin_45295447/article/details/127818146