Mybatis-XML 映射文件

Mybatis-XML 映射文件

XML映射文件是MyBatis框架中的一个核心组件,它用于定义SQL语句与Java方法之间的映射关系。这些文件通常以.xml为文件扩展名,它们包含了MyBatis用来将SQL语句与Java代码连接起来的配置和映射信息。


以下是一个标准的MyBatis XML映射文件的例子,它包含了几个常用的SQL操作:选择(Select)、插入(Insert)、更新(Update)和删除(Delete)。

<?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.example.mapper.UserMapper">

    <!-- ResultMap用于定义如何将数据库列映射到Java对象的属性 -->
    <resultMap id="userResultMap" type="com.example.domain.User">
        <id property="id" column="user_id" />
        <result property="username" column="username" />
        <result property="email" column="email" />
    </resultMap>

    <!-- 定义一个查询操作,通过用户ID查询用户信息 -->
    <select id="selectUserById" resultMap="userResultMap">
        SELECT user_id, username, email
        FROM users
        WHERE user_id = #{id}
    </select>

    <!-- 定义一个插入操作,插入新用户 -->
    <insert id="insertUser" parameterType="com.example.domain.User">
        INSERT INTO users (username, email)
        VALUES (#{username}, #{email})
    </insert>

    <!-- 定义一个更新操作,更新用户信息 -->
    <update id="updateUser" parameterType="com.example.domain.User">
        UPDATE users
        SET username = #{username}, email = #{email}
        WHERE user_id = #{id}
    </update>

    <!-- 定义一个删除操作,通过用户ID删除用户 -->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM users
        WHERE user_id = #{id}
    </delete>

    <!-- 定义一个查询操作,查询所有用户信息 -->
    <select id="selectAllUsers" resultMap="userResultMap">
        SELECT user_id, username, email
        FROM users
    </select>

</mapper>
  1. XML声明:指定了XML文档的版本和编码。

    <?xml version="1.0" encoding="UTF-8"?>
    
  2. DOCTYPE声明:指定了XML文档的类型定义,用于验证XML映射文件的结构。

    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
  3. mapper标签namespace属性通常对应于一个Java接口的完全限定名,MyBatis使用这个namespace来将XML映射文件中的操作与Java接口中的方法关联起来。

    <mapper namespace="com.example.mapper.UserMapper">
    
  4. ResultMap:resultMap定义了如何将数据库字段映射到Java对象的属性<id>标签用于映射主键,<result>标签用于映射其他字段。

  5. Select操作select标签定义了一个查询操作,id属性对应于Java接口中的方法名resultMap属性引用了上面定义的resultMap,用于将查询结果映射到Java对象。

    <select id="selectUserById" resultMap="userResultMap">
        SELECT user_id, username, email
        FROM users
        WHERE user_id = #{id}
    </select>
    
  6. Insert操作insert标签定义了一个插入操作,parameterType属性指定了要插入对象的类型。parameterType属性仅适用于传入一个参数的情况。

    <insert id="insertUser" parameterType="com.example.domain.User">
        INSERT INTO users (username, email)
        VALUES (#{username}, #{email})
    </insert>
    
  7. Update操作update标签定义了一个更新操作

    <update id="updateUser" parameterType="com.example.domain.User">
        UPDATE users
        SET username = #{username}, email = #{email}
        WHERE user_id = #{id}
    </update>
    
  8. Delete操作delete标签定义了一个删除操作

    <select id="selectAllUsers" resultMap="userResultMap">
        SELECT user_id, username, email
        FROM users
    </select>
    
参数传入

在MyBatis的XML映射文件中,parameterType属性用于指定映射语句的输入参数类型。当传入参数有两个以上的时候,parameterType属性便不再适用,这个时候,可以在DAO接口方法中,使用@Param注解为每个参数命名。也可以在DAO接口的方法参数中传入Map类型参数,为不同的对象取名作为就是相应的对象(这种方法这里只提及,不做介绍)。

void updateUser(@Param("user") User user, @Param("email") Email email)

此时,在xml映射文件对应的位置中,便不再需要使用parameterType属性了。当在xml映射文件中存在两个以上对象,需要在xml映射文件中使用点分表示法引用不同对象的属性。

<update id="updateUser">
    UPDATE users
    SET email = #{email.email} WHERE user_id = #{user.id}
</update>

在这个例子中:

  • #{email.email}引用了Email对象的email属性。
  • #{user.id}引用了User对象的id属性。
动态sql元素

MyBatis 动态SQL功能通过一系列特定的XML标签来实现,这些标签允许开发者根据不同的条件动态地构建SQL语句。以下是这些标签的详细说明和示例:

  1. <if>:条件判断,只有当指定的测试表达式为真时,才包含内部的SQL片段。

    <if test="id != null">
      AND id = #{id}
    </if>
    
  2. <choose>, <when>, <otherwise>:类似于编程语言中的if-else结构,<choose>开始一个条件选择,<when>表示满足条件时的SQL片段,<otherwise>表示其他情况下的SQL片段。

    <choose>
      <when test="status == 'active'">
        AND status = #{status}
      </when>
      <otherwise>
        AND status IS NULL
      </otherwise>
    </choose>
    
  3. <where>:自动生成WHERE子句,并且处理ANDOR逻辑连接词,防止出现多余的逻辑词。

    <where>
      <if test="id != null">
        id = #{id}
      </if>
      <if test="username != null">
        AND username = #{username}
      </if>
    </where>
    
  4. <trim>

    <trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
    <!--名词解析-->
    prefix:若条件成立,在trim标签内sql语句前面加上前缀
    prefixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,前面去掉多余前缀内容
    suffix:若条件成立,在trim标签内sql语句后面加上后缀
    suffixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,后面去掉多余后缀内容
    

    参考↓

    mybatis的xml中<trim>标签的用法_xml trim-优快云博客

  5. <foreach>:迭代一个集合,通常用于IN子句或批量操作(如批量插入、更新或删除)

    <foreach collection="list" item="item" separator=",">
      #{item}
    </foreach>
    #当需要在循环的开头和结尾添加字符的时候,可以使用foreach标签的open和close属性
     <foreach collection="list" item="item" separator=",",open="(",close=")">
    
  6. <set>:??

    虚位以待
    
  7. <bind><bind>标签通常在<where><set>标签中使用,用于创建一个局部变量。

    <bind name="变量名" value="表达式"/>
    
    • 表达式可以是任何合法的Java表达式,它可以包含引用其他变量和调用Java方法的逻辑。

拓展:

SQL注入

(ai所写,真假自辨,我看sql举例那里有问题)

SQL注入(SQL Injection)是一种常见的网络攻击技术,攻击者通过在Web应用程序的输入字段中插入恶意SQL代码,来欺骗数据库服务器执行非授权的SQL命令。这种攻击可以导致数据泄露、数据篡改、身份盗窃、会话劫持,甚至完全控制系统。

SQL注入攻击的原理是利用了应用程序安全漏洞,这些漏洞允许攻击者将SQL代码注入到原本的查询中。如果应用程序没有正确地过滤或转义用户输入,攻击者的SQL代码就会被数据库服务器执行。

例如,一个典型的登录表单可能包含用户名和密码字段。如果后端的SQL查询是这样构造的:

SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "'

攻击者可以通过输入特殊的用户名和密码来尝试执行SQL命令,例如:

username: ' OR '1'='1
password: anything

这个输入会导致SQL查询变成:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'anything'

由于 '1'='1' 总是为真,这将导致查询返回所有用户的记录,从而绕过了身份验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值