MyBatis-参数传递

单个参数

  • 可以接受基本类型,对象类型,集合类型的值。
  • MyBatis 可直接使用这个参数,不需要经过任何处理。

多个参数

  • 任意多个参数,都会被 MyBatis 重新包装成一个 Map 传入。
  • Map 的 key 是 param1param2 …,值就是参数的值。

如下将给出一个示例,新建一个 CustomerMappter 接口。

/**
 * @author BNTang
 */
public interface CustomerMappter {
    Customer queryCustomerById(Integer id, String name);
}

修改 CustomerMapper.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="top.it6666.mapper.CustomerMappter">
    <select id="queryCustomerById" resultType="top.it6666.domain.Customer">
        SELECT *
        FROM `customer`
        WHERE cust_id = #{param1}
          AND cust_name = #{param2}
    </select>
</mapper>

psvm 代码如下所示。

/**
 * @author BNTang
 */
public class TestMain {

    public static void main(String[] args) throws Exception {
        // 1.创建 SqlSessionFactoryBuilder 对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        // 2.加载 SqlMapConfig.xml 配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMappingConfig.xml");

        // 3.创建 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

        // 4.创建 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        CustomerMappter customerMappter = sqlSession.getMapper(CustomerMappter.class);

        // 5.执行 customerMappter 对象执行查询
        Customer customer = customerMappter.queryCustomerById(1, "鲁班");

        System.out.println(customer);

        // 6.提交事务
        sqlSession.commit();

        // 7.释放资源
        sqlSession.close();
    }
}

@param 注解

  • 可以为参数使用 @Param 注解来起一个名字。
  • MyBatis 就会将这些参数封装进 Map 中,key 就是我们自己通过 @Param 指定的名字。

修改 CustomerMappter 接口。

/**
 * @author BNTang
 */
public interface CustomerMappter {
    Customer queryCustomerById(@Param("cust_id") Integer id, @Param("cust_name") String name);
}

修改 CustomerMapper.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="top.it6666.mapper.CustomerMappter">
    <select id="queryCustomerById" resultType="top.it6666.domain.Customer">
        SELECT *
        FROM `customer`
        WHERE cust_id = #{cust_id}
          AND cust_name = #{cust_name}
    </select>
</mapper>

psvm 代码同上。

POJO

当这些参数属于我们业务 POJO 时,我们直接传递 POJO。

修改 CustomerMappter 接口。

/**
 * @author BNTang
 */
public interface CustomerMappter {
    void insertCustomer(Customer customer);
}

紧接着修改 CustomerMapper.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="top.it6666.mapper.CustomerMappter">
    <insert id="insertCustomer">
        INSERT INTO `customer` (cust_name, cust_profession, cust_phone, email)
        VALUES (#{cust_name}, #{cust_profession}, #{cust_phone}, #{email})
    </insert>
</mapper>

修改 psvm 代码如下所示。

/**
 * @author BNTang
 */
public class TestMain {

    public static void main(String[] args) throws Exception {
        // 1.创建 SqlSessionFactoryBuilder 对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        // 2.加载 SqlMapConfig.xml 配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMappingConfig.xml");

        // 3.创建 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

        // 4.创建 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        CustomerMappter customerMappter = sqlSession.getMapper(CustomerMappter.class);

        // 5.执行 SqlSession 对象执行查询
        Customer customer = new Customer();
        customer.setCust_name("BNTang");
        customer.setCust_phone("18819457812");
        customer.setEmail("303158130@qq.com");

        customerMappter.insertCustomer(customer);

        // 6.提交事务
        sqlSession.commit();

        // 7.释放资源
        sqlSession.close();
    }

}

Map

我们也可以封装多个参数为 Map,直接传递。

修改 CustomerMappter 接口。

/**
 * @author BNTang
 */
public interface CustomerMappter {
    Customer queryCustomerById(Map<String, Object> map);
}

紧接着修改 CustomerMapper.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="top.it6666.mapper.CustomerMappter">
    <select id="queryCustomerById" resultType="top.it6666.domain.Customer">
        SELECT *
        FROM `customer`
        WHERE cust_id = #{cust_id}
          AND cust_name = #{cust_name}
    </select>
</mapper>

修改 psvm 代码如下所示。

/**
 * @author BNTang
 */
public class TestMain {

    public static void main(String[] args) throws Exception {
        // 1.创建 SqlSessionFactoryBuilder 对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        // 2.加载 SqlMapConfig.xml 配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMappingConfig.xml");

        // 3.创建 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

        // 4.创建 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        CustomerMappter customerMappter = sqlSession.getMapper(CustomerMappter.class);

        // 5.执行 customerMappter 对象执行查询
        Map<String, Object> map = new HashMap<>();
        map.put("cust_id", 1);
        map.put("cust_name", "鲁班");

        Customer customer = customerMappter.queryCustomerById(map);

        System.out.println(customer);

        // 6.提交事务
        sqlSession.commit();

        // 7.释放资源
        sqlSession.close();
    }

}

参数传递内部源码分析

TODO

posted @   BNTang  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示