Mybatis详解动态SQL以及单表多表查询的应用

单表查询操作

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

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

${} VS #{}

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

SQL 注入

UserInfo userInfo = userMapper.login("admin","' or 1='1");
mysql> select * from userinfo where username = 'admin' and password ='' or 1='1';
+----+----------+----------+-------+---------------------+---------------------+-------+
| id | username | password | photo | createtime          | updatetime          | state |
+----+----------+----------+-------+---------------------+---------------------+-------+
|  1 | admin    | admin    |       | 2021-12-06 17:10:48 | 2021-12-06 17:10:48 |     1 |
+----+----------+----------+-------+---------------------+---------------------+-------+
1 row in set (0.00 sec)

like模糊查询

用concat进行字符串拼接

   

多表查询操作

一对一多表查询

一对一的多表查询:需要设置resultMap中有个association标签,property对应实体类的属性名,resultMap是关联属性的字典映射(必须要设置),columnPrefix是设置前缀,当多表查询中有相同的字段的话,就会报错




    
        
        
        
        
        
        
        
        
        
        
        
    
    
    

一对多多表查询

collection标签,用法同association

 
        
        
        
        
        
        
        
        
        
        
    
 

动态SQL使用

if标签

注册分为必填和选填,如果在添加用户的时候有不确定的字段传入,就需要使用动态标签if来判断

//p是传递过来的参数名,并不是表的字段名
 
        insert into userinfo(username,password,
        
         photo,
        
         state)
        values(#{username},#{password},
        
            #{p},
        
       #{state})
 

trim标签

trim标签的属性

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:去掉最前面的符合条件的字符
  • suffixOverrides:去掉最后面的符合条件的字符
 
        insert into userinfo
        
            
                username,
            
            
                password,
            
            
                photo,
            
            
                state,
            
        
        values
        
            
                #{username},
            
            
                #{password},
            
            
                #{p},
            
            
                #{state},
            
        
    

where标签

where标签首先可以帮助我们生成where,如果有查询条件,那么就生成where,如果没有查询条件,就会忽略where

其次where标签可以判断第一个查询条件前面有没有and,如果有则会删除

  

set标签

和where的使用基本一样

可以自动帮助你处理最后一个逗号,并且自动写set

    
        update blog
        
            
                title=#{newTitle},
            
            
                author=#{newAuthor},
            
            
                views = #{newViews}
            
        
        
            
                id=#{id}
            
            
                and title=#{title}
            
            
                and author=#{author}
            
            
                and views = #{views}
            
        
    

foreach标签

  • foreach属性:
  • collection:参数集合的名字
  • item:给接下来要遍历的集合起的名字
  • open:加的前缀是什么
  • close:加的后缀是什么
  • separator:每次遍历之间间隔的字符串
 
        delete from userinfo where id in
        
            #{item}
        
 

到此这篇关于Mybatis详解动态SQL以及单表多表查询的应用的文章就介绍到这了,更多相关Mybatis动态SQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(Mybatis详解动态SQL以及单表多表查询的应用)