之前我们所做的查询,都是借助一个pojo类来传递参数到sql语句中,但现实的项目场景中,查询条件往往很复杂,比如:查询条件可以有user信息,商品信息,订单信息等。
这时候,就需要我们来编写pojo的包装器类型来封装更多的查询条件字段。
1、先在mapper.xml中定义sql语句,如下:
<!-- 自定义查询条件查询,借助定义pojo包装类型实现
parameterType:指定包装类型,将不同的参数(可以是pojo,也可以是简单类型)传入进去
包装类型的好处:
-->
<select id="findUserList" parameterType="userQueryVo" resultType="user">
select * from user where username like '%${userCustom.username}%'
</select>
2、定义包装器类型,借助原pojo类的子类型(具体的字段扩展在子类中进行,避免pojo类和查询条件类型的过度耦合)
pojo类:
package com.js.mybatis.po;
/**
* 用户po类
*/
import java.util.Date;
public class User {
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
private int id;
private String username;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
private Date birthday;
private String address;
}
pojo扩展类:
package com.js.mybatis.po;
/**
* User扩展对象
* 用于继承user类,直接获取user对象的字段
* 并添加一些扩展字段
* @author jiangs
*
*/
public class UserCustom extends User{
//可以添加一些user类中没有的字段
//...
}
pojo包装类(parameterType中使用此类):
package com.js.mybatis.po;
/**
* pojo包装类型,将来在使用时从页面传到controller、service、mapper
* 用于扩展mapper接口单一的参数类型
* @author jiangs
*
*/
public class UserQueryVo {
private UserCustom userCustom;
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
编写测试用例:
package com.js.mybatis.mapper;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.js.mybatis.po.User;
import com.js.mybatis.po.UserCustom;
import com.js.mybatis.po.UserQueryVo;
public class UserMapperTest {
SqlSessionFactory sessionFactory;
@Before
public void setUp() throws Exception{
//创建SqlSessionFactory
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
// @Test
// public void testFindUserById() throws Exception {
// SqlSession sqlSession = sessionFactory.openSession();
// //创建代理对象
// UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// User user = userMapper.findUserById(1);
// System.out.println(user);
// }
// @Test
// public void testFindUserByName() throws Exception {
// SqlSession sqlSession = sessionFactory.openSession();
// //创建代理对象
// UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// List<User> userlist = userMapper.findUserByName("某男男");
// for(User user:userlist){
// System.out.println(user);
// }
// }
// @Test
// public void testAddUser()throws Exception{
// SqlSession session = sessionFactory.openSession();
// UserMapper userMapper = session.getMapper(UserMapper.class);
// User user = new User();
// user.setAddress("mapper新增 addr");
// user.setBirthday(new Date());
// user.setSex("女");
// user.setUsername("mapper新增 name");
// userMapper.addUser(user);
// session.commit();
// session.close();
// }
@Test
public void testFindUserList()throws Exception{
SqlSession session = sessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setAddress("mapper新增 addr1111");
userCustom.setBirthday(new Date());
userCustom.setSex("女");
userCustom.setUsername("小明");
userQueryVo.setUserCustom(userCustom);
List<User> userlist = userMapper.findUserList(userQueryVo);
System.out.println(userlist);
session.close();
}
}