【SSM】MyBatis 操作数据库(重点:Mybatis两种使用方式)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文重点介绍ORM 框架和Mybatis的关系、如何通过注解 或者 通过XML配置文件的使用Mybatis,以及参数占位符 #{} 和 ${} 的区别, 什么是sql 注入。

【大家好,我是爱干饭的猿,本文重点介绍ORM 框架和Mybatis的关系、如何通过注解 或者 通过XML配置文件的使用Mybatis,以及参数占位符 #{} 和 ${} 的区别, 什么是sql 注入。

后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【SSM】Spring AOP 统一问题处理(重点:Spring AOP 实现原理)》


🤞目录🤞

🎁1.MyBatis 是什么?

🎁2. 什么是ORM框架?

🎁3. MyBatis 的使用

3.1 添加MyBatis框架支持

1. 新项目添加MyBatis框架

2. 旧项目添加MyBatis框架

3.2 配置连接字符串和MyBatis

1. 配置连接字符串

2. 配置 MyBatis 中的 XML 路径

3.3 通过注解使用Mybatis

1. 查询

2. 插入

3. 修改

4. 删除

5. 总览(增删查改)

3.4 通过XML配置文件的形式使用Mybatis

0. 关于resultMap

1. 查询

2. 插入

3. 修改

4. 删除

5. 总览(增删查改)

3.5 参数占位符 #{} 和 ${} 和 sql 注入


🎁1.MyBatis 是什么?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获 取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

简单来说 MyBatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具。

🎁2. 什么是ORM框架?

