在 MyBatis 中,返回值类型和参数传递是 Mapper 接口中至关重要的两个方面。正确理解和使用它们可以帮助我们高效、准确地进行数据库操作。下面将详细讲解 MyBatis 中的返回值类型和参数传递。
返回值类型
MyBatis 支持多种返回值类型,帮助开发者根据需求灵活选择合适的类型进行处理。主要包括以下几种:
1. 单一对象返回
当 SQL 查询结果为一行数据时,可以使用单一对象作为返回值类型。
示例
假设我们有一个 User
表:
CREATE TABLE User (
id INT PRIMARY KEY,
username VARCHAR(255),
email VARCHAR(255),
age INT
);
对应的 User
实体类:
package com.example.entity;
public class User {
private Integer id;
private String username;
private String email;
private Integer age;
// getters and setters
}
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("SELECT * FROM User WHERE id = #{id}")
User selectUserById(int id);
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.entity.User">
SELECT * FROM User WHERE id = #{id}
</select>
</mapper>
在以上代码中,selectUserById
方法返回 User
对象,因为该 SQL 语句预期返回单条记录。
2. 集合返回
当 SQL 查询结果为多行数据时,可以使用集合类型(如 List
、Set
)作为返回值类型。
示例
假设我们需要查询所有用户:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
import java.util.List;
public interface UserMapper {
List<User> selectAllUsers();
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM User
</select>
</mapper>
在以上代码中,selectAllUsers
方法返回 List<User>
,因为该 SQL 语句预期返回多条记录。
3. 原始数据类型返回
当 SQL 查询结果为单行单列数据时,可以使用原始数据类型或其包装类作为返回值类型。
示例
假设我们需要获取用户总数:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
public interface UserMapper {
int getUserCount();
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserCount" resultType="int">
SELECT COUNT(*) FROM User
</select>
</mapper>
在以上代码中,getUserCount
方法返回 int
,因为该 SQL 语句预期返回单行单列数据。
4. Map 返回
MyBatis 允许返回 Map
类型的数据,特别适用于动态查询和多表联查。
示例
假设我们有一个需要获取用户名和邮箱的场景:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import java.util.Map;
public interface UserMapper {
Map<String, Object> getUserMapById(int id);
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserMapById" resultType="map">
SELECT username, email FROM User WHERE id = #{id}
</select>
</mapper>
在以上代码中,getUserMapById
方法返回 Map<String, Object>
,因为该 SQL 语句返回的字段是多个,MyBatis 会将列名作为键,列值作为值存入 Map 中。
5. 自定义结果映射
除了自动映射结果,MyBatis 还支持自定义结果映射,通过 resultMap
进行复杂的映射操作。
示例
假设我们有一个更复杂的用户表结构,涉及多个实体类之间的映射:
CREATE TABLE Address (
id INT PRIMARY KEY,
user_id INT,
street VARCHAR(255),
city VARCHAR(255),
country VARCHAR(255)
);
Address
实体类:
package com.example.entity;
public class Address {
private Integer id;
private String street;
private String city;
private String country;
// getters and setters
}
我们需要将 User
和 Address
进行关联映射:
package com.example.entity;
import java.util.List;
public class User {
private Integer id;
private String username;
private String email;
private Integer age;
private List<Address> addresses;
// getters and setters
}
自定义 resultMap
映射:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
<result property="age" column="age"/>
<collection property="addresses" ofType="com.example.entity.Address">
<id property="id" column="address_id"/>
<result property="street" column="street"/>
<result property="city" column="city"/>
<result property="country" column="country"/>
</collection>
</resultMap>
<select id="selectUserWithAddresses" resultMap="userResultMap">
SELECT u.id, u.username, u.email, u.age,
a.id AS address_id, a.street, a.city, a.country
FROM User u
LEFT JOIN Address a ON u.id = a.user_id
WHERE u.id = #{id}
</select>
</mapper>
在这个示例中,resultMap
用于将查询结果映射到嵌套的 Java 对象中,使用 collection
元素表示一个一对多的关系。
参数传递
MyBatis 提供了多种方式来传递参数到 SQL 语句中。理解参数传递机制可以提高代码的可读性和灵活性。
1. 单个参数
当方法只有一个参数时,可以直接在 SQL 语句中使用 #{paramName}
或 #{param1}
来引用该参数。
示例
假设我们需要根据用户名查询用户信息:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
public interface UserMapper {
User selectUserByUsername(String username);
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserByUsername" resultType="com.example.entity.User">
SELECT * FROM User WHERE username = #{username}
</select>
</mapper>
在以上代码中,方法有一个 username
参数,SQL 语句中直接使用 #{username}
进行引用。
2. 多个参数
当方法有多个参数时,MyBatis 会默认将这些参数包装成一个 Map
,键名为 param1
、param2
等。
示例
假设我们需要根据用户名和年龄查询用户信息:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
public interface UserMapper {
User selectUserByUsernameAndAge(String username, int age);
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserByUsernameAndAge" resultType="com.example.entity.User">
SELECT * FROM User WHERE username = #{param1} AND age = #{param2}
</select>
</mapper>
在以上代码中,方法有两个参数,SQL 语句中使用 #{param1}
和 #{param2}
分别引用。
3. 使用 @Param 注解
MyBatis 提供了 @Param
注解用于指定参数名称,以增强代码可读性。
示例
假设我们需要根据用户名和邮箱查询用户信息:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
User selectUserByUsernameAndEmail(@Param("username") String username, @Param("email") String email);
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserByUsernameAndEmail" resultType="com.example.entity.User">
SELECT * FROM User WHERE username = #{username} AND email = #{email}
</select>
</mapper>
在以上代码中,使用 @Param
注解指定参数名称,SQL 语句中可以直接使用 #{username}
和 #{email}
引用。
4. 使用 Map 参数
可以使用 Map
对象传递多个参数,适合动态参数场景。
示例
假设我们需要根据动态条件查询用户信息:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
import java.util.Map;
public interface UserMapper {
User selectUserByParams(Map<String, Object> params);
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserByParams" resultType="com.example.entity.User">
SELECT * FROM User
WHERE username = #{username}
<if test="email != null">
AND email = #{email}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
</mapper>
在以上代码中,selectUserByParams
方法的参数是一个 Map
对象,SQL 语句中可以使用 #{username}
、#{email}
和 #{age}
引用。
5. 使用 POJO 作为参数
可以使用 POJO 对象传递参数,将多个字段封装在一个对象中。
示例
假设我们需要根据用户的多个属性查询用户信息:
Mapper 接口方法及 XML 配置:
package com.example.mapper;
import com.example.entity.User;
import com.example.entity.UserSearchCriteria;
public interface UserMapper {
User selectUserByCriteria(UserSearchCriteria criteria);
}
UserSearchCriteria
类:
package com.example.entity;
public class UserSearchCriteria {
private String username;
private String email;
private Integer age;
// getters and setters
}
XML 配置:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserByCriteria" resultType="com.example.entity.User">
SELECT * FROM User
WHERE username = #{username}
<if test="email != null">
AND email = #{email}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
</mapper>
在以上代码中,selectUserByCriteria
方法使用 UserSearchCriteria
对象作为参数,SQL 语句中可以使用 #{username}
、#{email}
和 #{age}
引用。
以上是 MyBatis 中关于返回值类型和参数传递的详细讲解。理解这些概念可以帮助你更高效地使用 MyBatis 进行数据库操作。