• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • UTC:全球标准时间
      • 以原子时计时,更加精准适应现代社会的精确计时
    • GMT:格林威治标准时间
      • 指位于伦敦郊区的皇家格林尼治天文台的标准时间
    • 北京时区即东八区,领先 UTC 和 GMT 八个小时
      • 一般视为无差别,即:北京时间 = UTC + 8 = GMT + 8

    Druid

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

      • 导入 Maven 普通依赖无效,需要手动配置 druid
      
      <dependency>
          <groupId>com.alibabagroupId>
          <artifactId>druid-spring-boot-starterartifactId>
          <version>1.2.8version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    @Mapper

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

    @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);
       }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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
    
    • 1
    • 2
    • 3
    • 4

    事务

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

    仍可使用 Spring 中方式进行

    1. 在业务方法加入 @Transactional
      • 添加注解后业务方法即具有事务功能
    2. 明确在主启动类上加入 @EnableTransactionManagement
      • 启用事务管理器
      • 可以不加,建议添加
  • 相关阅读:
    <Linux常用开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile等)>——《Linux》
    OpenCV--图像的基本变换
    【逆向专题】【危!!!刑】(一)使用c#+Win32Api实现进程注入到wechat
    2024年关于湖北省建筑安全员B证报考你需要了解
    Vite实现原理
    Jenkins 配置节点交换内存
    会议OA之会议排座&送审
    Flask数据库_SQLAIchemy常用的数据类型与使用
    关于smartforms 文本乱码问题
    微信小程序合集7(体育赛事+高仿知乎+微赞论坛+数独游戏+小熊日记)
  • 原文地址:https://blog.csdn.net/qq_66991094/article/details/127659262