ORM 把数据库映射为对象:

    • 数据库表(table)--> 类(class)
    • 记录(record,行数据)--> 对象(object)
    • 字段(field) --> 对象的属性(attribute)

    一般的 ORM 框架,会将数据库模型的每张表都映射为一个 Java 类。 也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换。

    MyBatis 也是一个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在面向对象编程语言中,将关系型数据库中的数据 与对象建立起映射关系,进而自动的完成数据与对象的互相转换:

    1. 将输入数据(即传入对象)+SQL 映射成原生 SQL

    2. 将结果集映射为返回对象,即输出对象

    image.gif编辑

    一些其他框架:

      • Hibernate框架:偏向简化SQL的模式
      • MyBatis框架:偏向ORM的模式
      • Spring 内部提供的JdbcTemplate:偏向简化SQL的模式
      • JPA :完全倒向了ORM的形式,建表的过程都被抽象,我们看到的只有类(我写了类,框架根据类建表)

      🎁3. MyBatis 的使用

      3.1 添加MyBatis框架支持

      1. 新项目添加MyBatis框架

      image.gif编辑

      2. 旧项目添加MyBatis框架

      a. 使用 EditStarters插件

      image.gif编辑

      image.gif编辑b. 手动添加

      <!-- 把 DataSource对象注册到Spring 中-->
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
          </dependency>
          <!-- 添加 mybatis 框架 -->
          <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
          </dependency>
          <!-- 添加 MySQL 驱动 -->
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
          </dependency>

      image.gif

      3.2 配置连接字符串和MyBatis

      此步骤需要进行两项设置,数据库连接字符串设置和 MyBatis 的 XML 文件配置。

      1. 配置连接字符串

      如果是 application.yml 添加如下内容:

      spring:
        datasource:
          url: jdbc:mysql://127.0.0.1:3306/***?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456

      image.gif

      2. 配置 MyBatis 中的 XML 路径

      通过XML配置文件的形式使用Mybatis 时需要配置,通过注解使用Mybatis时,不需要配置

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

      image.gif

      3.3 通过注解使用Mybatis

      定义Mapper 接口

      @Repository // 消除报错
      @Mapper   // Mapper 注解
      public interface UserMapper {
      }

      image.gif

      1. 查询

      // 1. 查询
          // 1.1 通过uid 查询得到Map对象
          @Select("select uid, username, password from users where uid = #{uid}")
          Map<String, Object> select1(@Param("uid") int uid);
          // 1.2 通过uid 查询得到User类对象
          @Select("select uid, username, password from users where uid = #{uid}")
          UserDO select2(@Param("uid") int uid);

      image.gif

      2. 插入

      // 2. 插入
          // 2.1 插入,返回插入成功的条数
          @Insert("insert into users (username, password) values (#{username}, #{password})")
          int insert1(UserDO userDO);
          // 2.2 由于用不到这个返回值,所以写成 void 更常见
          @Insert("insert into users (username, password) values (#{username}, #{password})")
          void insert2(UserDO userDO);
          // 2.3 插入后拿到自增id
          // 通过 @Options 注解,添加一些配置,得到自增主键,设置成 uid
          // keyProperty : 对象的属性名是 uid
          // keyColumn : 表的字段名的 uid
          @Insert("insert into users (username, password) values (#{username}, #{password})")
          @Options(useGeneratedKeys = true, keyProperty = "uid", keyColumn = "uid")
          void insert3(UserDO userDO);

      image.gif

      3. 修改

      // 3. 修改
          @Update("update users set username = #{username}, password = #{password} where uid = #{uid}")
          int update(UserDO userDO);

      image.gif

      4. 删除

      // 4. 删除
          @Delete("delete from users where uid = #{uid}")
          int delete(@Param("uid") int uid);

      image.gif

      5. 总览(增删查改)

      import org.apache.ibatis.annotations.*;
      import org.springframework.stereotype.Repository;
      import java.util.Map;
      @Repository // 消除报错
      @Mapper   // Mapper 注解
      public interface UserMapper {
          // 1. 查询
          // 1.1 通过uid 查询得到Map对象
          @Select("select uid, username, password from users where uid = #{uid}")
          Map<String, Object> select1(@Param("uid") int uid);
          // 1.2 通过uid 查询得到User类对象
          @Select("select uid, username, password from users where uid = #{uid}")
          UserDO select2(@Param("uid") int uid);
          // 2. 插入
          // 2.1 插入,返回插入成功的条数
          @Insert("insert into users (username, password) values (#{username}, #{password})")
          int insert1(UserDO userDO);
          // 2.2 由于用不到这个返回值,所以写成 void 更常见
          @Insert("insert into users (username, password) values (#{username}, #{password})")
          void insert2(UserDO userDO);
          // 2.3 插入后拿到自增id
          // 通过 @Options 注解,添加一些配置,得到自增主键,设置成 uid
          // keyProperty : 对象的属性名是 uid
          // keyColumn : 表的字段名的 uid
          @Insert("insert into users (username, password) values (#{username}, #{password})")
          @Options(useGeneratedKeys = true, keyProperty = "uid", keyColumn = "uid")
          void insert3(UserDO userDO);
          // 3. 修改
          @Update("update users set username = #{username}, password = #{password} where uid = #{uid}")
          int update(UserDO userDO);
          // 4. 删除
          @Delete("delete from users where uid = #{uid}")
          int delete(@Param("uid") int uid);
      }

      image.gif

      3.4 通过XML配置文件的形式使用Mybatis

      先配置 MyBatis 中的 XML 路径,然后在mapper下 .xml 文件中写

      image.gif编辑

      定义Mapper 接口:

      import org.apache.ibatis.annotations.Mapper;
      import org.apache.ibatis.annotations.Param;
      import org.springframework.stereotype.Repository;
      import java.util.List;
      @Repository
      @Mapper
      public interface UserMapper {
          // 1. 查询
          // 1.1 单个查询
          User selectOneByUid(@Param("uid") int uid);
          // 1.2 多个查询
          List<User> selectListByUidList(@Param("uidList") List<Integer> uidList);
          // 1.3 动态查询
          User selectByUser(@Param("user") User user);
          // 2. 插入
          // 2.1 单个插入
          int insertOneUser(@Param("user") User user);
          // 2.1 批量插入
          int insertBatch(@Param("userList") List<User> userList);
          // 3. 修改
          void update(int uid , String username);
          // 4. 删除
          void delete(int uid);
      }

      image.gif

      0. 关于resultMap

      使用场景:

        • 字段名称和程序中的属性名不同的情况,可使用 resultMap 配置映射;
        • 一对一和一对多关系可以使用 resultMap 映射并查询数据。
        <!-- 返回字典映射-->
            <resultMap id="xxx" type="com.haomin.mybatis_xml.User">
                <id property="uid" javaType="Integer" column="uid" jdbcType="INTEGER" />
                <result property="username" javaType="String" column="username" jdbcType="VARCHAR" />
                <result property="password" column="password" />
            </resultMap>

        image.gif

        image.gif编辑

        1. 查询

        <!-- 1.1 单个查询 -->
            <select id="selectOneByUid" resultType="com.haomin.mybatis_xml.User" parameterType="int">
                select uid, username, password from users where uid = #{uid}
            </select>
            <!-- 1.2 多个查询 -->
            <select id="selectListByUidList" resultMap="xxx" parameterType="List">
                select uid, username, password from users where uid in (
                    <foreach collection="uidList" item="id" separator=", ">
                        #{id}
                    </foreach>
                ) order by uid
            </select>
            <!-- 1.3 动态查询-->
            <select id="selectByUser" resultMap="xxx" parameterType="com.haomin.mybatis_xml.User">
                select uid, username, password from users where
                <if test="user.uid != null">
                    uid = #{user.uid}
                </if>
                <if test="user.username != null">
                    and username = #{user.username}
                </if>
                <if test="user.password != null">
                    and password = #{user.password}
                </if>
            </select>

        image.gif

        2. 插入

        <!-- 2.1 单个插入-->
            <insert id="insertOneUser" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
                insert into users (username, password) values
                (#{user.username}, #{user.password})
            </insert>
            <!-- 2.2 批量插入-->
            <insert id="insertBatch" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
                insert into users (username, password) values
                <foreach collection="userList" item="user" separator=", ">
                    (#{user.username}, #{user.password})
                </foreach>
            </insert>

        image.gif

        3. 修改

        <!-- 3. 修改-->
            <update id="update">
                update users set username = #{username} where uid = #{uid}
            </update>

        image.gif

        4. 删除

        <!-- 4. 删除-->
            <delete id="delete">
                delete from users where uid = #{uid}
            </delete>

        image.gif

        5. 总览(增删查改)

        <?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">
        <mapper namespace="com.haomin.mybatis_xml.UserMapper">
            <!-- 返回字典映射-->
            <resultMap id="xxx" type="com.haomin.mybatis_xml.User">
                <id property="uid" javaType="Integer" column="uid" jdbcType="INTEGER" />
                <result property="username" javaType="String" column="username" jdbcType="VARCHAR" />
                <result property="password" column="password" />
            </resultMap>
            <!-- 1.1 单个查询 -->
            <select id="selectOneByUid" resultType="com.haomin.mybatis_xml.User" parameterType="int">
                select uid, username, password from users where uid = #{uid}
            </select>
            <!-- 1.2 多个查询 -->
            <select id="selectListByUidList" resultMap="xxx" parameterType="List">
                select uid, username, password from users where uid in (
                    <foreach collection="uidList" item="id" separator=", ">
                        #{id}
                    </foreach>
                ) order by uid
            </select>
            <!-- 1.3 动态查询-->
            <select id="selectByUser" resultMap="xxx" parameterType="com.haomin.mybatis_xml.User">
                select uid, username, password from users where
                <if test="user.uid != null">
                    uid = #{user.uid}
                </if>
                <if test="user.username != null">
                    and username = #{user.username}
                </if>
                <if test="user.password != null">
                    and password = #{user.password}
                </if>
            </select>
            <!-- 2.1 单个插入-->
            <insert id="insertOneUser" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
                insert into users (username, password) values
                (#{user.username}, #{user.password})
            </insert>
            <!-- 2.2 批量插入-->
            <insert id="insertBatch" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
                insert into users (username, password) values
                <foreach collection="userList" item="user" separator=", ">
                    (#{user.username}, #{user.password})
                </foreach>
            </insert>
            <!-- 3. 修改-->
            <update id="update">
                update users set username = #{username} where uid = #{uid}
            </update>
            <!-- 4. 删除-->
            <delete id="delete">
                delete from users where uid = #{uid}
            </delete>
        </mapper>

        image.gif

        当然还有更多用法:可以参考 Mybatis 官方文档

        3.5 参数占位符 #{} 和 ${} 和 sql 注入

        #{}:预编译处理。

        ${}:字符直接替换。

        #{}预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使用 PreparedStatement 的 set 方法来赋值,编译后会带上 ‘ ’。

        ${}直接替换:是 MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

        结论:

          • 用于查询的字段,尽量使用 #{} 预查询的方式,如果用${} 可能会出现sql注入问题。
          • 使用 ${sort} 可以实现排序查询或者分页,而使用 #{sort} 就不能实现排序查询了,因为当使用 #{sort} 查询时,如果传递的值为 String 则会加单引号,就会导致 sql 错误。

          sql 注入代码例子:

          执行:

          select * from userinfo where username = '${name}' and password = '${pwd}'

          image.gif

          当sql 为 : ' or 1=1  时

          执行语句:

          select * from users where username = ' or 1=1  and password = ' or 1=1;

          image.gif


          当然,Mybatis 还有更多用法:可以参考 Mybatis 官方文档

          分享到此,感谢大家观看!!!

          如果你喜欢这篇文章,请点赞关注吧,或者如果你对文章有什么困惑,可以私信我。

          🏓🏓🏓

          相关实践学习
          如何快速连接云数据库RDS MySQL
          本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
          全面了解阿里云能为你做什么
          阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
          相关文章
          基于ssm的社区物业管理系统,附源码+数据库+论文+任务书
          社区物业管理系统采用B/S架构,基于Java语言开发,使用MySQL数据库。系统涵盖个人中心、用户管理、楼盘管理、收费管理、停车登记、报修与投诉管理等功能模块,方便管理员及用户操作。前端采用Vue、HTML、JavaScript等技术,后端使用SSM框架。系统支持远程安装调试,确保顺利运行。提供演示视频和详细文档截图,帮助用户快速上手。
          177 17
          基于ssm的培训学校教学管理平台,附源码+数据库+论文
          金旗帜文化培训学校网站项目包含管理员、教师和用户三种角色,各角色功能通过用例图展示。技术框架采用Java语言,B/S架构,前端为Vue+HTML+CSS+LayUI,后端为SSM,数据库为MySQL,运行环境为JDK8+Tomcat8.5。项目含12张数据库表,非前后端分离,支持演示视频与截图查看。购买后提供免费安装调试服务,确保顺利运行。
          74 14
          基于ssm的培训学校教学管理平台,附源码+数据库+论文
          该项目为一培训学校教学管理平台,涵盖管理员、教师和学生三大功能模块。管理员可进行系统全面管理,包括学生、教师、课程等信息的增删改查;教师能管理个人中心、课程及选课信息;学生则可管理个人中心及选课信息。技术框架采用Java编程语言,基于B/S架构,前端使用Vue+HTML+JavaScript+CSS+LayUI,后端采用SSM框架,数据库为MySQL。项目运行环境为JDK8+MySQL5.7+Tomcat8.5,支持远程调试安装。演示视频与详细文档截图均提供下载链接。
          基于ssm的台球厅管理系统,附源码+数据库+论文
          本项目为新锐台球厅管理系统,支持管理员和会员两种角色。管理员可进行会员管理、台球桌管理、订单管理等;会员可查看台球桌、预约、购买商品等。技术框架基于Java,采用B/S架构,前端使用Vue+HTML+JavaScript+CSS+LayUI,后端使用SSM框架,数据库为MySQL。运行环境为Windows,JDK8+MySQL5.7+Tomcat8.5。提供演示视频及详细文档截图。
          基于ssm的考研图书电子商务平台,附源码+数据库+论文
          考研图书电子商务平台是一个基于Java的B/S架构系统,适用于Windows环境。该平台设有管理员和用户权限,管理员可管理商品、用户、留言板及订单,用户可管理收货地址、订单、收藏及购买商品。技术框架包括前端Vue+HTML+JavaScript+CSS+LayUI,后端SSM,数据库为MySQL。项目包含17个数据库表,支持Maven构建。提供演示视频和详细文档,支持免费远程调试安装,确保顺利运行。
          66 13
          基于ssm的考研图书电子商务平台,附源码+数据库+论文
          基于ssm的网络直播带货管理系统,附源码+数据库+论文
          该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
          121 10
          基于ssm的超市会员(积分)管理系统,附源码+数据库+论文,包安装调试
          本项目为简单内容浏览和信息处理系统,具备管理员和员工权限。管理员可管理会员、员工、商品及积分记录,员工则负责积分、商品信息和兑换管理。技术框架采用Java编程语言,B/S架构,前端使用Vue+JSP+JavaScript+Css+LayUI,后端为SSM框架,数据库为MySQL。运行环境为Windows,JDK8+Tomcat8.5,非前后端分离的Maven项目。提供演示视频和详细文档,购买后支持免费远程安装调试。
          212 19
          [Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
          OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
          192 17
          【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
          本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
          605 6
          AI助理
          登录插画

          登录以查看您的控制台资源

          管理云资源
          状态一览
          快捷访问

          你好,我是AI助理

          可以解答问题、推荐解决方案等