ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MyBatis配置动态SQL语句基础

2021-12-02 18:03:11  阅读:152  来源: 互联网

标签:语句 UserMapper List user SQL MyBatis import id


MyBatis配置动态SQL语句

CREATE DATABASE `mybatis_study`;

USE `mybatis_study`;

CREATE TABLE `user`(
  `user_id` INT(20) NOT NULL PRIMARY KEY,
  `user_name` VARCHAR(30) DEFAULT NULL,
  `password` VARCHAR(30) DEFAULT NULL
)ENGINE = INNODB DEFAULT CHARSET = utf8;

INSERT INTO `user` (`user_id`,`user_name`,`password`) VALUES
(1, '张三', '123456'),
(2, 'admin', 'admin'),
(3, 'root', 'root');

在 MyBatis 的 SQL映射文件中,有时候需要根据一些查询条件,来选择不同的SQL语句,如果每一个场景都重写SQL,很显然效率没有很高,而 MyBatis 的动态SQL很好的解决了这种问题,根据条件动态的处理 SQL, 特别简单的说就是,写一次SQL,但是根据分支等的跳转,在多个场景下也可以使用,例如:

  • 当查询条件由于参数不同而无法确定具体是什么,可以使用<where>标签包含
  • <where> 可以使用 <if test="...."> 分条件进行处理,实现动态
  • <foreach>遍历标签,在用户中查询寻多个id,例如(12,16,17)

在此之外,动态SQL同时结局了,在原生 JDBC 中需要拼接SQL语句时由于书写问题,而导致报错

(一) where 和 if 标签

UserMapper 接口

List<User> getUserList(User user);

UserMapper.xml

    <select id="getUserList" resultType="com.test.pojo.User" parameterType="com.test.pojo.User">
            select * from mybatis_study.user
        <where>
            <if test="user_name != null">
                and user_name = #{user_name}
            </if>
            <if test="password != null">
                and password = #{password}
            </if>
        </where>
    </select>

注意:在SQL中,“and” 用来拼接已有一个或多个查询条件的语句,当此语句为第一个查询条件的时候,会因为 的存在屏蔽第一个 “and”

UserTest

import com.test.MyBatisUtils;
import com.test.mapper.UserMapper;
import com.test.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserTest {
    @Test
    public void test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUser_name("admin");
        List<User> userList = mapper.getUserList(user);

        for (User u:userList) {
            System.out.println(u);
        }
        sqlSession.close();
    }
}

执行效果

在这里插入图片描述

(二) foreach标签

提出这样一种需求,在用户中查询寻多个id,例如(12,16,17)我们可以这样写SQL

select * from  mybatis_study.user where user_id=1 or user_id=2 or user_id=3

或者这样

select * from mybatis_study.user where id in (1,2,3)

而这种情况下,我们需要向SQL中传递一个数据或者List类型的参数,然后使用 标签去遍历然后解析

UserMapper 接口

List<User> getUserList(List<Integer> ids);

UserMapper.xml

    <select id="getUserList" resultType="com.test.pojo.User" parameterType="list">
            select * from mybatis_study.user
        <where>
                <foreach collection="list" open="and user_id in (" close=")" item="item" separator=",">
                    #{item}
                </foreach>
        </where>
    </select>

foreach元素的属性主要有item,index,collection,open,separator,close。

  • item:集合中元素迭代时的别名,该参数为必选。
  • index:在list和数组中,index是元素的序号,在map中,index是元素的 key,该参数可选
  • open:foreach代码的开始符号,一般是和close=")"合用。常用在in(),values()时。该参数可选
  • separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
  • close: foreach代码的关闭符号,一般是和open="("合用。常用在in(),values()时。该参数可选。
  • collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。

UserTest

import com.test.MyBatisUtils;
import com.test.mapper.UserMapper;
import com.test.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class UserTest {
    @Test
    public void test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<Integer> ids = Arrays.asList(1, 2, 3);
        List<User> userList = mapper.getUserList(ids);

        for (User u:userList) {
            System.out.println(u);
        }
        sqlSession.close();
    }
}

执行效果

在这里插入图片描述

标签:语句,UserMapper,List,user,SQL,MyBatis,import,id
来源: https://blog.csdn.net/qq_42322632/article/details/121681115

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有