MyBatis 中 SQL 语句传入参数的 3 种类型(详解)!

XML映射器配置文件中,SQL语句传入参数的类型(parameterType)有以下三种:(1)简单类型(包括:基本数据类型、String、Date等);(2)实体类(pojo)类型;(3)Map类型。

  • 若传入参数(`parameterType`)为简单类型,则#{}预编译占位符中的形参与对应映射器接口函数的形参一一对应。

  • 若传入参数(`parameterType`)为实体类(pojo)类型,则#{}预编译占位符中的形参与该实体类的成员变量一一对应。

  • 若传入参数(`parameterType`)为Map类型,则#{}预编译占位符中的形参与该Map中键名(key)一一对应。

1、简单类型

简单类型主要包括:基本数据类型、StringDate等。

示例:在SQL语句中传入简单类型,实现删除用户的功能,只需修改如下文件:

(1)UserMapper.java文件:

package com.atangbiji.dao;

import com.atangbiji.pojo.User;
import java.util.List;
//映射器接口
public interface UserMapper {
    //根据id删除一个用户
    void deleteUser(int id);
    //根据name查询用户
    User getUserByName(String name);
}

(2)UserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--命名空间(绑定对应的映射器接口)-->
<mapper namespace="com.atangbiji.dao.UserMapper">
    <!--根据id删除一个用户-->
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id}
    </delete>
    <!--根据name查询用户-->
    <select id="getUserByName" parameterType="String" resultType="com.atangbiji.pojo.User">
        select * from mybatis.user where name = #{name}
    </select>
</mapper>

(3)UserMapperTest.java文件:

package com.atangbiji.dao;

import com.atangbiji.pojo.User;
import com.atangbiji.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;

public class UserMapperTest {
    @Test
    public void deleteTest(){
        //1、从SqlSessionFactory中获取SqlSession对象
        try(SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
            //2、执行SQL语句
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.deleteUser(4);
            //3、提交事务
            sqlSession.commit();
        }
    }

    @Test
    public void selectTest3(){
        //1、从SqlSessionFactory中获取SqlSession对象
        try(SqlSession sqlSession = MyBatisUtils.getSqlSession()){
            //2、执行SQL语句
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.getUserByName("阿汤");

            System.out.println("根据name查询用户,查询结果为:");
            //3、输出查询结果
            System.out.println(user);
        }
    }
}

注:当传入参数(parameterType)为intString等简单类型时,传入参数可以省略不写

2、实体类类型

示例:在SQL语句中传入实体类(pojo)类型,实现插入用户的功能,只需修改如下文件:

(1)UserMapper.java文件:

package com.atangbiji.dao;

import com.atangbiji.pojo.User;
import java.util.List;
import java.util.Map;
//映射器接口
public interface UserMapper {
    //插入一个用户
    void addUser(User user);
}

(2)UserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--命名空间(绑定对应的映射器接口)-->
<mapper namespace="com.atangbiji.dao.UserMapper">
    <!--插入一个用户-->
    <insert id="addUser" parameterType="com.atangbiji.pojo.User">
        insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>  
</mapper>

(3)UserMapperTest.java文件:

package com.atangbiji.dao;

import com.atangbiji.pojo.User;
import com.atangbiji.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;

public class UserMapperTest {
    @Test
    public void insertTest(){
        //1、从SqlSessionFactory中获取SqlSession对象
        try(SqlSession sqlSession = MyBatisUtils.getSqlSession()){
            //2、执行SQL语句
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.addUser(new User(4,"王二","111111"));
            //3、提交事务
            sqlSession.commit();
        }
    }
}

注:在实体类(pojo)已经定义好的情况下,如果传入参数(parameterType)为实体类类型,那么就不能自定义#{}占位符中形参的名称。

3、万能的Map类型

示例:在SQL语句中传入Map类型,实现插入和删除用户的功能,只需修改如下文件:

(1)UserMapper.java文件:

package com.atangbiji.dao;

import com.atangbiji.pojo.User;
import java.util.List;
import java.util.Map;
//映射器接口
public interface UserMapper {
    //插入一个用户
    void addUser2(Map<String,Object> map);
    //根据id删除一个用户
    void deleteUser2(Map<String,Object> map);
}

(2)UserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--命名空间(绑定对应的映射器接口)-->
<mapper namespace="com.atangbiji.dao.UserMapper">
    <!--插入一个用户-->
    <insert id="addUser2" parameterType="map">
        insert into mybatis.user (id,name,pwd) values (#{userId},#{userName},#{usePassword})
    </insert>
    <!--根据id删除一个用户-->
    <delete id="deleteUser2" parameterType="map">
        delete from mybatis.user where id = #{userId}
    </delete>
</mapper>

(3)UserMapperTest.java文件:

package com.atangbiji.dao;

import com.atangbiji.pojo.User;
import com.atangbiji.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;

public class UserMapperTest {
    @Test
    public void insertTest2(){
        //1、从SqlSessionFactory中获取SqlSession对象
        try(SqlSession sqlSession = MyBatisUtils.getSqlSession()){
            //2、执行SQL语句
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("userId",4);
            hashMap.put("userName","王二");
            hashMap.put("usePassword","111111");

            mapper.addUser2(hashMap);
            //3、提交事务
            sqlSession.commit();
        }
    }

    @Test
    public void deleteTest2(){
        //1、从SqlSessionFactory中获取SqlSession对象
        try(SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
            //2、执行SQL语句
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("userId",4);
            mapper.deleteUser2(hashMap);
            //3、提交事务
            sqlSession.commit();
        }
    }
}

注:

  • 在实体类(pojo)已经定义好的情况下,如果传入参数(parameterType)为Map类型,那么我们可以通过自定义Map的键名(key)的方式自定义#{}占位符中形参的名称。

  • 当映射器接口函数有多个形参时,我们往往需要将传入参数设置为Map类型(或者注解)。

  • 由于传入参数为实体类型时,我们需要在执行SQL语句的时候new一个该实体类的对象,并对其中所有的成员变量(字段)进行初始化。实际项目中,当实体类(pojo)的成员变量(即:数据库表的字段)非常多时,我们有时候并不需要将所有的字段都初始化。此时,我们往往可以将传入参数类型设置为Map类型。

  • 虽然传入参数为简单类型(包括:基本数据类型、String、Date等)和实体类(pojo)类型的标签,完全可以用传入参数为Map类型的标签替换,但我们往往并不会这样做。

  • 传入参数为Map类型虽然万能,但不建议随便滥用。

关注 “阿汤笔迹” 微信公众号,获取更多学习笔记。

原文始发于微信公众号(阿汤笔迹):MyBatis 中 SQL 语句传入参数的 3 种类型(详解)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/213031.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!