MyBatis 动态sql详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 动态sql详解相关的知识,希望对你有一定的参考价值。

MyBatis的动态sql语句

1.if 条件

2.choose , when 和 otherwise条件

3.where 条件

where条件:1.自动加上where。2.如果where子句以and或者or开头,则自动删除第一个and或者or。。所以我们不需要自己加where

4.trim 条件

trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能。

5.forEach循环

6.set 条件

set条件:自动加上set,自动去除最后一个逗号

下面示例代码:

1.mapper接口

package com.maya.mappers;
import java.util.List;
import java.util.Map;
import com.maya.model.Student;

public interface StudentMapper {
    public List<Student> saerchStudent(Map<String, Object> param);//if查询
    
    public List<Student> saerchStudent2(Map<String, Object> param);//choose查询
    
    public List<Student> searchStudent3(Map<String, Object> param);//where查询
    
    public List<Student> searchStudent4(Map<String, Object> param);//trim查询
    
    public List<Student> searchStudent5(Map<String, Object> param);//forEach查询,一般用在 in() 
    
    public int updateStudent(Student student);//set动态修改
}

2.mapper.xml

<?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.maya.mappers.StudentMapper">
    <resultMap type="Student" id="StudentResult">
        <id property="snumber" column="son" />
        <result property="name" column="sname" />
        <result property="sex" column="sex" />
    </resultMap>
    
    
    <!-- if查询 -->
    <select id="saerchStudent" parameterType="Map" resultMap="StudentResult">
        select * from student
        where 1=1
        <if test="sno!=null">
            and son=#{sno}
        </if>
        <if test="name!=null">
            and sname like #{name}
        </if>
        <if test="sex!=null">
            and sex=#{sex}
        </if>
    </select>
    
    
    <!-- choose查询 -->
    <select id="saerchStudent2" parameterType="Map" resultMap="StudentResult">
        select * from student
        <choose>
            <when test="searchBy==‘son‘">
                where son=#{sno}
            </when>
            <when test="searchBy==‘name‘">
                where sname like #{name}
            </when>
            <otherwise>
                where 1=1
            </otherwise>
        </choose>
    </select>
    
    
    <!-- where查询 -->
    <!-- where条件:1.自动加上where。2.如果where子句以and或者or开头,则自动删除第一个and或者or。。所以我们不需要自己加where -->
    <select id="searchStudent3" parameterType="Map" resultMap="StudentResult">
        select * from student
        <where>
            <if test="sno!=null"><!-- 第一个也可以加上and,不过纯属多此一举!! -->
                son=#{sno}
            </if>
            <if test="name!=null">
                and sname like #{name}
            </if>
            <if test="sex!=null">
                and sex=#{sex}
            </if>
        </where>
    </select>
    
    
    <!-- trim查询 -->
    <!-- trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能。
        1.前缀:prefix="where",是一定要加上的
        2.prefixOverrides="and/or",替换掉第一个and或者or
        3.后缀:suffix="",一般sql语句根本用不到,或许很复杂的sql才会用到吧
     -->
    <select id="searchStudent4" parameterType="Map" resultMap="StudentResult">
        select * from student
        <trim prefix="where" prefixOverrides="and|or" ><!-- 这样trim的就完成了where的功能,where开头,替换子句的第一个and或者where -->
            <if test="sno!=null">
                son=#{sno}
            </if>
            <if test="name!=null">
                and sname like #{name}
            </if>
            <if test="sex!=null">
                and sex=#{sex}
            </if>
        </trim>
    </select>
    
    
    <!-- forEach查询 -->
    <!-- 例如in查询时
        1.collection:接收的参数
        2.item:自己定义的参数变量
        3.open="(" separator="," close=")"  : 这个一看就明白了吧。
        4.mybatis可以接受一个集合,也可以接收一个数组,具体详情查帮助文档
     -->
    <select id="searchStudent5" parameterType="Map" resultMap="StudentResult">
        select * from student
        <where>
            <if test="snos!=null">        
                son in
                <foreach item="ids" collection="snos" open="(" separator="," close=")">
                    #{ids}
                </foreach>
            </if>
            <if test="name!=null">
                and sname like #{name}
            </if>
            <if test="sex!=null">
                and sex=#{sex}
            </if>
        </where>
    </select>
    
    
    <!-- set动态修改 -->
    <!-- 
        众所周知,修改的sql语句是 update 表名 set 字段名=值,字段名=值,字段名=值  where id=1;
        MyBatis的set动态sql,
        1.自动帮助你加上set;
        2.并且自动去除掉最后一个,号
        注意:别忘记加逗号!!!
     -->
    <update id="updateStudent" parameterType="Student">
        update student
        <set>
            <if test="name!=null">
                sname=#{name},<!-- 千万不要忘记加逗号 -->
            </if>
            <if test="sex!=null">
                sex=#{sex},
            </if>
        </set>
        where son=#{snumber}
    </update>
