【工程截图】

【代码实现】

【user.java】

package com.Higgin.Mybatis.po;

import java.util.Date;

public class User {
//属性名和数据库表字段对应
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
//对应的get、set方法
}

【UserCustom.java】

package com.Higgin.Mybatis.po;

/*可以用于扩展用户的信息*/
public class UserCustom extends User{
//如果需要可以在这里增加拓展的具体信息
}

【UserQueryVo.java】

package com.Higgin.Mybatis.po;

/**
* 需求:
* 完成用户信息的总和查询,需要传入查询条件很复杂(可能还包括用户信息、其他信息、比如商品、订单等)
* 针对上述需求,建议使用自定义的包装类型的pojo
* 在包装类中将复杂的查询条件包装进去
*/
public class UserQueryVo {
//在这里包装所需的查询条件 //用户查询条件
private UserCustom userCustom; //这里对应着上边的UserCustomer变量 public UserCustom getUserCustom() {
return userCustom;
} public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}

【UserMapper.xml】   //配置非常重要!!!!!,namespace必须对应相应的接口名称:com.Higgin.Mybatis.mapper.UserMapper

 <mapper namespace="com.Higgin.Mybatis.mapper.UserMapper">
<!--
用户信息的综合查询(复杂查询)
#{userCustom.sex}:取出pojo包装对象中的"性别"值
#{userCusotm.username}:取出pojo包装类中用户名称
-->
<select id="findUserList" parameterType="com.Higgin.Mybatis.po.UserQueryVo"
resultType="com.Higgin.Mybatis.po.UserCustom">
SELECT * FROM USER WHERE user.sex =#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'
</select>
</mapper>

【UserMapper.java】接口,UserMapper.java接口中的方法:findUserList和UserMApper.xml中的方法名要一致

package com.Higgin.Mybatis.mapper;

import java.util.List;

import com.Higgin.Mybatis.po.User;
import com.Higgin.Mybatis.po.UserCustom;
import com.Higgin.Mybatis.po.UserQueryVo; public interface UserMapper { //用户信息综合查询findUserList
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
}

【SqlMapperCongfg.xml】  //添加一个加载文件,这个文件会在测试类中被加载

<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/user.xml"/>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>

【UserMapperTest.java】  //测试类

public class UserMapperTest {

    private SqlSessionFactory sqlSessionFactory ;

    @Before
public void setUp() throws Exception {
//创建sqlSessionfactory
//MyBatis配置文件
String resource="SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,传入MyBatis的配置文件信息
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 用户信息的综合复杂查询
* @throws Exception
*/
@Test
public void testFindUserList() throws Exception { SqlSession sqlSession =sqlSessionFactory.openSession(); //创建一个UserMapper对象,Mybatis自动生成mapper代理对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //创建包装对象,设置查询条件
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom(); userCustom.setSex("1");
userCustom.setUsername("6"); userQueryVo.setUserCustom(userCustom); //调用UserMapper的方法
List<UserCustom> list=userMapper.findUserList(userQueryVo); System.out.println(list.size());
} }

【运行结果】

【debug的list的数据,所有性别为“1”,username中包含"6"的数据组】

12_复杂查询01_Mapper代理实现的更多相关文章

  1. 【源码】Python3使用Requests抓取和检测电光代理API,并查询ip代理是否成功

    电光代理成立后,做一篇笔记,记录我使用Requests抓取和测试电光代理的方法 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...

  2. Java代理模式之动态代理

    动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件.代理角色和真实角色的联系在程序运行时确定! Java中有两种动态代理,一种是JDK自带的,另一种的CGL ...

  3. Hibernate多表查询、查询优化策略(四)

    多表HQL private static void innerJoin(){ //sql内连接 隐式内连接 select * from A,B where b.aid = a.id // 显示内连接 ...

  4. git设置代理模式,仅为github设置代理

    设置代理: 全局代理 git config --global http.proxy 127.0.0.1:1087 局部代理,在github clone 仓库内执行 git config --local ...

  5. 服务器上的 IPProxy代理设置

    1.window 平台 CCProxy 安装包 传送门: http://www.xue51.com/soft/2794.html 该页面详细的说明了ccproxy怎么安装.怎么破jie.... 下面老 ...

  6. python爬取高匿代理IP(再也不用担心会进小黑屋了)

    为什么要用代理IP 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人 ...

  7. python代理池的构建4——mongdb数据库的增删改查

    上一篇博客地址:python代理池的构建3--爬取代理ip 一.mongdb数据库的增删改查(Mongo_pool.py) #-*-coding:utf-8-*- ''' 实现代理池的数据库模块 ●作 ...

  8. Flask 之 高可用IP代理网站

    高可用代理IP网站 目标:提供高可用代理IP 步骤一:通过爬虫获取代理IP 步骤二:对代理IP进行检测,判断代理是否可用 步骤三:将可用的代理IP写入mongodb数据库 步骤四:创建网站,从数据库获 ...

  9. java时间计算,获取某月第一天和最后一天

    //获取前月的第一天 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); //获取当前月第一天: Calendar ...

随机推荐

  1. java 小结1(static ,final,泛型)

    static,final. (1)final: final:属于“终态”,意思就是不可以改变.可以修饰非抽象类,非抽象类的方法等.反正就是不能够再改变赋值了. 注意:1)fina类不能被继承,所以它没 ...

  2. java枚举enum

    http://www.cnblogs.com/wenruo/p/5349614.html java的枚举通过关键字enum实现.可以理解为一个类,不过这个类由编译器自动加了一些方法. static v ...

  3. 读FCL源码系列之List<T>---让你知其所以然---内含疑问求大神指点

    序言 在.NET开发中,List<T>是我们经常用到的类型.前段时间看到其他部门小伙伴讨论“两个List(10W个元素)集合求并集,list1.Where(p=>list2.Cont ...

  4. php的fread函数的一个巨大的坑

    先看看fread的manual,如下: http://php.net/manual/en/function.fread.php fread() reads up to length bytes fro ...

  5. thinkphp3.2.3 版本使用redis缓存的时候无法使用认证

    我在使用thinkphp3.2.3的时候 发现如果是使用redis缓存 设置了认证的redis能连接成功 却无法 set 操作 ,检查发现是没有认证导致的  $redis->auth这一步没有, ...

  6. Android开发书籍推荐

    当你看到这些文字时,那么恭喜你,你可能选择了一个无限可能的方向. Android,Google出品,信誉保证,你值得深入研究. 学习一样新事物或许有多种方式,报培训班,看视频,向高手请教等等,但一本好 ...

  7. WINFORM跟随WPF窗体移动

    <Window x:Name="mainWindow1" x:Class="WpfApplication9.MainWindow"         xml ...

  8. Callgrind 使用 2

    Callgrind是一款和gprof类似的性能分析工具,与gprof不同的是它不需要在编译源码时附加特殊选项,但推荐加上调试选项.Callgrind使用cachegrind的统计信息Ir(I cach ...

  9. careercup-树与图 4.1

    4.1 实现一个函数,检查二叉树是否平衡.在这个问题中,平衡树的定义如下:任意一个结点,其两颗子树的高度差不超过1. C++实现代码: #include<iostream> #includ ...

  10. 菜单类(CCMenu,CCMenuItem)