创建项目
添加关键依赖包:任何使用方式都需要首在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 关联的类型
- 一对一关联:表示两个实体之间一一对应的关系。例如,一个用户实体可能与一个详细信息实体存在一对一关联,每个用户都有唯一的详细信息。
- 一对多关联:一个实体对应多个其他实体。比如,一个部门实体可以有多个员工实体与之关联,一个部门包含多个员工。
- 多对一关联:多个实体对应一个其他实体。例如,多个订单实体可以与一个客户实体关联,多个订单属于同一个客户。
- 多对多关联:多个实体与多个实体之间的复杂关系。例如,学生和课程之间的关系,一个学生可以选择多门课程,一门课程也可以有多个学生选修。
(四)JPA 关联的实现
在 JPA 中,通过在实体类中使用注解来定义关联关系。例如,使用@OneToOne
、@OneToMany
、@ManyToOne
和@ManyToMany
等注解来分别表示不同类型的关联。同时,还可以通过配置映射文件来进一步细化关联的属性和行为。
二、MyBatis:灵活的 SQL 映射框架
(一)MyBatis 简介
MyBatis 是一个基于 SQL 的轻量级数据访问框架。与 JPA 不同,MyBatis 允许开发者直接编写 SQL 语句,并通过映射配置将 SQL 结果集映射到 Java 对象中。这使得开发者在处理复杂的数据库查询和操作时具有更大的灵活性。
(二)MyBatis 的优势
- 高度灵活:可以根据具体的业务需求编写复杂的 SQL 语句,满足各种特殊的数据访问要求。
- 性能优化:由于可以直接控制 SQL 的执行,开发者可以进行精细的性能优化,提高数据访问的效率。
- 易于维护:SQL 语句通常比复杂的对象关系映射逻辑更容易理解和维护。
(三)MyBatis 的核心组件
- SqlSessionFactory:负责创建 SqlSession 的工厂类。SqlSession 是 MyBatis 中进行数据库操作的主要接口。
- Mapper 接口:定义了数据库操作的方法,通过注解或 XML 配置文件与 SQL 语句进行映射。
- XML 配置文件:用于配置数据库连接信息、映射关系等。可以在 XML 文件中编写复杂的 SQL 语句,并进行动态 SQL 的构建。
三、JPA 关联与 MyBatis 的比较
(一)开发效率
- JPA:通过对象关系映射,开发者可以使用面向对象的方式进行数据库操作,减少了 SQL 编写的工作量,提高了开发效率。特别是在处理复杂的实体关系时,JPA 的关联功能可以使代码更加简洁和易于维护。
- MyBatis:需要开发者手动编写 SQL 语句,对于一些简单的查询和操作,可能会比较繁琐。但是,在处理复杂的业务逻辑和特殊的数据库需求时,MyBatis 的灵活性可以让开发者更加高效地实现功能。
(二)性能
- JPA:在一些情况下,由于自动生成的 SQL 可能不够优化,性能可能会受到一定影响。但是,JPA 提供了一些性能优化的机制,如缓存、延迟加载等,可以在一定程度上提高性能。
- MyBatis:由于可以直接控制 SQL 的执行,开发者可以进行精细的性能优化,提高数据访问的效率。但是,手动编写 SQL 也增加了出错的风险,需要开发者具备一定的 SQL 优化能力。
(三)适用场景
- JPA:适用于以对象为中心的开发场景,特别是在企业级应用中,对于复杂的实体关系和业务逻辑,JPA 的关联功能可以提供很好的支持。
- MyBatis:适用于对 SQL 控制要求较高的场景,如复杂的查询、性能优化要求较高的应用等。同时,MyBatis 也适用于与遗留系统集成的场景,因为可以直接使用现有的 SQL 语句。