Mybatis 返回值类型和参数传递的配置方法
作者:cangloe
在 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 进行数据库操作。
到此这篇关于Mybatis 返回值类型和参数传递的文章就介绍到这了,更多相关Mybatis 返回值类型和参数传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!