您的位置:首页 > 数据库

mybatis入门使用6:动态SQL

2017-06-14 00:26 453 查看
在使用mybatis时,有时为减少写接口和mapper,可以使用动态sql。

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 
MyBatis中用于实现动态SQL的元素主要有:if ,where choose(when,otherwise),foreach

1、if :使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,增加灵活性。 

2、where:where标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。

<select id="selectByName" resultMap="BaseResultMap" parameterType="java.lang.String" >

select 

<include refid="Base_Column_List" />

from t_employee

<where>

<if test=' name != null and name != "" '>

EmployeeName = #{name}

</if>

</where>

</select>

3、foreach

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close 。item表示集合中每一个元素进行迭代时的别名;index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;open表示该语句以什么开始;separator表示在每次进行迭代之间以什么符号作为分隔符;close表示以什么结束。

collection:如果传入的是单参数且参数类型是一个List的时候,collection属性值为list;如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array;如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key;

<select id="selectDynamicForeach" resultMap="BaseResultMap" parameterType="java.util.Map" >

select 

<include refid="Base_Column_List" />

from t_employee where ID in 

<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">

#{item}

</foreach>

</select>

4、choose (when,otherwise)

<choose>标签类似switch,<if>标签内不能再嵌套<if>,可以在 <choose> <when> 中嵌套<if> 再一次提高动态sql的能力。

<select id="selectChoose"  resultMap="BaseResultMap" parameterType="java.util.Map" >

   select 

    <include refid="Base_Column_List" />

    from t_employee 

    <where>

    <choose>  

            <when test="compareType == 1 ">  

                 Salary   > #{salary}

            </when>  

            <when test="compareType == 2">  

                  Salary =  #{salary}

            </when>  

            <otherwise>  

                  Salary <  #{salary} 

            </otherwise>  

        </choose>

        </where>

  </select>

测试:

package com.lls.test;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.lls.mapper.EmployeeMapper;

import com.lls.model.Employee;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = { "classpath:config/spring-mybatis.xml" })

public class DynamicSqlTest {

private static final Logger LOGGER = LoggerFactory.getLogger(DynamicSqlTest.class);

@Autowired

private EmployeeMapper employeeMapper;

@Test

public void testIf() {

List<Employee> all = employeeMapper.selectByName("");

List<Employee> employees = employeeMapper.selectByName("xiaoA");

LOGGER.info("all " + all.size());

LOGGER.info("employees " + employees.size());

}

@Test

public void testForeach() {

Map<String, Object> map = new HashMap<String, Object>();

map.put("departmentId", 1);

List<Integer> ids = new LinkedList<Integer>();

for (int i = 1; i < 10; i++) {

ids.add(i);

}

map.put("ids", ids);

List<Employee> employees = employeeMapper.selectDynamicForeach(map);

LOGGER.info("employees " + employees.size());

}

@Test

public void testOtherWise() {

Map<String, Object> map = new HashMap<String, Object>();

map.put("compareType", 1);

map.put("salary", 13000d);

List<Employee> employeesLt = employeeMapper.selectChoose(map);

map.put("compareType", 2);

LOGGER.info("employeesLt " + employeesLt.size());

List<Employee> employeesGt = employeeMapper.selectChoose(map);

map.put("compareType", 3);

LOGGER.info("employeesGt " + employeesGt.size());

List<Employee> employeesEq = employeeMapper.selectChoose(map);

LOGGER.info("employeesEq " + employeesEq.size());

}

}

代码文档:http://download.csdn.net/download/lanlianhua_luffy/9869769

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis动态SQL