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>
-
XML声明:指定了XML文档的版本和编码。
<?xml version="1.0" encoding="UTF-8"?>
-
DOCTYPE声明:指定了XML文档的类型定义,用于验证XML映射文件的结构。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
mapper标签:
namespace
属性通常对应于一个Java接口的完全限定名
,MyBatis使用这个namespace来将XML映射文件中的操作与Java接口中的方法关联起来。<mapper namespace="com.example.mapper.UserMapper">
-
ResultMap:resultMap
定义了如何将数据库字段映射到Java对象的属性
。<id>
标签用于映射主键,<result>
标签用于映射其他字段。 -
Select操作:
select
标签定义了一个查询操作,id
属性对应于Java接口中的方法名
。resultMap
属性引用了上面定义的resultMap
,用于将查询结果映射到Java对象。<select id="selectUserById" resultMap="userResultMap"> SELECT user_id, username, email FROM users WHERE user_id = #{id} </select>
-
Insert操作:
insert
标签定义了一个插入操作,parameterType
属性指定了要插入对象的类型。parameterType
属性仅适用于传入一个参数的情况。<insert id="insertUser" parameterType="com.example.domain.User"> INSERT INTO users (username, email) VALUES (#{username}, #{email}) </insert>
-
Update操作:
update
标签定义了一个更新操作<update id="updateUser" parameterType="com.example.domain.User"> UPDATE users SET username = #{username}, email = #{email} WHERE user_id = #{id} </update>
-
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语句。以下是这些标签的详细说明和示例:
-
<if>
:条件判断,只有当指定的测试表达式为真时,才包含内部的SQL片段。<if test="id != null"> AND id = #{id} </if>
-
<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>
-
<where>
:自动生成WHERE
子句,并且处理AND
或OR
逻辑连接词,防止出现多余的逻辑词。<where> <if test="id != null"> id = #{id} </if> <if test="username != null"> AND username = #{username} </if> </where>
-
<trim>
:<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim> <!--名词解析--> prefix:若条件成立,在trim标签内sql语句前面加上前缀 prefixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,前面去掉多余前缀内容 suffix:若条件成立,在trim标签内sql语句后面加上后缀 suffixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,后面去掉多余后缀内容
参考↓
-
<foreach>
:迭代一个集合,通常用于IN
子句或批量操作(如批量插入、更新或删除)<foreach collection="list" item="item" separator=","> #{item} </foreach> #当需要在循环的开头和结尾添加字符的时候,可以使用foreach标签的open和close属性 <foreach collection="list" item="item" separator=",",open="(",close=")">
-
<set>
:??虚位以待
-
<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'
总是为真,这将导致查询返回所有用户的记录,从而绕过了身份验证。