where查询条件具有单一性的话,我们可以通过#{} ${}来表示对某字段的筛选;但是如果需要进行复杂查询,也可以通过定义一个pojo对象来实现。
- 首先,介绍一下OGNL表达式
OGNL表达式支持通过类名.属性名来达到类名.成员方法名()的效果。
如一个自定义的User类 user对象中,可以通过user.username来访问user.getUsername()。 - 编写实体类(记得mysql里建个表哦)
/entity getter setter省略/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
/*getters and setters */
@Override
public String toString() {
return “User [id=” + id + “, username=” + username + “, birthday=” + birthday + “, sex=” + sex + “, address=”+address + “]”;
}
}
- 编写QueryVo class,即POJO对象,其实就是封装了一层实体类,以定义一些复杂的查询操作
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
- 编写IUserDao.xml
在该配置文件中 添加一个element
/IUserDao.xml in resources/
select * from user where username like #{user.username}
5 编写测试类
/*test code*/
@Test
public void testFindByVo() throws IOException {
QueryVo vo = new QueryVo();
User user = new User();
user.setUsername("%Fighter%");
vo.setUser(user);
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
IUserDao userDao = session.getMapper(IUserDao.class);
List<User> users = userDao.findByVo(vo);
for(User u:users) {
System.out.println(u);
}
}