当前位置: 代码迷 >> 综合 >> [SSM] Mapper.xml的sql语句
  详细解决方案

[SSM] Mapper.xml的sql语句

热度:97   发布时间:2023-11-19 14:57:40.0

一、增删改查

1. 增:给数据库增加一个用户

<insert id="addUser" parameterType="User">insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>

2. 删:根据id删除一个用户

<delete id="deleteUser" parameterType="int">delete from user where id = #{id}
</delete>

3. 改:修改用户的信息

<update id="updateUser" parameterType="User">update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>

4. 查:根据id查询用户

<select id="selectUserById" resultType="User">select * from user where id = #{id}
</select>

二、参数的传递

1. 直接在方法中传递参数

  • 在接口方法的参数前加 @Param属性,Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型。接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
User selectUserById(@Param("id") Int id);
User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
  • 如果参数是pojo类,那么就不用加@Param属性
int addUser(User user);

参数直接传递时,对应的mapper.xml语句和上面的一样

2. 使用万能的Map

如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可

User selectUserByNP2(Map<String,Object> map);

使用map传参时,对应的mapper.xml需要对应修改:

<select id="selectUserByNP2" parameterType="map" resultType="User">
select * from user where name = #{username} and pwd = #{pwd}
</select>

三、大于小于和xml标签解析冲突的写法

1. 使用转义字符

字符 > >= < <= " &
转义字符 &gt; &gt;= &lt; &lt;= &quot; &apos; &amp;
where create_date_time >= #{startTime}
//改为
where create_date_time &gt;= #{startTime}

2. 将sql语句写在 <![CDATA[...]]> 中, 其中的特殊符号不进行解析.

where create_date_time <![CDATA[ >= ]]> #{startTime}

四、#{}和${}的区别

  • #{}是预编译处理,${}是字符串替换。
  • Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;
  • Mybatis 在处理${}时,就是把${}替换成变量的值。
  • 使用#{}可以有效的防止 SQL 注入,提高系统安全性
  • 在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。

五、sql标签的使用

sql元素标签用来定义可重复使用的SQL代码片段,使用时只需要用include元素标签引用即可,最终达到SQL语句重用的目的;同时它可以被静态地(在加载参数) 参数化,不同的属性值通过包含的实例变化,比如:

方式一:

//建立sql片段
<sql id="query_user_where"><if test="id!=null and id!=''">and id=#{id}</if><if test="username!=null and username!=''">and username like '%${username}%'</if>
</sql>//使用include引用sql片段
<select id="findUserList" parameterType="user" resultType="user">select * from user<where><include refid="query_user_where"/></where>
</select>//引用其它mapper.xml的sql片段
<include refid="namespace.sql片段"/>

方式二:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

这个 SQL 片段可以被包含在其他语句中,例如:

<select id="selectUsers" resultType="map">select<include refid="userColumns"><property name="alias" value="t1"/></include>,<include refid="userColumns"><property name="alias" value="t2"/></include>from some_table t1cross join some_table t2
</select>

属性值也可以被用在 include 元素的 refid 属性里

<include refid="${include_target}"/>
  相关解决方案