Spring Boot 之 ORM

ORM

  • ORM:Object Relational Mapping:对象关系映射
    • 通过 MyBatis 操作数据库

基本步骤

  1. 添加 mybatis 起步依赖:完成 mybatis 对象自动配置,对象放在容器中
  2. pom.xml 配置文件中指定将 src/main/java 目录中的 xml 文件编译
  3. 创建实体类
  4. 创建 dao 接口
    • 定义数据库操作方法
  5. 创建对应的 mapper.xml 文件
    • 进行 sql 语句编写
  6. 创建 service
    • 创建 service 接口和实现类
    • 调用 dao 的方法完成数据库操作,实现具体业务逻辑
  7. 创建 controller ,访问 service 方法实现业务
  8. application.properties 配置文件
    • 配置数据库连接信息

起步依赖

  • 三方提供的 SpringBoot 依赖以第三方名开始
    • SpringBoot 提供的依赖 以 spring 为开始 id
  • 添加起步依赖之后相关依赖都已经被导入
    • 添加 mybatis 依赖
    • mysql 驱动依赖

数据源

  • 配置 MySQL 数据源信息
    • 默认使用框架中封装的连接池:Hikari
spring:
  # 配置数据源,默认框架中封装的 HikariDataSource
  datasource:
    #自定义数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    #驱动类: MySQL 8.0 新的驱动文件,速度更快
    driver-class-name: com.mysql.cj.jdbc.Driver
    # MySQL 连接的 url
    # useUnicode 使用Unicode编码,编码格式 UTF-8
    # serverTimezone:执行时区
    # GMT:标准时区;%2B8:+8小时
    url: jdbc:mysql://localhost:3306/demo01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    username: root
    password: 123456
  • UTC:全球标准时间
    • 以原子时计时,更加精准适应现代社会的精确计时
  • GMT:格林威治标准时间
    • 指位于伦敦郊区的皇家格林尼治天文台的标准时间
  • 北京时区即东八区,领先 UTC 和 GMT 八个小时
    • 一般视为无差别,即:北京时间 = UTC + 8 = GMT + 8

Druid

  • 需要导入 SpringBoot 中的 Druid 起步依赖才能自动配置

    • 导入 Maven 普通依赖无效,需要手动配置 druid
    <!-- Druid SpringBoot 起步依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
    
Druid 配置
  • druid 配置完成
    • 包括 扩展插件配置:数据源监控功能
    • 可以直接使用,或手动写配置类进行监控功能配置
spring:
  # 配置数据源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    # 配置 druid 连接属性
    druid:
      # 初始化连接数
      initialSize: 5
      # 最小连接数
      minIdle: 5
      # 最大连接数
      maxActive: 20
      # 最大等待时间,配置获取连接等待超时,时间单位都是毫秒ms
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,又作为 testWhileIdle 执行的依据
      timeBetweenEvictionRunsMillis: 60000
      # 连接保持空闲而不被驱逐的最小时间
      minEvictableIdleTimeMillis: 300000
      # 用来检测连接是否有效的 sql,必须是一个查询语句
        # mysql 中为 select 'x'、oracle 中为 select 1 from dual
      validation-query: select 'x'
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
        # 建议配置为true,不影响性能,并且保证安全性
      testWhileIdle: true
      # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      testOnBorrow: false
      # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      testOnReturn: false
      # 是否缓存preparedStatement,即 PSCache;MySQL5.7 不要开
        # 使用了MyBatis且使用了$的值引入方式,则无需担心SQL注入问题。Prepared statement不再需要
        # PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
      poolPreparedStatements: true
      # 启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 合并多个 DruidDataSource 的监控数据
      useGlobalDataSourceStat: true

      # 通过别名的方式配置扩展插件
        # 监控统计:stat, 日志:log4j,防御SQL注入:wall
        # wall 用于防火墙;SpringBoot 中没有 log4j,改成了 log4j2
      filters: stat,wall,log4j2
      # 通过 connectProperties 属性来打开 mergeSql 功能;慢 SQL 记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
      
      # 配置 StatFilter,或者在配置类中手动配置
      web-stat-filter:
        # 默认为 false,设置为 true 启动
        enabled: true
        # 被过滤的请求路径
        url-pattern: "/*"
        # 不被过滤的请求
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      # 配置StatViewServlet,或者在配置类中手动配置
      stat-view-servlet:
        url-pattern: "/druid/*"
        # 允许访问 ip
        allow: 127.0.0.1
        # 设置访问 druid 监控页的账号和密码,默认没有
        login-username: admin
        login-password: 123456
        # 禁止访问 ip
        deny: 192.168.1.102
        # 是否可以重置
        reset-enable: true
        # 启用
        enabled: true

