mybatis与java传参方式简述

本文详细解析在SSM框架中,如何利用MyBatis进行不同类型的参数传递,包括基本数据类型、自定义类、List/Set集合、Map等,以及如何在Java与MyBatis间正确地接收这些参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SSM框架中,我们会使用mybatis做java与数据库之间的交互。在最基本的CRUD操作中,有时我们会传递不同类型的数据给sql数据库,如基本数据类型,自定义类,list/set集合,Map集合等等。

本文将给出java部分和mybatis部分关键代码的书写注意事项,对于不同的参数,该如何与mybatis进行数据交互。

一、java–>mybatis传入参数
1. 若干普通参数
java部分代码:
@Repository
public interface TestRepository {
	int selectMessage(String name, int age);
}
mybatis部分代码:
<?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.test.TestRepository ">
 <select id="selectMessage" resultType="java.lang.Integer">
        select id from testUser
        where name = #{param1} and age=#{param2}
    </select>
</mapper>

在这种写法中,param1,2…表示的是参数在java方法中的形参顺序,从1开始计数。

2.自定义类
java部分代码:
@Repository
public interface TestRepository {
	int selectMessage(User user);
}

class User{
	private String name;
	private int age;
	// get/set方法
}
mybatis部分代码:
<?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.test.TestRepository ">
 <select id="selectMessage" paramType="User" resultType="java.lang.Integer">
        select id from testUser
        where name = #{name} and age=#{age}
    </select>
</mapper>

在此种写法中,#{}内部直接写类的属性名即可。

注:要写paramType="",里面的值是User的全路径。

可以在mybatis的配置文件中写别名,写别名之后就不需要再写User的全路径了。

 <!--项目下所有的类名-->
    <typeAliases>
        <!--User类-->
        <typeAlias type="com.test.User" alias="User"/>
    </typeAliases>

此时,根据alias的值来识别当前User具体是哪一个类文件。

3.普通数据类型List集合
java部分代码:
@Repository
public interface TestRepository {
	List<Integer> selectMessage(List<String> names);
}
mybatis部分代码:
<?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.test.TestRepository ">
 <select id="selectMessage" paramType="java.lang.String" resultType="java.lang.Integer">
        select id from testUser
        where name IN 
         <foreach collection="list" item="name" index="index" open="(" close=")" separator=",">
            #{name}
        </foreach>
    </select>
</mapper>

此时foreach标签内的collection固定写法list即可。

注:此时paramType与resultType,里面的值是集合内的数据类型,如(String,Integer),而不是java.util.List。
4.普通数据类型Set集合
java部分代码:
@Repository
public interface TestRepository {
	List<Integer> selectMessage(Set<String> names);
}
mybatis部分代码:
<?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.test.TestRepository ">
 <select id="selectMessage" paramType="java.lang.String" resultType="java.lang.Integer">
        select id from testUser
        where name IN 
         <foreach collection="collection" item="name" index="index" open="(" close=")" separator=",">
            #{name}
        </foreach>
    </select>
</mapper>
与list不同,除list以外的集合,在foreach标签内统一写成collection即可。
注:此时paramType与resultType,里面的值是集合内的数据类型,如(String,Integer),而不是java.util.List。
5.对象数据类型List集合
java部分代码:
@Repository
public interface TestRepository {
	List<Integer> selectMessage(List<User> users);
}
mybatis部分代码:
<?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.test.TestRepository ">
  <select id="test" parameterType="com.test.User" resultType="java.lang.Integer">
        SELECT id FROM user WHERE name IN
        <foreach collection="list" item="user" index="index" open="(" close=")" separator=",">
            #{user.name}
        </foreach>
    </select>
</mapper>

在此种写法中,#{}内部直接写类的属性名即可。

注:要写paramType="",里面的值是User的全路径。

可以在mybatis的配置文件中写别名,写别名之后就不需要再写User的全路径了。

 <!--项目下所有的类名-->
    <typeAliases>
        <!--User类-->
        <typeAlias type="com.test.User" alias="User"/>
    </typeAliases>

此时,根据alias的值来识别当前User具体是哪一个类文件。

