【Mybatis】单表多表查询,动态SQL使用

打印 上一主题 下一主题

主题 775|帖子 775|积分 2325

文章目录



单表查询操作

参数占位符#{}和${}



  • #{}:相当于JDBC里面替换占位符的操作方式(#{}->“”).相当于预编译处理(预编译处理可以防止SQL注入问题)
  • ${}:相当于直接替换(desc这种关键字),但这种不能预防SQL注入
  1. select * from userinfo where username='${name}'
复制代码
${} VS #{}


  • ${}是直接替换,#{}是预执行;
  • ${} 会存在SQL 注入问题,#{}不存在SQL注入问题
SQL 注入

  1. UserInfo userInfo = userMapper.login("admin","' or 1='1");
复制代码
  1. mysql> select * from userinfo where username = 'admin' and password ='' or 1='1';
  2. +----+----------+----------+-------+---------------------+---------------------+-------+
  3. | id | username | password | photo | createtime          | updatetime          | state |
  4. +----+----------+----------+-------+---------------------+---------------------+-------+
  5. |  1 | admin    | admin    |       | 2021-12-06 17:10:48 | 2021-12-06 17:10:48 |     1 |
  6. +----+----------+----------+-------+---------------------+---------------------+-------+
  7. 1 row in set (0.00 sec)
复制代码
like模糊查询



  • 用concat进行字符串拼接
  1.    <select id="findListByName" resultMap="BaseMap">
  2.         select * from userinfo where username like concat('%',#{name},'%')
  3.     </select>
复制代码
多表查询操作

一对一多表查询



  • 一对一的多表查询:
  • 需要设置resultMap中有个association标签,property对应实体类的属性名,resultMap是关联属性的字典映射(必须要设置),columnPrefix是设置前缀,当多表查询中有相同的字段的话,就会报错
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.ArticleInfoMapper">
  4.     <resultMap id="BaseMap" type="com.example.demo.model.ArticleInfo">
  5.         
  6.         <id property="id" column="id"></id>
  7.         
  8.         <result property="updatetime" column="updatetime"></result>
  9.         <result property="title" column="title"></result>
  10.         <result property="content" column="content"></result>
  11.         <result property="createtime" column="createtime"></result>
  12.         <result property="rcount" column="rcount"></result>
  13.         
  14.         <association property="user"
  15.                      resultMap="com.example.demo.mapper.UserMapper.BaseMap"
  16.                      columnPrefix="u_">
  17.         </association>
  18.     </resultMap>
  19.     <select id="getAll" resultType="com.example.demo.model.ArticleInfo">
  20.         select a.*,u.id from articleinfo as a left join userinfo as u on a.uid = u.id;
  21.     </select>
  22.     <select id="getAll2" resultMap="BaseMap">
  23.         select a.*,u.id as u_id ,u.username as u_username,u.password as u_password from articleinfo as a left join userinfo as u on a.uid = u.id;
  24.     </select>
  25. </mapper>
复制代码
一对多多表查询



  • collection标签,用法同association
  1. <resultMap id="BaseMapper2" type="com.example.demo.model.UserInfo">
  2.         
  3.         <id column="id" property="id"></id>
  4.         
  5.         <result column="username" property="name"></result>
  6.         <result column="password" property="password"></result>
  7.         <result column="photo" property="photo"></result>
  8.         <result column="createtime" property="createtime"></result>
  9.         <result column="updatetime" property="updatetime"></result>
  10.         
  11.         <collection property="artlist" resultMap="com.example.demo.mapper.ArticleInfoMapper.BaseMap"
  12.                     columnPrefix="a_"></collection>
  13.     </resultMap>
  14. <select id="getAll3" resultMap="BaseMapper2">
  15.         select u.*,a.id a_id,a.title a_title from userinfo u left join articleinfo a on u.id=a.uid
  16. </select>
复制代码
动态SQL使用

if标签



  • 注册分为必填和选填,如果在添加用户的时候有不确定的字段传入,就需要使用动态标签if来判断
  1. //p是传递过来的参数名,并不是表的字段名
  2. <insert id="add3">
  3.         insert into userinfo(username,password,
  4.         <if test="p!=null">
  5.          photo,
  6.         </if>
  7.          state)
  8.         values(#{username},#{password},
  9.         <if test="p!=null">
  10.             #{p},
  11.         </if>
  12.        #{state})
  13. </insert>
复制代码
trim标签



  • trim标签的属性:
  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:去掉最前面的符合条件的字符
  • suffixOverrides:去掉最后面的符合条件的字符
  1. <insert id="add4">
  2.         insert into userinfo
  3.         <trim prefix="(" suffix=")" suffixOverrides=",">
  4.             <if test="username!=null">
  5.                 username,
  6.             </if>
  7.             <if test="password!=null">
  8.                 password,
  9.             </if>
  10.             <if test="p!=null">
  11.                 photo,
  12.             </if>
  13.             <if test="state!=null">
  14.                 state,
  15.             </if>
  16.         </trim>
  17.         values
  18.         <trim prefix="(" suffix=")" suffixOverrides=",">
  19.             <if test="username!=null">
  20.                 #{username},
  21.             </if>
  22.             <if test="password!=null">
  23.                 #{password},
  24.             </if>
  25.             <if test="p!=null">
  26.                 #{p},
  27.             </if>
  28.             <if test="state!=null">
  29.                 #{state},
  30.             </if>
  31.         </trim>
  32.     </insert>
复制代码
where标签



  • where标签首先可以帮助我们生成where,如果有查询条件,那么就生成where,如果没有查询条件,就会忽略where
  • 其次where标签可以判断第一个查询条件前面有没有and,如果有则会删除
  1.   <select id="login2" resultType="com.example.demo.model.UserInfo">
  2.         select * from userinfo
  3.         <where>
  4.         <if test="username!=null">
  5.             username=#{username}
  6.         </if>
  7.         <if test="password!=null">
  8.             and password=#{password}
  9.         </if>
  10.         </where>
  11.     </select>
复制代码
set标签

和where的使用基本一样
可以自动帮助你处理最后一个逗号,并且自动写set
  1.     <update id="update" parameterType="map">
  2.         update blog
  3.         <set>
  4.             <if test="newTitle != null">
  5.                 title=#{newTitle},
  6.             </if>
  7.             <if test="newAuthor != null">
  8.                 author=#{newAuthor},
  9.             </if>
  10.             <if test="newViews != null">
  11.                 views = #{newViews}
  12.             </if>
  13.         </set>
  14.         <where>
  15.             <if test="id != null">
  16.                 id=#{id}
  17.             </if>
  18.             <if test="title != null">
  19.                 and title=#{title}
  20.             </if>
  21.             <if test="author != null">
  22.                 and author=#{author}
  23.             </if>
  24.             <if test="views != null">
  25.                 and views = #{views}
  26.             </if>
  27.         </where>
  28.     </update>
复制代码
foreach标签



  • foreach属性:
  • collection:参数集合的名字
  • item:给接下来要遍历的集合起的名字
  • open:加的前缀是什么
  • close:加的后缀是什么
  • separator:每次遍历之间间隔的字符串
  1. <delete id="dels">
  2.         delete from userinfo where id in
  3.         <foreach collection="list" item="item" open="(" close=")" separator="," >
  4.             #{item}
  5.         </foreach>
  6. </delete>
复制代码
先赞后看,养成习惯!!!^ _ ^♥♥♥
每天都更新知识点哦!!!
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘记关注我哦!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表