速通JavaWeb2

本篇紧接上一篇的JavaWeb1继续进行以下的学习

5、Mybatis

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射,用于简化JDBC 的开发

5.1概述介绍

①、特点
  • 灵活的 SQL 执行:MyBatis 允许开发者编写原生 SQL,这使得 SQL 的编写更加灵活,能够针对不同的数据库进行优化。

  • 映射简单直观:通过 XML 或注解的方式将 SQL 的结果映射成 Java 对象,使得开发者能够清晰地看到 SQL 和对象之间的映射关系。

  • 支持动态 SQL:MyBatis 提供了强大的动态 SQL 支持,可以根据不同的条件动态生成 SQL 语句,减少了代码量。

  • 易于集成:可以很容易地与 Spring 等框架集成,方便在大型项目中使用。

②、核心组件
  • SqlSessionFactory:它是 MyBatis 的核心对象之一,负责创建 SqlSession。它是线程安全的,通常在应用启动时创建一次,然后在整个应用生命周期中使用。

  • SqlSession:是执行命令、获取映射器和管理事务的。

  • Mapper:是 MyBatis 中的映射器,它定义了操作数据库的接口。通过接口和 XML 文件(或注解)的结合,MyBatis 能够将接口方法调用映射为具体的 SQL 执行。

③、配置文件
  • mybatis-config.xml:这是 MyBatis 的全局配置文件,它配置了 MyBatis 的运行环境等信息,例如数据库连接池、事务管理等。

  • Mapper XML 文件:定义了操作数据库的 SQL 语句以及 SQL 语句与 Java 对象之间的映射关系。

5.2、入门程序

①、创建项目

之后删除多余的文件,只保留.src和pom.xml即可

②、配置application.properties
  spring.application.name=mybatis
  ​
  #  mybatis 配置数据库连接信息
  #  表示连接到 localhost 上的 MySQL 数据库实例,端口号为 3306,数据库名称为 test
  #  同时指定使用 com.mysql.cj.jdbc.Driver 驱动程序
  #  用户名和密码分别为 root 和 123456
  spring.datasource.url = "jdbc:mysql://localhost:3306/test";
  spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  spring.datasource.username = "root";
  spring.datasource.password = "123456";

③、最终结构

最终主要编写:

  • 创建User类

  • 修改application.properties

  • 编写Mapper接口

  • 单元测试实现

注意启动MySQL

5.3、idea连接数据库

5.4、数据库连接池

数据库连接池是一种用于管理数据库连接的技术,它在应用程序和数据库之间建立一个连接的缓冲池,通过复用连接来提高数据库操作的性能。

①、主要特点
  1. 连接复用:避免频繁创建和关闭连接的开销

  2. 连接管理:统一管理连接的生命周期

  3. 性能优化:减少连接建立和释放的时间

  4. 资源控制:限制最大连接数,防止资源耗尽

②、常见Java的连接池实现
  • HikariCP:目前性能最好的JDBC连接池(创建spring boot项目默认自带使用的)

  • Apache DBCP:Apache Commons项目中的连接池

  • C3P0:老牌连接池,稳定性好

  • Druid:阿里巴巴开源连接池,提供监控功能

要想切换连接池需要实现两步(以将原默认的 HikariCP 切换为 Druid 为例):

  • 引入需切换的连接池的依赖

  <!-- Druid连接池核心依赖 -->
  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.18</version> <!-- 请使用最新版本 -->
  </dependency>
  ​
  <!-- 如果需要Spring Boot支持 -->
  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.2.18</version> <!-- 请使用最新版本 -->
  </dependency>
  • 在 application.properties 中添加 type 配置


  spring.application.name=mybatis
  ​
  #  mybatis 配置数据库连接信息
  # 连接到 localhost 上的 MySQL 数据库,端口为 3306,数据库名为 test
  # 数据库驱动类为 com.mysql.cj.jdbc.Driver
  # 数据库用户名和密码分别为 root 和 123456
  ​
  # 默认数据库连接池使用的是 HikariCP
  # 如果想修改连接池的类型,可以在 application.properties 中添加以下配置
  # 以切换连接池为阿里巴巴的 Druid 连接池为例,添加以下配置即可,同时需要在 pom.xml 中添加 Druid 连接池的依赖
  # spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  ​
  spring.datasource.url=jdbc:mysql://localhost:3306/test
  spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  spring.datasource.username=root
  spring.datasource.password=123456

