mybatis之动态SQL

简介

动态Sql就是根据不同的条件生成不同的sql语句。

动态Sql的好处

使用JDBC 或其它类似的框架,我们都应该能理解根据不同条件拼接 SQL 语句是很困难的,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号等等,但是利用动态Sql可以很好地解决这样的问题。

什么是动态Sql

动态Sql元素和JSTL或类似XML的文本处理器相似。在Mybatis之前的版本中,有很多元素需要花时间去了解。然而Mybatis3大大精简了元素种类,我们只需要学习原来元素的一半就可以了。Mybatis采用功能强大的基于OGNL的表达式来淘汰其它大部分元素。

需要学习的元素

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

环境搭建

  • 数据库表

mybatis之动态SQL_第1张图片

  • 导入架包 

    
        
        
            mysql
            mysql-connector-java
            8.0.29
        
        
        
            org.mybatis
            mybatis
            3.5.1
        
        
        
            junit
            junit
            4.12
        
        
            org.projectlombok
            lombok
            1.18.26
        
    
    
    
        
            
                src/main/resource
                
                    **/*.properties
                    **/*.xml
                
                true
            
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                true
            
        
    
  •  编写核心配置文件

        
    
    
        
    
    
        
            
            
                
                
                
                
            
        
    

    
        
    
  • 编写实体类
@Data
public class Blog {
    private String id;
    private String title;
    private String author;
    private Date createTime;
    private int views;
}
  • 编写mapper接口及对应的mapper.xml文件
    • IF

      • mapper接口
      • public interface BlogMapper {
            //查询博客
            List queryBlogIf(Map map);
        
            //插入博客
            int updateBlog(Map map);
        }
      • mapper.xml文件
      •     
        
            
                update blog
                
                    
                        title=#{title},
                    
                    
                        author=#{author}
                    
                
                where id=#{id}
            
      •   测试
      •     @Test
            public void queryBlogIf(){
                SqlSession sqlSession = MybatisUtils.getSqlSession();
                BlogMapper mapper = sqlSession.getMapper( BlogMapper.class );
        
                HashMap map = new HashMap();
        //        map.put( "title","努力学java" );
                map.put( "author","来一沓Java" );
        
                List blogs = mapper.queryBlogIf( map );
                for(Blog blog:blogs){
                    System.out.println(blog);
                }
                sqlSession.close();
            }
        
            @Test
            public void updateBlog(){
                SqlSession sqlSession = MybatisUtils.getSqlSession();
                BlogMapper mapper = sqlSession.getMapper( BlogMapper.class );
        
                HashMap map = new HashMap();
                map.put( "title","努力学java1" );
                map.put( "author","来一沓Java" );
                map.put( "id","16c996067b8e40b2bdcc766102b2c9a6" );
        
                mapper.updateBlog( map );
                sqlSession.commit();
        
                sqlSession.close();
            }

        小结:动态Sql语句IF可以根据不同条件灵活选择sql语句。

  • trim (where, set):where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。set 元素用于动态更新语句的类似问题,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)
    • mapper接口
    • List queryBlogChoose(Map map);
    • mapper.xml文件
    •     
    • 测试
    •     @Test
          public void queryBlogChoose(){
              SqlSession sqlSession = MybatisUtils.getSqlSession();
              BlogMapper mapper = sqlSession.getMapper( BlogMapper.class );
      
              HashMap map = new HashMap();
      //        map.put( "title","努力学java" );
              map.put( "author","来一沓Java" );
      
              List blogs = mapper.queryBlogIf( map );
              for(Blog blog:blogs){
                  System.out.println(blog);
              }
              sqlSession.close();
          }
    •  choose (when, otherwise)

      • mapper接口
        • List queryBlogWhereChoose(Map map);
      • mapper.xml文件
        •     
      • 测试
        •     @Test
              public void queryBlogWhereChoose(){
                  SqlSession sqlSession = MybatisUtils.getSqlSession();
                  BlogMapper mapper = sqlSession.getMapper( BlogMapper.class );
          
                  HashMap map = new HashMap();
          //        map.put( "title","努力学java" );
                  map.put( "author","来一沓Java" );
                  map.put( "views",9999 );
          
                  List blogs = mapper.queryBlogWhereChoose( map );
                  for(Blog blog:blogs){
                      System.out.println(blog);
                  }
                  sqlSession.close();
              }

总结:所谓的动态SQL语句,本质上还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码。 

你可能感兴趣的:(Mybatis,mybatis,sql)