之前讲过用Mapper动态代理的方式进行查询,今天在此基础上用包装类的形式进行查询。
开发中通过可以使用pojo传递查询条件。
查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
包装对象:Pojo类中的一个属性是另外一个pojo。
新建包装类QueryVo,把User类进行包装,通过这个QueryVo,可以获得User类的user对象,从而层层包装获取user的各种属性package com.itheima.mybatis.pojo;
import java.io.Serializable;
public class QueryVo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
在UserMapper.xml配置文件里面,进行增删改查配置,id是Mapper接口的方法名,resultType和parameterType和Mapper接口方法的一一对应。
<!--通过包装类,把User对象放进包装类里面,对包装类进行模糊查询 -->
<select id = "queryQueryVoByusername" parameterType = "queryVo" resultType = "com.itheima.mybatis.pojo.User">
select * from user
where
username like '%${user.username}%'
</select>
<!--对包装类进行插入insert 没有返回值,所以没有resultType, 包装类的时候,user.username需注意-->
<insert id = "insertQueryVo" parameterType = "queryVo" >
insert into user
(username,birthday,sex,address) values
(#{user.username},#{user.birthday},#{user.sex},#{user.address})
</insert>
<!-- 对包装类进行更新 -->
<update id = "updateQueryVo" parameterType = "queryVo">
update user
set username = #{user.username} where id = #{user.id}
</update>
<!--查询表条目数量 select count(*)from user 把性别和姓名相似的行数统计出来 -->
<select id = "queryUserCount" parameterType = "queryVo" resultType = "int">
select count(*)from user where user.sex = #{user.sex} and user.username like '%${user.username}%'
</select>
UserMapper接口
List<User> queryQueryVoByusername(QueryVo queryVo);//包装类进行模糊查询
void insertQueryVo(QueryVo queryVo);//包装类进行插入
void updateQueryVo(QueryVo queryVo);//包装类进行更新
int queryUserCount(QueryVo queryVo);//查询数据表条目,通过这个方法直接找到UserMapper.xml文件执行sql,直接得到一个int值返回,打印出来即可
下面进行JUNIT测试类的编写,其实和之前没什么区别,只不过user的各种属性set进去之后返回给包装类对象queryVo接收,最后userMapper对象调用接口的方法,把queryVo传进去即可完成查询,还可以输出查询一条POJO对象或者POJO列表。
@Test
public void testqueryQueryVoByusername(){
SqlSession sqlSession = this.sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
try {
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUsername("张");
queryVo.setUser(user);//层层包装
//开始查询
List<User> list = userMapper.queryQueryVoByusername(queryVo);
for (User u : list) {
System.out.println(u);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
}
@Test
public void testinsertQueryVo(){
SqlSession sqlSession = this.sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
try {
QueryVo queryVo = new QueryVo();
User user = new User();
user.setAddress("A");
user.setBirthday(new Date());
user.setSex("男");
user.setUsername("Q");
queryVo.setUser(user);
userMapper.insertQueryVo(queryVo);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
@Test
public void testupdateQueryVo(){
SqlSession sqlsession = this.sqlSessionFactory.openSession();
UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
try {
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUsername("QQQ");
user.setId(49);
queryVo.setUser(user);
userMapper.updateQueryVo(queryVo);
sqlsession.commit();
} finally {
sqlsession.close();
}
}
@Test
public void testqueryUserCount(){//查询特定列属性值一致的行数,输出行数,但是特定属性一致需要进行包装类进行set
SqlSession sqlsession = this.sqlSessionFactory.openSession();
UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
try {
QueryVo queryVo = new QueryVo();
User user = new User();
user.setSex("1");
user.setUsername("张");
queryVo.setUser(user);
int count = userMapper.queryUserCount(queryVo);
System.out.println("User表的条目一共有"+count+"条。");
sqlsession.commit();
} finally {
sqlsession.close();
}
}