6.对象数据类型Set集合
此种与上面的list集合基本一致,注意将collection的值从list改为collection即可。
二、mybatis–>java接收参数
上述示例接收到的有普通参数与普通类型参数的List集合接收方式。
因此这里只记录常见的map类型参数接收与自定义类的类型接收。
1. Map类型数据
java部分代码:
@Repository
public interface TestRepository {
	List<Map<String, Object>> test(int id);
}
mybatis部分代码:
<?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.test.TestRepository ">
 <select id="test" parameterType="java.lang.Integer" resultType="java.util.Map">
        SELECT id,name,age FROM User WHERE id = #{param1}
    </select>
</mapper>

这里的resultType需要写java.util.Map

java遍历数据部分
		// 通过id拿到数据库中的数据
        List<Map<String, Object>> ids = myTestService.test(id);
        // 对数据进行遍历
        for (Map<String, Object> keyValue : ids) {
            // 获取user对象的id
            Integer uid = Integer.parseInt(keyValue.get("id").toString());
            // 获取user对象的name
            String uname = keyValue.get("name").toString();
            // 打印输出结果
            System.out.println(id+":"+uname);
        }

注:
1.我们的repository的返回类型固定List<Map<String, Object>>
2. 每一个list内的map都对应数据库中的一行记录。其中map的key对应select语句中的列名,value对应列名下的具体值。
2. 自定义类数据
java部分代码:
@Repository
public interface TestRepository {
	User test(int id);
}
mybatis部分代码:
<?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.test.TestRepository ">
     <select id="test" parameterType="java.lang.Integer" resultType="User">
        SELECT id,name,age FROM user WHERE id = #{param1}
    </select>
</mapper>

这里的resultType需要写自定义类名,若写了别名,则不需要写类的全路径

3. 自定义类集合数据
java部分代码:
@Repository
public interface TestRepository {
	List<User> test(int id1, int id2);
}
mybatis部分代码:
<?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.test.TestRepository ">
<select id="test" parameterType="java.lang.Integer" resultType="User">
        SELECT id,name,age FROM test WHERE id IN (#{param1},#{param2})
    </select>
</mapper>
与第二种自定义类的写法基本一致。仅需注意此时的resultType为User而非list即可。

至此,关于java与mabatis的传参方式总结完毕。如有不清楚的地方,欢迎下方留言。如有错误欢迎指正。

MyBatis 是一种优秀的持久层框架,它简化了数据库操作,并允许开发者通过 XML 或注解的方式编写 SQL 语句。当你需要在 MyBatis 的 XML 文件中传递参数到 SQL 语句时,可以使用多种方式进行传参。 以下是几种常见的传参方式: ### 1. 单个参数直接传入 如果你只需要传递一个简单的值作为参数,则可以直接将其放入 `#{}` 中。例如,在查询某个用户信息时按 ID 查询: ```xml <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE user_id = #{id} </select> ``` 这里的`parameterType`指定了输入类型的类别(如 int),而`${}`则用于替换占位符为实际值。 ### 2. 使用实体类传参 当涉及到复杂的对象或多个字段时,你可以将整个 JavaBean 对象作为一个整体传递给 Mapper 方法。假设有一个名为 User 的 POJO 类型,包含 username 和 password 属性: ```xml <insert id="insertUser" parameterType="com.example.User"> INSERT INTO users (username, password) VALUES (#{username}, #{password}) </insert> ``` 在这种情况下,每个属性名称都对应于该 Bean 内相应的 getter/setter 方法名。 ### 3. Map 集合形式的参数映射 有时你可能会遇到这样的场景 - 没有合适的现成的数据结构可用作载体;这时就可以考虑采用 java.util.Map 来封装一组离散数据项并加以传送: ```java Map<String,Object> params=new HashMap<>(); params.put("name","zhangsan"); params.put("age",20); //... userMapper.getUserInfo(params); //对应的XML里边可以根据key获取value ``` 而在 XML 映射文件里面也相应地按照 key 进行访问: ```xml <select id="getUserInfo" parameterType="map" resultType="..."> select ... from table where name=#{name} and age=#{age}; </select> ``` 以上就是关于 MyBatis Xml Sql 传参的基本介绍啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值