5.5、基于mybatis的注解实现数据库的增删改查

①、查找

在之前已经实现了,即测试数据库连接时使用的@Select注解

②、删除
  • 接口中添加删除语句,使用@Delete注解

  • 添加测试方法

  • 查看数据库是否删除成功

MyBatis 中 #{}${} 是两种不同的参数占位符,它们在 SQL 处理方式上有本质区别:

特性#{} (预编译占位符)${} (字符串替换)
处理方式预编译参数,生成 PreparedStatement直接文本替换,生成 Statement
安全性防止 SQL 注入,安全有 SQL 注入风险,不安全
数据类型自动处理类型转换直接替换,不处理类型
适用场景值参数(WHERE条件值等)动态表名、列名等非值部分
③、插入

和删除同理,不过如果要传入的参数过多,建议将其封装为一个类,直接传入该类对象即可

注意当切换依赖后,刷新后仍然报错可尝试手动清除maven缓存

④、修改

修改同上

⑤、补充
MyBatis @Update 注解中参数绑定的两种方式对比

在 MyBatis 中,您展示了两种参数传递方式,我将详细解释它们的区别和使用场景:

方式1:不使用 @Param 注解
  @Update("update student2 set name = #{name} where id = #{id}")
  public int update(String name, Integer id);

特点

  • MyBatis 默认使用参数索引名称:#{param1} 对应第一个参数,#{param2} 对应第二个参数

  • 但同时也支持直接使用参数名 #{name}#{id}(需要满足特定条件)

使用条件

  1. 使用 Java 8+ 编译时添加 -parameters 参数

  2. 或 MyBatis 配置了 useActualParamName=true(MyBatis 3.4.1+)

优点

  • 代码简洁

  • 不需要额外注解

缺点

  • 依赖编译配置,可移植性较差

  • 参数重命名时容易出错

方式2:使用 @Param 注解
  @Update("update student2 set name = #{name} where id = #{id}")
  public int update(@Param("name") String name, @Param("id") Integer id);

