前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >mybatis动态sql之foreach补充(一)

mybatis动态sql之foreach补充(一)

作者头像
西西嘛呦
发布于 2020-08-26 06:18:07
发布于 2020-08-26 06:18:07
25900
代码可运行
举报
运行总次数:0
代码可运行

EmployeeMapperDynamicSql.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.gong.mybatis.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import com.gong.mybatis.bean.Employee;

public interface EmployeeMapperDynamicSql {
    public List<Employee> getEmpByConditionIf(Employee employee);
    
    public void updateEmp(Employee employee);
    
    public List<Employee> getEmpByForeach(@Param("ids") List<Integer> ids);
    
    public List<Employee> getEmpByForeach2(List<Employee> employee);
}

EmployeeMapperDynamicSql.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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.gong.mybatis.mapper.EmployeeMapperDynamicSql">
    <!-- 查询,要查那个就带上那个条件 -->
    <select id="getEmpByConditionIf" resultType="com.gong.mybatis.bean.Employee">
        select * from tbl_employee 
        <where>
            <choose>
                <when test="id!=null">
                    id=#{id}
                </when>
                <when test="lastName!=null">
                    last_name like #{lastName}
                </when>
                <when test="email!=null">
                    email=#{email}
                </when>
                <otherwise>
                </otherwise>
            </choose>
        </where>
    </select>
    
    <update id="updateEmp">
        update tbl_employee 
        <trim prefix="set" suffixOverrides=",">
            <if test="lastName!=null">
                last_name=#{lastName},
            </if>
            <if test="gender!=null and gender == 0 or gender == 1">
                gender=#{gender},
            </if>
            <if test="email!=null">
                email=#{email}
            </if>
        </trim>
        where id=#{id}
    </update>
    
    <select id="getEmpByForeach" resultType="com.gong.mybatis.bean.Employee">
        select * from tbl_employee where id in
        <foreach collection="ids" item="item_id" separator="," open="(" close=")">
            #{item_id}
        </foreach>
    </select>
    
    <select id="getEmpByForeach2" resultType="com.gong.mybatis.bean.Employee">
        select * from tbl_employee where id in
        <foreach collection="list" item="item" separator="," open="(" close=")">
            #{item.id}
        </foreach>
    </select>
</mapper>

说明,现在我们使用public List<Employee> getEmpByForeach2(List<Employee> employee);,传入的是一个Employee集合,那么此时我们应该怎么使用foreach呢?

我们可以在collection中对应着list类型,即collection="list"。

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.gong.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.gong.mybatis.bean.Employee;
import com.gong.mybatis.mapper.EmployeeMapperDynamicSql;

