MyBatis-参数传递
单个参数
- 可以接受基本类型,对象类型,集合类型的值。
- MyBatis 可直接使用这个参数,不需要经过任何处理。
多个参数
- 任意多个参数,都会被 MyBatis 重新包装成一个 Map 传入。
- Map 的 key 是
param1
,param2
…,值就是参数的值。
如下将给出一个示例,新建一个 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具