【工程截图】

【代码实现】

【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. shell常用命令总结

    统计文件行数 wc -l filename grep -c "" filename sed -n '$=' filename awk 'END{print NR}' filenam ...

  2. Linux中link,unlink,close,fclose详解

    每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数.       当通过shell的touch命令或者在程序中open一个带有O_CR ...

  3. 微软2016校园招聘4月在线笔试 ABC

    题目链接:http://hihocoder.com/contest/mstest2016april1/problems 第一题:输入N,P,W,H,代表有N段文字,每段有ai个字,每行有⌊W/S⌋个字 ...

  4. 【荐】Redis学习资料汇总

    Redis学习手册(目录) - Stephen_Liu - 博客园 Redis 命令参考 — Redis 命令参考 Redis_php 学习 - 简单--生活 - 博客园

  5. 成都Uber优步司机奖励政策(2月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. EF查看sql的方法

    using (context = new DataBaseContext()) { #region EF6.0 var listuser =context.dbuser.ToList(); Log.D ...

  7. 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。

    出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...

  8. DM8168 DVRRDK软件框架研究

    转载注明:http://blog.csdn.net/guo8113/article/details/41120491 Netra(DM8168)处理器是个多核处理器,每一个核之间相互独立却又相互关联, ...

  9. sed命令详解--转

    1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  10. Bash String Manipulation Examples – Length, Substring, Find and Replace--reference

    In bash shell, when you use a dollar sign followed by a variable name, shell expands the variable wi ...