public class TestMybatis3 {
    
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(is);
    }

    @Test
    public void test() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapperDynamicSql mapper = openSession.getMapper(EmployeeMapperDynamicSql.class);
            List<Employee> emps = new ArrayList<Employee>();
            Employee e1 = new Employee();
            e1.setId(1);
            Employee e2 = new Employee();
            e2.setId(2);
            emps.add(e1);
            emps.add(e2);
            List<Employee> es = mapper.getEmpByForeach2(emps);
            for(Employee e:es) {
                System.out.println(e);
            }
            openSession.commit();
        } finally {
            openSession.close();
        }
        
    }
    
}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG 01-21 16:21:28,692 ==>  Preparing: select * from tbl_employee where id in ( ? , ? )   (BaseJdbcLogger.java:145) 
DEBUG 01-21 16:21:28,783 ==> Parameters: 1(Integer), 2(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-21 16:21:28,813 <==      Total: 2  (BaseJdbcLogger.java:145) 
Employee [id=1, lastName=dema, gender=1, email=dema@qq.com, dept=null]
Employee [id=2, lastName=jack, gender=1, email=675544321@qq.com, dept=null]

成功的通过id将对象取出来。

当然,我们也可以取别名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<Employee> getEmpByForeach2(@Param("emps") List<Employee> employee);

然后在使collection="emps",其余不变,还是可以达到一样的效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mybatis动态sql之分支选择(学习choose、when、otherwise标签)
说明:当传入了id,就会根据id来查询,传入了lastName,就根据last_name来查询,传入了email,就根据email查询。否则就执行otherwise标签里面的。
西西嘛呦
2020/08/26
1.3K0
mybatis动态sql之foreach补充(三)
这里需要注意index属性和item属性。index属性里的值是Map的键,item的值是Map的值。
西西嘛呦
2020/08/26
3330
mybatis动态sql之修改(学习set标签)
我们先对Id=1的记录修改last_name=hanbin,结果:会报错,因为sql最后面多了个逗号
西西嘛呦
2020/08/26
1.4K0
mybatis动态sql之foreach补充(二)
对于入参为数组: public List<Employee> getEmpByForeach3(Integer [] ids); 我们使collection="array" <select id="getEmpByForeach3" resultType="com.gong.mybatis.bean.Employee"> select * from tbl_employee where id in <foreach collection="array" ite
西西嘛呦
2020/08/26
3770
mybatis插件开发初探
说明:执行sql方法时会调用四大对象,如果不是自己配置拦截的类型,就放过,否则就进行拦截。我们定义的插件是拦截StatementHandler类中的parameterize方法,其参数为java.sql.Statement。
西西嘛呦
2020/08/26
6310
mybatis插件开发初探
mybatis映射文件之基本的增删改查
说明:接口中的增删改方法可以有Integer、long、boolean返回值。在EmployeeMapper.xml中parameterType为输入的参数类型,resultType为返回的参数类型。
西西嘛呦
2020/08/26
5720
mybatis映射文件之基本的增删改查
mybatis之第一个mybatis程序(一)
其中lib文件夹下为依赖的jar包:mybatis.jar为mybatis依赖,mysql-connector-java.jar为连接mysql数据库依赖,log4j为打印日志依赖。
西西嘛呦
2020/08/26
3000
mybatis之第一个mybatis程序(一)
动态sql
前面的例子中通过if 条件增加判断where按照什么条件去查询,但是会有一个问题,当传递的参数中前面的没有值where条件 也会在前面加上and
桑鱼
2020/03/18
7720
mybatis之第一个mybatis程序(二)
1、在src下新建一个com,gong,mybatis.dao的包,在里面新建一个EmployeeDao.java(注意是接口)
西西嘛呦
2020/08/26
3290
mybatis之第一个mybatis程序(二)
轻松掌握Mybatis(上)
全局配置文件中主要配置的是数据源信息,然后是最后的mappers标签,该标签配置的是sql语句的映射文件。
wangweijun
2022/01/10
5490
ssm之spring+springmvc+mybatis整合初探
3、然后在web.xml中加入配置,使spring和springmvc配置文件起作用。
西西嘛呦
2020/08/26
3880
ssm之spring+springmvc+mybatis整合初探
Mybatis动态SQL
# Mybatis动态SQL # if判断条件 <!-- public List<Employee> getEmpsByConditionIf(Employee employee); --> <select id="getEmpsByConditionIf" resultType="com.finen.mybatis.bean.Employee"> select * from tbl_employee <where> <!-- test:判断表达式; c:if test
Java开发者之家
2021/06/17
6020
mybatis文件映射之利用association进行关联查询(二)
说明:在resultMap中使用association标签,property属性对应着Employee中的成员属性的名称,javaType对应着该成员属性的类型,子标签id标识tbl_department中的主键,因为我们在select标签中将d.id取别名did,所以将did映射给Department中的id属性,然后通过result标签将普通的字段映射给Department中的deptName属性。
西西嘛呦
2020/08/26
3160
mybatis缓存之一级缓存
一级缓存:与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。
西西嘛呦
2020/08/26
4900
mybatis缓存之一级缓存
mybatis动态sql之遍历集合(学习foreach标签(初探))
也就是说整个sql语句是这样的:select * from tbl_employee where id in (1,2,3)
西西嘛呦
2020/08/26
1.3K0
mybatis动态sql之使用foreach进行批量插入的两种方式
EmployeeMapperDynamicSql.java package com.gong.mybatis.mapper; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import com.gong.mybatis.bean.Employee; public interface
西西嘛呦
2020/08/26
2.2K0
mybatis扩展之使用PageHelper插件进行分页(是真好用)
首先引入相关的jar包: 然后是在Mybatis全局配置文件中配置: <plugins> <plugin interceptor="com.github.pagehelper.
西西嘛呦
2020/08/26
5950
mybatis扩展之使用PageHelper插件进行分页(是真好用)
mybatis动态sql之初探(学习where、if、trim标签)
EmployeeMapperDynamicSql.java package com.gong.mybatis.mapper; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.MapKey; import com.gong.mybatis.bean.Employee; public interface EmployeeMapperDynamicSql { public List<
西西嘛呦
2020/08/26
4100
mybatis文件映射之利用association进行关联查询之分步查询(三)
现在新增:DepartmentMapper.java和DepartmentMapper.xml
西西嘛呦
2020/08/26
3120
mybatis文件映射之利用延迟加载解决collection分布查询(六)
Employee.java public class Employee { private Integer id; private String lastName; private String gender; private String email; Department dept; } Department.java public class Department { private Integer id; private String dept
西西嘛呦
2020/08/26
3080
相关推荐
mybatis动态sql之分支选择(学习choose、when、otherwise标签)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文