</mapper>

3.junit测试类

package com.maya.service;

import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.maya.mappers.StudentMapper;
import com.maya.model.Student;
import com.maya.util.MyBatisUtil;

public class JunitTest {
    private static Logger logger=Logger.getLogger(JunitTest.class);
    private SqlSession sqlSession=null;
    private StudentMapper studentMapper=null;

    @Before
    public void setUp() throws Exception {
        sqlSession=MyBatisUtil.openSession();
        studentMapper=sqlSession.getMapper(StudentMapper.class);
    }

    @After
    public void tearDown() throws Exception {
        sqlSession.close();
    }

    @Test
    //if查询
    public void testSerach() {
        logger.info("动态sql---if查询");
        Map<String, Object> param=new HashMap<String, Object>();
        //param.put("sno", "107");
        param.put("name", "%军%");
        param.put("sex", "男");
        List<Student> list=studentMapper.saerchStudent(param);
        System.out.println(list);
    }
    
    
    @Test
    //choose查询
    public void testSerach2() {
        logger.info("动态sql---choose查询");
        Map<String, Object> param=new HashMap<String, Object>();
        param.put("searchBy", "son");
        param.put("sno", "107");
        param.put("name", "%军%");
        param.put("sex", "女");
        List<Student> list=studentMapper.saerchStudent2(param);
        System.out.println(list);
    }
    
    
    @Test
    //where查询
    public void testSerach3() {
        logger.info("动态sql---where查询");
        Map<String, Object> param=new HashMap<String, Object>();
        //param.put("sno", "107");
        param.put("name", "%军%");
        //param.put("sex", "男");
        List<Student> list=studentMapper.searchStudent3(param);
        System.out.println(list);
    }
    
    
    @Test
    //trim查询
    public void testSerach4(){
        logger.info("动态sql---trim查询");
        Map<String, Object> param=new HashMap<String, Object>();
        //param.put("sno", "107");
        //param.put("name", "%军%");
        param.put("sex", "男");
        List<Student> list=studentMapper.searchStudent4(param);
        System.out.println(list);
    }
    
    
    @Test
    //forEach查询
    public void testSerach5(){
        logger.info("动态sql---forEach查询");
        List<String> snos=new ArrayList<String>();
        snos.add("101");
        snos.add("107");
        snos.add("105");
        snos.add("103");        
        Map<String, Object> param=new HashMap<String, Object>();
        param.put("snos", snos);
        //param.put("sno", "107");
        param.put("name", "%军%");
        param.put("sex", "男");
        List<Student> list=studentMapper.searchStudent5(param);
        System.out.println(list);
    }
    
    
    @Test
    //set动态修改
    public void testUpdateStudent(){
        logger.info("动态sql---set动态修改");
        Student s=new Student();
        s.setSnumber("108");
        s.setName("增华");
        s.setSex("男");
        int i=studentMapper.updateStudent(s);
        System.out.println(i);
        sqlSession.commit();
    }

}

 

以上是关于MyBatis 动态sql详解的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis复杂查询动态sql及缓存详解

MyBatis动态SQL标签用法

mybatis学习(39):动态sql片段

超全MyBatis动态SQL详解!( 看完SQL爽多了)

MyBatis的动态SQL详解

mybatis动态sql片段与分页,排序,传参的使用