Mybatis基础学习(三)—映射文件
一、输入映射
1.parameterType
指定输入参数的Java类,可以使用别名或者类的全限定名。它也可以接受基本数据类型、POJO对象、HashMap。
(1)基本数据类型

(2)POJO对象

(3)传递POJO包装对象
开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
UserQueryVo.java
public class UserQueryVO{
// 用户信息
private User user;
public User getUser(){
return user;
}
public void setUser(User user){
this.user = user;
}
}
UserMapper.xml

UserMapper.java

Test.java

(4)传递HashMap
map的key相当于POJO的属性。
UserMapper.xml

UserMapper.java

Test.java

结果:
User [id=25, username=陈小明, sex=2, birthday=Fri Jul 01 00:00:00 GMT+08:00 2016, address=长春市]
二、SQL标签
通过Mybatis提供的各种动态标签实现动态拼接sql,使得mapper映射文件在编写SQL时更加灵活,方便。常用动态SQL标签有:if、where、foreach。
1.if和where标签
if: 作为判断入参来使用的,如果符合条件,则把if标签体内SQL拼接上。注意:用if 标签判断是否为空时,不仅要判断null,也有判断空串""。
where: 会去掉条件中的第一个And符号。
案例一: 根据用户名和性别查询
UserMapper.xml
<!-- 标签的使用 -->
<select id="findUsersByNameAndSex" parameterType="userQueryVo" resultType="user">
SELECT * FROM user <!--wher标签:将后面第一个AND去掉,如果没有条件则把自己去掉 -->
<where>
<if test="user != null"> <if test="user.username != null and user.username != ''">
AND username LIKE '%${user.username}%'
</if> <if test="user.sex != null and user.sex != ''">
AND sex = #{user.sex}
</if> </if> </where> </select>
UserMapper.java
public interface UserMapper{
public User findUserById(int id);
public void saveUser(User user);
public List<User> findUserList(UserQueryVO uq);
public List<User> findUserByNameAndSex(HashMap hashMap);
public List<User> findUsersByNameAndSex(UserQueryVO vo);
}
Test.java
@Test
public void testFindUsersByNameAndSex(){ SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserQueryVO vo = new UserQueryVO();
User u = new User();
// u.setUsername("小明");
// u.setSex("1");
vo.setUser(u); List<User> list = mapper.findUsersByNameAndSex(vo); for(User user : list){
System.out.println(user);
} sqlSession.close();
}
此时发出的Sql语句: SELECT * FROM user
去掉注释发出的Sql语句是:
Preparing: SELECT * FROM user WHERE username LIKE '%小明%' AND sex = ?
Parameters: 1(String)
2.sql片段
SQL片段的功能可以提高Sql的可重用性。
(1)定义
<!-- Sql片段: 可以将sql中任何部分放到sql片段中 建议: 不要将sql中的关键字放进去,比如 select where -->
<sql id="whereClause">
<if test="user != null"> <if test="user.username != null and user.username != ''">
AND username LIKE '%${user.username}%'
</if> <if test="user.sex != null and user.sex != ''">
AND sex = #{user.sex}
</if> </if>
</sql>
(2)引用SQL片段
<!-- 标签的使用 -->
<select id="findUsersByNameAndSex" parameterType="userQueryVo" resultType="user">
SELECT * FROM user <!--wher标签:将后面第一个AND去掉,如果没有条件则把自己去掉 -->
<where>
<!-- refid: Sql片段的ID -->
<include refid="whereClause"></include> </where> </select>
3.foreach标签
向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到Sql中。
UserMapper.xml

UserMapper.java

Test.java

输出的sql语句:
Preparing: SELECT * FROM user WHERE id IN ( ? , ? , ? , ? )
Parameters: 29(Integer), 31(Integer), 32(Integer), 33(Integer)
Mybatis基础学习(三)—映射文件的更多相关文章
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- Python基础学习三
Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...
- Mybatis基础学习(四)—关系映射
一.模型分析 user和orders user---->orders 一个用户可以创建多个订单,一对多. orders--->user 一个订单只由一个用户创建,一对一. orders ...
- Mybatis(三) 映射文件详解
前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...
- Mybatis学习—XML映射文件
总结自 Mybatis官方中文文档 Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同 ...
- mybatis 学习三 关键文件解析
1: mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...
- 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法
spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...
- Mybatis基础学习(五)—缓存
一.概述 mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能. 一级缓存是SqlSession级别的缓存.在操作数据库时需要 ...
随机推荐
- 在Windows Server2016里通过Hyper-V安装Liunx Container
Windows Server2016正式发布已经有一段时间了.无可厚非,原生Docker的支持是这个版本一个非常大的亮点. Windows Container 的安装在网上有很多教程,我这里不过多的描 ...
- 2017-3-2 C#基础 结构体
1. 结构体:用户自定义类型定义位置:定义在Main函数的外面,类的里面 定义格式:struct 自定义名字{ public 数据类型 名字; public 数据类型 名字; ... ...} 声明实 ...
- 同一环境下新建Standby RAC库
需求:在同一个环境下新建Standby RAC库,即和Primary RAC在相同的磁盘组. 说明:生产环境一般不建议这样配置DG,因为存储层面是相同磁盘组,灾备的实际意义不大.我这里是用作读写分离. ...
- 免费ERP之云实施
近日,普实渠道在AIO5软件免费一周年之际,推出了重磅的动作:启动AIO5云实施,推广小微企业免费ERP落地应用. 这无疑是推动客户免费应用ERP的重大里程碑. 当前,在中国小微企业信息化方面,应用情 ...
- Docker私有仓库--自签名方式
为了能集中管理我们创建好的镜像,方便部署服务,我们会创建私有的Docker仓库.通读了一遍官方文档,Docker为了确保安全使用TLS,需要CA认证,认证时间长的要钱啊,免费过期时间太短,还是用自签名 ...
- 【曝】苹果应用商店逾千款iOS应用存安全漏洞
据国外网站Ibtimes报道,知名网络安全公司FireEye日前警告称,由于一款名为“JSPatch”.可帮助开发者修改应用程序的软件上存在安全漏洞,导致苹果应用商店内1000多款使用了该框架的iOS ...
- [C#7] 1.Tuples(元组)
1. 老版本代码 class Program { static void Main(string[] args) { var fullName = GetFullName(); Console.Wri ...
- redux-form的学习笔记二--实现表单的同步验证
(注:这篇博客参考自redux-form的官方英文文档)左转http://redux-form.com/6.5.0/examples/syncValidation/ 在这篇博客里,我将用redux-f ...
- 初写Python
#!/usr/bin/env python (指定用什么解释器运行脚本以及解释器所在的位置) # -*- coding:utf-8 -*- (用来指定文件编码为utf-8的) # 无效的内容,只做 ...
- wemall app商城源码Fragment中监听onKey事件
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发Fragment中监听onK ...