特点

  • 明确指定每个参数的名称

  • 在 SQL 中必须使用 @Param 指定的名称(#{name}#{id}

优点

  • 不依赖编译配置,可移植性好

  • 参数名明确,代码更易读

  • 重构时更安全(IDE 可以正确识别引用)

  • 支持复杂场景(如集合、多参数等)

缺点

  • 代码稍显冗长

最佳实践建议
  1. 生产代码推荐使用 @Param

    • 特别是多人协作项目

    • 需要长期维护的项目

  2. 简单项目/快速原型可以省略

    • 确保开发环境配置正确(Java 8+ 的 -parameters

    • 小型或个人项目

  3. 特别注意

    • 如果方法只有一个参数且是简单类型,通常不需要 @Param

    • 如果参数是对象(如 User),直接使用属性名即可(#{user.name}

  4. XML 配置方式:如果使用 XML 映射文件,@Param 几乎是必须的:

     <update id="update">
         UPDATE student2 SET name = #{name} WHERE id = #{id}
     </update>
版本兼容性说明
  • MyBatis 3.4.0 及之前:必须使用 @Param 或多参数方法的 param1 形式

  • MyBatis 3.4.1+:可以通过配置 useActualParamName=true 支持直接使用参数名

  • Spring Boot + MyBatis:Spring Boot 2.0+ 默认启用了 useActualParamName

选择哪种方式取决于您的项目需求、团队规范和开发环境配置。对于需要长期维护的严肃项目,明确使用 @Param 是更可靠的选择。

精简总结:当前基于 springboot 官方骨架创建的项目可不使用@Param 注解,基于其他骨架如阿里云创建的则不可省略

5.6、基于mybatis的xml映射配置实现数据库的增删改查

XML 映射文件是 MyBatis 的核心配置之一,用于定义 SQL 语句和映射规则。

默认规则:
  • XML 映射文件的名称与 Mapper 接口名称一致,并且将 XML 映射文件和 Mapper 接口放置在相同包下(同包同名)。

  • XML 映射文件的 namespace 属性为 Mapper 接口全限定名一致。

  • XML 映射文件中 SQL 语句的 id 与 Mapper 接口中的方法名一致,并保持返回类型一致。

  1. namespace:必须对应Mapper接口的全限定名

  2. id:必须对应接口方法名

  3. parameterType:可以省略,MyBatis通常能自动推断

  4. resultType/resultMap:指定结果映射

  5. #{}和{}:#{}是预编译参数,{}是字符串替换

如果未实现同包同名,即以上的两个默认规则,可在 application.properties 中自定义你的xml映射文件所处位置,可添加类似以下配置:

mybatis.mapper-locations = classpath:mapper/*.xml

即在类路径下resources中的mapper文件夹中寻找所有以xml结尾的文件

基础文件结构
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  ​
  <!--注意此处的 namespace 要和 UserMapper 接口的全限定名一致-->
  <mapper namespace="org.example.mybatis.mapper.UserMapper">
      <!--要执行的 SQL 语句-->
  </mapper>
常用SQL语句类型

注意以下SQL语句都是要插入到基础文件结构中的mapper标签内才可生效

1. SELECT 查询
  
  <!--  执行的是 UserMapper 接口中的 selectAll 方法 -->
  <!--  返回的类型是你自定义的类,需要写全限定名 -->
  <select id="selectAll" resultType="org.example.mybatis.pojo.User">
    SELECT * FROM student2
  </select>
  ​
  <select id="selectById" resultType="User" parameterType="Long">
      SELECT * FROM users WHERE id = #{id}
  </select>
   
  <!-- 结果映射到Map -->
  <select id="selectAsMap" resultType="map">
      SELECT id, username FROM users
  </select>
2. INSERT 插入
  
  <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
      INSERT INTO users(username, password) 
      VALUES(#{username}, #{password})
  </insert>
  ​
  <!-- 批量插入 -->
  <insert id="batchInsert">
      INSERT INTO users(username, email) VALUES
      <foreach collection="list" item="user" separator=",">
          (#{user.username}, #{user.email})
      </foreach>
  </insert>
3. UPDATE 更新
  <update id="updateUser" parameterType="User">
      UPDATE users 
      SET username=#{username}, password=#{password}
      WHERE id=#{id}
  </update>
4. DELETE 删除
  <delete id="deleteUser" parameterType="Long">
      DELETE FROM users WHERE id = #{id}
  </delete>

简单的 SQL 语句可使用注解进行,复杂的则建议使用 XML 映射

5.7、项目配置文件的优化

①、YAML 基本格式规范
  1. 键值对格式:键与值之间必须用 冒号 + 空格 分隔。

      
      port: 8080
      address: 127.0.0.1

  2. 缩进表示层级:

    • 只能使用空格不允许使用 Tab(IDEA 会自动将 Tab 替换为空格)。

    • 同层级元素必须左对齐。

  3. 注释:使用 # 开头,直到行尾的内容都会被忽略。

      
      # 这是注释

②、定义格式
定义对象(Map)
  user:
    name: 张三
    age: 18
    password: 123456
定义数组(List / Set)
  
  hobby:
    - java
    - game
    - sport
特殊注意:以 0 开头的值

如果配置项的值以 0 开头,必须用引号包裹,否则 YAML 会将其解析为八进制数

  # 错误示例(会被解析为八进制)
  code: 0123
  ​
  # 正确示例
  code: "0123"

故我们原来的application.properties文件可改为yaml文件的格式

  spring.application.name=mybatis
  spring.datasource.url=jdbc:mysql://localhost:3306/test
  spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  spring.datasource.username=root
  spring.datasource.password=123456
  ​
  # 以上是application.properties文件,以下是application.yml文件
  ​
  spring:
    application:
      name: mybatis
    datasource:
      url: jdbc:mysql://localhost:3306/test
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456

以上的 yaml 文件的定义格式大家可去看我的k8s的学习笔记,其中对于pod、deployment、statefulset等组件的定义均使用的是 yaml 文件的格式

至此基础便学习完成,当然部分maven高级知识我有分开单独学习,以及docker等工具的使用需要自行学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值