mybatis:
  # mapper 文件映射
  mapper-locations: classpath:mapper/*.xml
  # 打印 sql 语句执行日志到控制台
  configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 类别名配置
  type-aliases-package: mybatis2.pojo
server:
  port: 80
数据源监控
  • Druid数据源具有监控的功能,并提供了一个 web 界面方便用户查看
    • 编写 Druid 配置类来配置监控
    • 或在配置文件中直接配置
  • 使用普通项目 Mavne 的 druid 依赖时需要手动配置
/*
 * Druid 配置类
 */
@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDatasource() {
        return new DruidDataSource();
    }

    /*
     * 配置 Druid 监控管理后台的Servlet;
     * 内置 Servlet 容器没有 web.xml 文件,所以使用 Spring Boot 的注册 Servlet 方式
     */ 
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        // 参数可以在 StatViewServlet 的父类 ResourceServlet 中找到
        Map<String, String> initParams = new HashMap<>();
        //后台登录账号密码设置
        initParams.put("loginUsername", "admin");
        initParams.put("loginPassword", "123456");
        //默认就是允许所有访问
        initParams.put("allow", "");  
        //deny:Druid 后台拒绝谁访问,表示禁止此ip访问
        initParams.put("deny", "192.168.10.132");
        //是否可以重置数据
        initParams.put("resetEnable","false"); 
        //设置初始化参数
        bean.setInitParameters(initParams);
        return bean;
    }

    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        //创建过滤器
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<>();
        // 或略过滤的形式
        initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        bean.setInitParameters(initParams);
        //设置过滤路径
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }

}

@Mapper

  • @Mapper 注解在 Dao 接口上
    • 通知 MyBatis 被注解的是 dao 接口
    • 创建此接口的代理对象
  • 属于 MyBatis 的注解,不会自动装配到 Spring 容器
    • 自动注入时 Idea 可能会爆红因为找不到 bean,但并没有错
    • 再添加 @Repository 注解将 bean 注入到 容器
      • 可有可无,不影响注入结果
@Mapper
//@Repository
public interface DemoDao {
    //方法定义略
}
  • 其他步骤没有区别

@MapperScan

  • @Mapperscan 注解在主启动类
    • 属性 basePackages 指定 dao 接口所在包
      • 属性类型为 String[] 数组,可以同时指定多个包
  • 指定此注解后无需再使用 @Mapper
@SpringBootApplication
@MapperScan(basePackages = "springboot_mybatis.dao")
public class MyApplication {

   public static void main(String[] args) {
      SpringApplication.run(MyApplication.class, args);
   }

}

dao 和 mapper

  1. 将 dao 接口 和 mapper.xml 文件分离,进行分开管理
    • mapper.xml 文件放到 resources 资源目录下
  2. pom.xml 文件中指定编译 resources 目录下资源文件
  3. application.properties 文件中指定 mapper 文件路径
#指定 mapper 文件位置:mapper 目录下所有 xml 文件
mybatis.mapper-locations=classpath:mapper/*.xml
#打印 sql 语句执行日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

事务

Spring 中事务
  1. 定义管理事务的对象
    • 事务管理器:接口,有很多实现类
    • 例如:jdbc、mybatis 访问数据库的 DataSourceTransactionManager
  2. 声明式事务:xml 配置文件或注解说明事务控制的内容
    • 控制事务:隔离级别、传播行为、超时
  3. 事务处理方式
    1. 使用 Spring 框架中的 @Transaction 注解
    2. 使用 aspecjt 框架在 xml 配置文件中声明事务控制的内容
SpringBoot 中事务

仍可使用 Spring 中方式进行

  1. 在业务方法加入 @Transactional
    • 添加注解后业务方法即具有事务功能
  2. 明确在主启动类上加入 @EnableTransactionManagement
    • 启用事务管理器
    • 可以不加,建议添加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值