数据访问:JPA 关联& MyBatis

创建项目

添加关键依赖包:任何使用方式都需要首在pox.xml中引入mybatis-spring-boot-starter的启动器,

我们使用项目向导添加的依赖如下:

 

application.yml

spring:
  # 配置数据源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource # 使用阿里巴巴 Druid 数据源
    druid:
      ############ 连接池基础配置 ############
      initial-size: 1 # 初始化大小,可根据实际情况调整
      max-active: 20 # 最大连接数,需考虑系统负载和数据库性能
      min-idle: 1 # 最小连接数,保证一定的空闲连接可用
      max-wait: 60000 # 获取连接等待超时的时间(单位:毫秒),可根据响应要求调整
      time-between-eviction-runs-millis: 60000 # 间隔多久检测一次需要关闭的空闲连接(单位:毫秒)
      time-between-log-stats-millis: 60000 # 日志统计信息之间的时间(单位:毫秒)
      min-evictable-idle-time-millis: 300000 # 一个连接在池中最小生存的时间(单位:毫秒)
      max-evictable-idle-time-millis: 600000 # 一个连接在池中最大生存的时间(单位:毫秒)
      test-while-idle: true # 应用向连接池申请连接,值为 false 时,连接池将会判断连接是否处于空闲状态,如果是则验证这条连接是否可用
      test-on-borrow: false # 默认值为 false,如果为 true,应用向连接池申请连接时连接池会判断这条连接是否是可用的
      test-on-return: false # 默认值为 false,如果为 true,当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用
      validation-query: select 1 # 用来测试连接是否可用的 SQL 语句
      validation-query-timeout: 60000 # 连接是否可用测试超时时间(单位:毫秒)
      # use-global-datasource-stat: true # 使用全局数据源统计,可根据需求开启
      keep-alive: true # 连接池中的 min-idle 数量以内的连接,空闲时间超过 max-evictable-idle-time-millis,则会执行 KeepAlive 操作
      pool-prepared-statements: true # 是否缓存 PreparedStatement,对支持游标的数据库性能提升巨大,比如 Oracle
      max-open-prepared-statements: 20 # 要启用 PSCache,必须配置大于 0(当大于 0 时,pool-prepared-statements 自动触发修改为 true)在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,可以把这个数值配置大一些,比如 100
      connection-properties: stat.mergeSql=true;stat.slowSqlMillis=5000 # 设置连接属性,mergeSql 合并 SQL,慢 SQL 时长定义(单位:毫秒)
      remove-abandoned: true # 开启连接池回收(针对不活跃的连接)
      remove-abandoned-timeout: 1800 # 超时连接回收时间(单位:毫秒)
      log-abandoned: true # 回收连接时打印日志
      ############ 数据库连接监控 ############
      aop-patterns: "com.bdqn.*.mapper.*" # Spring 监控,利用 AOP 对指定接口的执行时间,JDBC 数进行记录
      filters: stat,wall,log4j2 # 启用内置过滤器(第一个 stat 必须,否则监控不到 SQL)
      filter:
        stat: # 开启 DruidDataSource 的状态监控
          enabled: true # 启用 DruidDataSource 状态监控
          db-type: mysql # 数据库类型
          log-slow-sql: true # 开启慢 SQL 监控
          slow-sql-millis: 2000 # 超过 2s 就认为是慢 SQL,记录到日志中
        slf4j: # 日志监控,使用 slf4j 进行日志输出
          enabled: true # 启用日志监控
          statement-log-error-enabled: true
          statement-create-after-log-enabled: false
          statement-close-after-log-enabled: false
          result-set-open-after-log-enabled: false
          result-set-close-after-log-enabled: false
      web-stat-filter: # 配置 WebStatFilter,用于采集 Web 关联监控的数据
        enabled: true # 启用 WebStatFilter
        url-pattern: /* # 过滤所有 URL
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的 URL
        session-stat-enable: true # 开启 Session 统计功能
        session-stat-max-count: 100 # Session 的最大个数(默认 100)
      stat-view-servlet: # 配置 StatViewServlet(监控页面),用于展示 Druid 的统计信息
        enabled: true # 启用 StatViewServlet(监控页面)
        url-pattern: /druid/* # 访问内置监控页面的路径,内置监控页面的首页是 /druid/index.html
        reset-enable: false # 不允许清空统计数据,重新计算
        login-username: admin # 监控页面访问账号
        login-password: admin # 监控页面访问密码
        allow: 127.0.0.1,localhost # 允许访问的地址,如果 allow 没有配置或者为空,则允许所有访问
        deny: # 拒绝访问的地址,deny 优先于 allow,如果在 deny 列表中,就算在 allow 列表中,也会被拒绝

  # 配置 mybatis 相关信息
  # mybatis:
  #   config-location: classpath:mybatis/mybatis-config.xml
  #   mapper-locations: classpath:mybatis/mapper/*.xml
  #   type-aliases-package: com.bdqn.demo.pojo

  # 配置前端页面访问路径前缀和后缀
  mvc:
    view:
      prefix: /WEB-INF/jsp/templates/
      suffix:.jsp

  # spring.jpa.properties.hibernate.
  # 指定数据库方言
  jpa:
    properties:
      hibernate:
        # 配置 jpa(Hibernate)相关信息
        hbm2ddl:
          auto: update
          # 指定 hibernate 方言,确保与实际数据库版本匹配
        dialect: org.hibernate.dialect.MySQLDialect
        # 格式化 sql 语句,默认 false,这个配置需要配合 spring.jpa.show-sql=true 使用,默认的 sql 语句是带括号的,开启这个配置后语句会换行
        format_sql: true
    # 是否在日志中打印出自动生成的 sql,方便调试的时候查看
    show-sql: true

# 配置日志
logging:
  level:
    root: warn
    com.bdqn.demo.mapper: trace
  pattern:
    console: '%p%m%n'

(一)JPA 简介

JPA 是 Java 中用于对象关系映射(ORM)的规范,它提供了一种将 Java 对象持久化到关系型数据库的标准方式。通过 JPA,开发者可以使用面向对象的方式来操作数据库,而无需直接编写 SQL 语句。

(二)JPA 关联的重要性

关联是 JPA 中用于表示实体之间关系的关键概念。在现实世界的业务场景中,不同的实体之间往往存在着各种复杂的关系。JPA 关联使得我们能够在 Java 对象模型中准确地反映这些关系,从而实现更加直观和易于理解的业务逻辑。

(三)JPA 关联的类型

  1. 一对一关联:表示两个实体之间一一对应的关系。例如,一个用户实体可能与一个详细信息实体存在一对一关联,每个用户都有唯一的详细信息。
  2. 一对多关联:一个实体对应多个其他实体。比如,一个部门实体可以有多个员工实体与之关联,一个部门包含多个员工。
  3. 多对一关联:多个实体对应一个其他实体。例如,多个订单实体可以与一个客户实体关联,多个订单属于同一个客户。
  4. 多对多关联:多个实体与多个实体之间的复杂关系。例如,学生和课程之间的关系,一个学生可以选择多门课程,一门课程也可以有多个学生选修。

(四)JPA 关联的实现

在 JPA 中,通过在实体类中使用注解来定义关联关系。例如,使用@OneToOne@OneToMany@ManyToOne@ManyToMany等注解来分别表示不同类型的关联。同时,还可以通过配置映射文件来进一步细化关联的属性和行为。

二、MyBatis:灵活的 SQL 映射框架

(一)MyBatis 简介

MyBatis 是一个基于 SQL 的轻量级数据访问框架。与 JPA 不同,MyBatis 允许开发者直接编写 SQL 语句,并通过映射配置将 SQL 结果集映射到 Java 对象中。这使得开发者在处理复杂的数据库查询和操作时具有更大的灵活性。

(二)MyBatis 的优势

  1. 高度灵活:可以根据具体的业务需求编写复杂的 SQL 语句,满足各种特殊的数据访问要求。
  2. 性能优化:由于可以直接控制 SQL 的执行,开发者可以进行精细的性能优化,提高数据访问的效率。
  3. 易于维护:SQL 语句通常比复杂的对象关系映射逻辑更容易理解和维护。

(三)MyBatis 的核心组件

  1. SqlSessionFactory:负责创建 SqlSession 的工厂类。SqlSession 是 MyBatis 中进行数据库操作的主要接口。
  2. Mapper 接口:定义了数据库操作的方法,通过注解或 XML 配置文件与 SQL 语句进行映射。
  3. XML 配置文件:用于配置数据库连接信息、映射关系等。可以在 XML 文件中编写复杂的 SQL 语句,并进行动态 SQL 的构建。

三、JPA 关联与 MyBatis 的比较

(一)开发效率

  1. JPA:通过对象关系映射,开发者可以使用面向对象的方式进行数据库操作,减少了 SQL 编写的工作量,提高了开发效率。特别是在处理复杂的实体关系时,JPA 的关联功能可以使代码更加简洁和易于维护。
  2. MyBatis:需要开发者手动编写 SQL 语句,对于一些简单的查询和操作,可能会比较繁琐。但是,在处理复杂的业务逻辑和特殊的数据库需求时,MyBatis 的灵活性可以让开发者更加高效地实现功能。

(二)性能

  1. JPA:在一些情况下,由于自动生成的 SQL 可能不够优化,性能可能会受到一定影响。但是,JPA 提供了一些性能优化的机制,如缓存、延迟加载等,可以在一定程度上提高性能。
  2. MyBatis:由于可以直接控制 SQL 的执行,开发者可以进行精细的性能优化,提高数据访问的效率。但是,手动编写 SQL 也增加了出错的风险,需要开发者具备一定的 SQL 优化能力。

(三)适用场景

  1. JPA:适用于以对象为中心的开发场景,特别是在企业级应用中,对于复杂的实体关系和业务逻辑,JPA 的关联功能可以提供很好的支持。
  2. MyBatis:适用于对 SQL 控制要求较高的场景,如复杂的查询、性能优化要求较高的应用等。同时,MyBatis 也适用于与遗留系统集成的场景,因为可以直接使用现有的 SQL 语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值