mybatis之输入映射

2017-04-22 12:37
  • 在我们生活中遇到的查询肯定不会像平时测试代码那么简单,有可能需要结合很多张表进行查询,这样的话包装类就显得尤为重要,话不多说,直接开启学习之路。
  • 假定我们现在有一张表,这里我们生成了一个java bean,如下:
  • public class User {
        private int id;
        private String username;
        private String sex;
        private Date birthday;
        private String address;
        }

    get和set方法已省略。。

  • 我们就仅仅来模拟一下如果需要对这张表进行扩充,但是这表已经生成,那么我们就不能在源代码上做修改,这时我们可以用到装修模式,
    重新定义一个类,让它继承User对象,这样我们就可以对原有的功能进行增加了。
  • public class UserExt extends User{
        private UserExt userExt;
        private ...
    
        public UserExt getUserExt() {
            return userExt;
        }
    
        public void setUserExt(UserExt userExt) {
            this.userExt = userExt;
    
        }
    
    
    }
  • 那么重点来了,我们的主要目的是不是为查一个表而查,我们需要对很多信息进行查询,这样我们是不是可以用类的包装来实现呢?我们试一试
  • public class UserQueryVO {
        private UserExt userExt;
        private User user;
    
        public UserExt getUserExt() {
            return userExt;
        }
        public void setUserExt(UserExt userExt) {
            this.userExt = userExt;
        }
    
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.usert = user;
        }
    
    
    
    }

    其实上边传进去的参数都是一回事,因为本身UserExt继承了User对象,我们就简单的模拟一下怎么在包装类中进行扩展查询。

  • 我们需要一个配置文件
  • <mapper namespace="XXX.UserMapper">
    <select id="findUserList" parameterType="xxx.UserQueryVO" resultType="xxx.User">
        SELECT * FROM USER WHERE user.sex='${userExt.sex}' AND user.username LIKE '%${userExt.username}%'; 
    </select>
    </mapper>

    上面的代码是sql语句的描述,id为接口方法名称,parameterType为传入参数类型,resltType为返回值类型,因为我们已经把User对象包装在了UserQueryVO 对象中,所以传进来的参数类型完全可以有它去承担,
    最后的返回值本人写上去的是User对象,但也可以把装饰过后的UserExt对象作为返回对象,得到的结果都是一样的。

  • 接口类方法
  • public int findUsersCount(UserQueryVO userQueryVO);
  • 测试
  •     @Test
        public void testForList(){
            SqlSession sqlSession=sqlSessionFactory.openSession();
            UserMapper mapper=sqlSession.getMapper(UserMapper.class);
            UserQueryVO userQueryVO=new UserQueryVO();
            UserExt userExt=new UserExt();
            userExt.setSex("boy");
            userExt.setUsername("os");
            userQueryVO.setUserExt(userExt);
            List<User> list=mapper.findUserList(userQueryVO);
            System.out.println(list);
        } 

    测试类中,我们new了两个对象,一个包装类和一个装饰类,这样我们就可以为它们进行赋值和操作了。

  • 结果
    log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    [User [id=3, username=rose, sex=boy, birthday=Wed Mar 11 00:00:00 CST 2015, address=china]]
  • 总结

    要使用包装对象可以分为以下几步

    1. 确定查询对象
    2. 将对象包装进一个新的类中,并完成get和set方法,以后的查询操作都将在这个包装类中进行,引用其中的数据可以通过对象.方法操作
    3. 配置文件注意传入参数类型和返回值类型
    4. 测试时需要对两个对象进行new操作。