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();
    }

}
时间: 2024-09-28 20:14:07

MyBatis 动态sql详解的相关文章

MyBatis动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择.先来看如下一个例子: <select id="dynamicIfTest" parameterType="Blog" resultType=&quo

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种

Oracle中动态SQL详解(EXECUTE IMMEDIATE)

Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类: 数据库 Oracle中动态SQL详解 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运

MyBatis探究-----动态SQL详解

1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不可少 <select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee"> select * from t_employee where 1=1 <if test=&

Oracle中动态SQL详解

1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.

(转)Oracle中动态SQL详解

本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程

动态SQL详解

动态SQL 在之前用户所编写的PL/SQL程序时有一个最大的特点:就是所操作的数据库对象(例如:表)必须存在,否则创建的子程序就会出问题,而这样的操作在开发之中被称为静态SQL操作,而动态SQL操作可以让用户在定义程序时不指定具体的操作对象,而在执行时动态的传入所需要的数据库对象,从而使程序变得更加的灵活. 创建一个功能,输入表名,输出表中有多少行,若没有这个表,则创建这个表. 首先禁用所有触发器 GRANT CREATE ANY TABLE TO SCOTT create or replace

【入门详解】MyBatis入门基础详解

什么是mybatis? MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:1. 从配置文件(通常是XML配置文件中)得到 sess

《深入理解mybatis原理》 Mybatis初始化机制详解

对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置文件创建Configuration对象的过程 3. 手动加载XML配置文件创建Configuration对象完成初始化,创建并使用SqlSessionFactory对象 4. 涉及到的设计模式 一. MyBatis的初始化做了什么 任何框架的初始化,无非是加载自己运行时所需要的配置信息.MyBati