Java框架_Mybatis框架5_更加复杂的statement拼装

    在上面的入门增删改查中,在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("用户名或密码错误");
		}
		
	}
}

测试结果:

登录失败:

猜你喜欢

转载自blog.csdn.net/m0_37808093/article/details/81053351