在上面的入门增删改查中,在mapper文件中拼装的statement都是简单的SQL,而实际开发中,往往需要对数据库进行更复杂的操作,比如多条件查询等,那么在多条件情况下,如何进行输入映射呢?思路是将这些条件封装成一个VO(值对象),在通过输入参数的方式传递进statement拼装SQL语句。
※一个模拟用户登陆的案例(查询条件包含用户名和密码,即多条件查询)
首先项目结构如下:
PS:在有多项较复杂查询时,封装成vo,这里为方便就直接封装成model中的对象,vo本质上就是model,只是在开发时,为了规范,会将model层细分为po(持久化对象,用于持久化)和vo(值对象,用于传递中间值).
测试数据库表:
配置好框架配置文件:
<configuration>
<properties resource="jdbc.properties"></properties>
<typeAliases>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.DriverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.mybatis.mapper"/>
</mappers>
</configuration>
对于还没确定的配置项,先空着。
接着开始写model层,只需要一个User实体对象就可以了:
public class User {
private int userId;
private String username;
private String password;
//省略get/set
}
service层(只有一个操作,通过用户名与密码进行查询):
public interface UserService {
public User findUserByUsernameAndPassword(User user);
}
接着实现UserService,由于是通过Mapper代理进行开发,所以在写实现之前要先写Mapper接口以及对应的Mapper映射文件:
public interface UserMapper {
public User findUserByUsernameAndPassword(User user);
}
映射文件UserMapper.xml,这里要注意一点,由于在数据库测试表中,主键为user_id,而我们在实体对象中为usrId,这样SQL语句中如果写select * from...,id是无法进行映射的,一般有两种解决方法:
1.将select * 改成 select user_id,userId,username,password from 即使用别名
2.使用resultMap:
<mapper namespace="com.mybatis.mapper.UserMapper">
<select id="findUserByUsernameAndPassword" parameterType="user" resultMap="userMap">
select * from user where username = #{username} and password = #{password}
</select>
<resultMap type="user" id="userMap">
<id property="userId" column="user_id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
</mapper>
resultMap中的属性:
type:表示返回值的类型。
id:作为一个resultMap被引用时的唯一标识
resultMap的子元素说明:
id属性:用于设置主键的映射关系
result:用于设置普通字段的映射关系
由于在mapper中使用了别名,所以还要在配置文件中配置好别名扫描:
<typeAliases>
<package name="com.mybatis.model"/>
</typeAliases>
有了Mapper接口就可以拿到Mapper代理,接着就可以写UserService的实现了:
public class UserServiceImpl implements UserService{
@Override
public User findUserByUsernameAndPassword(User user) {
SqlSession session = MybatisUtil.getFactory().openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
return userMapper.findUserByUsernameAndPassword(user);
}
}
到这里,整个流程就通了,进行测试:
public class UserTest {
@Test
public void testUser() throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名");
String username = scanner.nextLine();
System.out.println("请输入密码");
String password = scanner.nextLine();
User vo = new User();
vo.setUsername(username);
vo.setPassword(password);
UserService userService = new UserServiceImpl();
User user = userService.findUserByUsernameAndPassword(vo);
if(user != null){
System.out.println("欢迎"+user.getUsername()+"登录");
}else {
System.out.println("用户名或密码错误");
}
}
}
测试结果:
登录失败: