2.1 MyBatis值的传递概述
在MyBatis中,值的传递主要是指在Java代码和SQL语句之间传递参数值的过程。这些参数值可以是单个值、数组或JavaBean对象。
MyBatis提供了多种传递值得方法,较为常用的有如下3种:
- 单值传递
- 对象传值
- Map传值(一些开发规范中禁止使用)
2.2 单值传递
如果程序中只有一个参数需要传递给SQL,可以直接作为方法参数传入。在SQL中可以使用任意名称获取这个参数。虽然名称可以任意,但通常仍然使用该属性的名称,以保证可读性。
例如,开发一个基于用户id查询用户信息的方法,可以在SQL中使用【#{参数名}】的方式来代表要传入的参数,具体的SQL语句如下:
select * from user where username = #{username}
此时,在Mapper接口的抽象方法中,可以声明一个对应类型的参数,名称与SQL中的参数名一致。MyBatis框架会自动获取调用方法时传入的参数,绑定到SQL语句的相应位置。
2.3 @Param注解
Mapper接口中某个方法接收了多个参数,需要在每个参数前添加@Param注解,手动添加参数映射的名称,否则会出现【BindingException: Parameter 'xxx' not found】的异常。
2.4 单值传递示例
在UserMapper接口中声明一个基于用户名查询用户信息的方法及一个基于用户名和密码查询用户的方法。
/**
* 基于用户名查询用户信息
* @param username
* @return
*/
@Select("select * from user where username = #{username}")
User getUserByUsername(String username);
/**
*基于用户名和密码查询用户信息
* @param username
* @param password
* @return
*/
@Select("select * from user where " +
"username=#{username} and password =#{password}")
User getUser(@Param("username") String username, @Param("password") String password);
创建对应的测试方法
@Test
void getUserByUsername() {
// 测试查询用户名存在的用户
User user = userMapper.getUserByUsername("admin");
System.out.println(user);
// 测试查询用户名不存在的用户,会返回null,注意避免空指针异常
User notExist = userMapper.getUserByUsername("notExist");
System.out.println(notExist);
}
@Test
void getUser() {
User user = userMapper.getUser("Tom1","123456");
System.out.println(user);
}
2.5 对象传值
将多个参数传递给SQL时,可以使用对象来封装数据。例如,想将一个用户的信息存入数据库表中,可以直接使用一个User对象来封装用户信息,然后将User对象作为参数传递给Mapper接口的方法。
示例的SQL语句如下:
insert into user (username, password, rold) values (#{username}, #{password}, #{role})
由于用户表在建表时将id字段声明为自增字段,插入语句中可以不提供id字段,数据库会通过自增机制来生成新的id值并写入该行中。
传参时的示例代码如下:
2.6 对象传值示例
在UserMapper接口中声明一个添加用户信息的方法:
/**
* 添加一条用户信息的方法
* @param user 用户信息
* @return 添加成功的数据条数
*/
@Insert("insert into user (username, password, role) " +
"values (#{username}, #{password}, #{role})")
int insertUser(User user);
创建对应的测试方法
@Test
void insertUser() {
User user = new User();
user.setUsername("Jerry");
user.setPassword("123456");
user.setRole("普通用户");
int row = userMapper.insertUser(user);
System.out.println("row = " + row);
}