Mybatis学习笔记5 - 参数处理
1、单个参数:mybatis不会做特殊处理,#{参数名}:取出参数值。
2、多个参数:mybatis会做特殊处理。
多个参数会被封装成 一个map,
key:param1...paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值;
错误示例:
接口定义如下:
package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper {
public Employee getEmpByIdAndLastName(Integer id, String lastName, String email);
} mapper定义如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<!--public Employee getEmpByIdAndLastName(Integer id, String lastName, String email);-->
<select id="getEmpByIdAndLastName" resultType="com.mybatis.bean.Employee">
select * from tbl_employee where id=#{id} and last_name=#{lastName} and email=#{email}
</select>
</mapper> 测试代码如下:
package com.mybatis.demo; import java.io.IOException;
import java.io.InputStream; import com.mybatis.bean.Employee;
import com.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; public class MyTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testSelect() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession(true);
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpByIdAndLastName(4, "jetty", "jetty@126.com");
System.out.println(employee);
} finally {
openSession.close();
}
}
}
上述错误示例抛出异常:
org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, 2, param3, param1, param2]
应该将mapper修改为:
<select id="getEmpByIdAndLastName" resultType="com.mybatis.bean.Employee">
select * from tbl_employee where id=#{param1} and last_name=#{param2} and email=#{param3}
</select>
3、命名参数
上面编写mapper时使用id=#{param1} and last_name=#{param2} and email=#{param3}获取参数的方式不方便。使用命名参数更好。
只要在接口定义中使用@Param注解。
public interface EmployeeMapper {
public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName, @Param("email") String email);
}
完整示例如下:
接口定义:
package com.mybatis.dao; import com.mybatis.bean.Employee;
import org.apache.ibatis.annotations.Param; public interface EmployeeMapper {
public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName, @Param("email") String email);
} mapper定义:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<!--public Employee getEmpByIdAndLastName(Integer id, String lastName, String email);-->
<select id="getEmpByIdAndLastName" resultType="com.mybatis.bean.Employee">
select * from tbl_employee where id=#{id} and last_name=#{lastName} and email=#{email}
</select>
</mapper> 测试代码:
package com.mybatis.demo; import java.io.IOException;
import java.io.InputStream; import com.mybatis.bean.Employee;
import com.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; public class MyTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testSelect() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession(true);
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpByIdAndLastName(4, "jetty", "jetty@126.com");
System.out.println(employee);
} finally {
openSession.close();
}
}
}
命名参数:明确指定封装参数时map的key;@Param("id")
多个参数会被封装成 一个map,
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
4、POJO:如果多个参数正好是业务逻辑的数据模型,就可以直接传入pojo;#{属性名}:取出传入的pojo的属性值
示例如下:
接口定义:
package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper {
public Employee getEmpByIdAndLastName(Employee employee);
} mapper定义:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<select id="getEmpByIdAndLastName" parameterType="com.mybatis.bean.Employee" resultType="com.mybatis.bean.Employee">
select * from tbl_employee where id=#{id} and last_name=#{lastName}
</select>
</mapper> 测试代码:
package com.mybatis.demo; import java.io.IOException;
import java.io.InputStream; import com.mybatis.bean.Employee;
import com.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; public class MyTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testSelect() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession(true);
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpByIdAndLastName(new Employee(4,"jetty", "jetty@126.com", 1));
System.out.println(employee);
} finally {
openSession.close();
}
}
}
5、Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,也可以传入map,#{key}:取出map中对应的值
使用示例:
接口定义:
package com.mybatis.dao; import com.mybatis.bean.Employee; import java.util.Map; public interface EmployeeMapper {
public Employee getEmpByIdAndLastName(Map<String, Object> map);
} mapper定义:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<select id="getEmpByIdAndLastName" parameterType="java.util.Map" resultType="com.mybatis.bean.Employee">
select * from tbl_employee where id=#{id} and last_name=#{lastName}
</select>
</mapper> 测试代码:
package com.mybatis.demo; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; import com.mybatis.bean.Employee;
import com.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; public class MyTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testSelect() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession(true);
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 5);
map.put("lastName", "jetty");
Employee employee = mapper.getEmpByIdAndLastName(map);
System.out.println(employee);
} finally {
openSession.close();
}
}
}
6、DTO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个DTO(Data Transfer Object)数据传输对象。
7、关于参数处理的思考:
(1)、public Employee getEmp(@Param("id")Integer id,String lastName);
取值:id==>#{id/param1} lastName==>#{param2}
(2)、public Employee getEmp(Integer id,@Param("e")Employee emp);
取值:id==>#{param1} lastName===>#{param2.lastName/e.lastName}
(3)、特别注意:如果是Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用list这个key,如果是数组则使用array这个key。
public Employee getEmpById(List<Integer> ids);
取值:取出第一个id的值: #{list[0]}
Mybatis学习笔记5 - 参数处理的更多相关文章
- Mybatis学习笔记——输入参数parameterType、Mybatis调用存储过程
输入参数:parameterType(两种取值符号) 1.类型为简单类型 区别: (1) #{可以为任意值} ${vaue}--->标识符只能是value (2) ...
- Mybatis学习笔记(二) 之实现数据库的增删改查
开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- Mybatis学习笔记二
本篇内容,紧接上一篇内容Mybatis学习笔记一 输入映射和输出映射 传递简单类型和pojo类型上篇已介绍过,下面介绍一下包装类型. 传递pojo包装对象 开发中通过可以使用pojo传递查询条件.查询 ...
- Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
- mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...
- mybatis 学习笔记(二):mybatis SQL注入问题
mybatis 学习笔记(二):mybatis SQL注入问题 SQL 注入攻击 首先了解下概念,什么叫SQL 注入: SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞. ...
- mybatis 学习笔记(一):mybatis 初认识
mybatis 学习笔记(一):mybatis 初认识 简介 MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来.mybatis 可以将 prepar ...
随机推荐
- ZROI2018提高day3t3
传送门 分析 我们对于每一个可以匹配的字符都将其从栈中弹出,然后他的哈希值就是现在栈中的字符哈希一下.然后我们便可以求出对于哪些位置它们的哈希值是一样的,即它们的状态是一致的.而这些点可以求出它们的贡 ...
- 每日一Git计划启动
效仿某大神,每日一Git,初次启动,维时30天 规范: 1. 不能提交纯属搞笑灌水的 2. 可以提交ACM题目代码 3. 想不到了..靠自觉的东西,对自己有提升的就做,没提升纯属刷数据的就不算吧.. ...
- 《Maven实战》笔记-4-生命周期和插件
除了坐标.依赖以及仓库外,Maven另外两个核心概念是生命周期和插件. 一.生命周期 Maven的生命周期是抽象的,其本身不做任务实际的工作,实际的任务(如编译源代码)都交由插件来完成. 三套生命周期 ...
- Mac下配置MAMP Pro+PHPStorm
一.配置MAMP Pro Hosts 下载地址:http://xclient.info/s/mamp-pro.html 在Hosts页签下,如图所示位置选择你工程目录 二.配置PHPStorm 1.点 ...
- mac port选择使用的python的版本
To list: port select --list python To show: port select --show python To select: sudo port select -- ...
- blkid找不到需要的uuid
记录: blkid找不到需要的uuid,需要格式化后才有
- Github加载慢,显示不完整问题解决
问题: 在访问Github网站的时候,可能会遇到网站响应超时,图片加载不出,排版错误等情况(大部分情况下是可以正常打开的). 解决方法: 修改 C:\Windows\System32\drivers\ ...
- GitHub下载代码到本地
1.git clone git@github.com:Sehunwy/test.git(加粗的是下载的地址) 2.下载完成,此时本地是这样的: 参考:https://blog.csdn.net/qq ...
- The working copy "Test" failed to commit files.问题解决
1.产生来源及现象 1.1 来源:往图片资源中替换旧图片资源,导致与原来的图片产生冲突. 1.2 原因分析 2.解决办法 删了重新加一下就可以提交了
- STL迭代器思考
在遍历STL容器类对象时进行插入和删除操作本身即是不合理的...再想想,待续... STL容器迭代过程中删除元素技巧(转) 1.连续内存序列容器(vector,string,deque) 序列容器 ...