mybatis学习(六)——参数处理
先总结一下,后面再一个个解释:
单个参数:直接使用#{参数名}进行取值,mybatis没做特殊处理,参数名可以随便写。
多个参数:使用#{param1},#{param2}取值
命名参数:通过@param("key")明确指定封装map中的key,就可以通过#{key}取出参数值了
POJO:如果多个参数正好是业务模型,这时候就可以传入业务模型,通过#{属性名}就可以取值了
Map:如果多个参数不是业务模型,而且不经常使用,可以自定义Map传入
TO:如果多个参数不是业务模型,而且经常使用,可以自定义一个TO来传输对象
1、单个参数
在配置sql映射文件中,sql语句传入一个参数时,应该怎么传呢
前面我们试验过mybatis不做特殊处理,只需要用 #{参数名} 取出参数值就可以了。
<?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.pjf.mybatis.dao.HotelMapper">
<!-- public Hotel getHotel(Integer i); -->
<select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
select id,hotel_name as
hotelName, hotel_address as hotelAddress, price from hotel
where
<!-- 这里#{id}可以写成任何值如 #{abc}-->
id=#{id}
</select>
</mapper>
注:事实上这里#{id},参数名id可以写任何值,因为只有传了一个参数。。
2、多个参数
首先举个例子,理所当然,很容易认为是这样去取参数值,直接写#{id}和#{price}
<?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.pjf.mybatis.dao.HotelMapper">
<!-- public Hotel getHotel(Integer i,Integer j); -->
<select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
select id,hotel_name as
hotelName, hotel_address as hotelAddress, price from hotel
where
id=#{id} and price =#{price}
</select>
</mapper>
这样是不对的,运行之后发现报错了
Caused by: org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [arg1, arg0, param1, param2]
事实上,多个参数时,mybatis会做特殊处理,多个参数会被封装成map
key是param1, param2.....或者0、1、2索引值
value是参数值
下面可以再实验下,将参数名改为#{param1},#{ param2}
<?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.pjf.mybatis.dao.HotelMapper">
<!-- public Hotel getHotel(Integer i,Integer j); -->
<select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
select id,hotel_name as
hotelName, hotel_address as hotelAddress, price from hotel
where
id=#{param1} and price =#{param2}
</select>
</mapper>
可以发现这时候结果就对了
3、命名参数
事实上,人们还是习惯使用#{id}和#{price}而不是#{param1}和#{param2},当然mybatis也提供了解决办法
通过@param("key")明确指定封装map中的key,就可以通过#{key}取出参数值了
@param("key")写在hotelMapper接口上
package com.pjf.mybatis.dao;
import org.apache.ibatis.annotations.Param;
import com.pjf.mybatis.po.Hotel;
public interface HotelMapper {
public Hotel getHotel(@Param("id")Integer i,@Param("price")Integer j);
}
hotelMapper.xml
<?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.pjf.mybatis.dao.HotelMapper">
<!-- public Hotel getHotel(@Param("id")Integer i,@Param("price")Integer j); -->
<select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
select id,hotel_name as
hotelName, hotel_address as hotelAddress, price from hotel
where
id=#{id} and price =#{price}
</select>
</mapper>
这时候就可以通过#{id}和#{price}取出参数值了。
4、map
上面是@param("key")指定一个key,那么我们当然也可以自己传入一个Map。
实例:
hotelMapper接口
package com.pjf.mybatis.dao; import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.pjf.mybatis.po.Hotel; public interface HotelMapper { public Hotel getHotel(Map<String,Integer> map); }
hotelMapper.xml和上面一样
<?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.pjf.mybatis.dao.HotelMapper">
<!-- public Hotel getHotel(@Param("id")Integer i,@Param("price")Integer j); -->
<select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
select id,hotel_name as
hotelName, hotel_address as hotelAddress, price from hotel
where
id=#{id} and price =#{price}
</select>
</mapper>
测试类
package com.pjf.mybatis; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; 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; import com.pjf.mybatis.dao.HotelMapper;
import com.pjf.mybatis.po.Hotel; public class TestHotel { public SqlSessionFactory sqlSessionFactory() throws IOException {
// mybatis的配置文件
String resource = "mybatis_config.xml";
// 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)TestHotel.class.getClassLoader()
InputStream is = Resources.getResourceAsStream(resource);
// 构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
return sessionFactory;
} // 查
@Test
public void getHotel() throws IOException { SqlSessionFactory sessionFactory = sqlSessionFactory();
SqlSession session = sessionFactory.openSession();
HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
System.out.println(hotelMapper.getClass());
//手动封装一个map传入
Map map =new HashMap<>();
map.put("id", 1001);
map.put("price", 997);
Hotel hotel = hotelMapper.getHotel(map);
System.out.println(hotel);
session.close();
}
}
5、对象参数(POJO)
如果多个参数正好是业务模型,这时候就可以直接传如对象,通过#{属性值}就可以取到对象的属性值了
hotelMapper接口
package com.pjf.mybatis.dao; import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.pjf.mybatis.po.Hotel; public interface HotelMapper {
public Hotel getHotel(Map<String,Integer> map);
//直接传入hotel业务模型
public void insertHotel(Hotel hotel);
}
6、对象参数(TO)
如果多个参数不是业务模型,但是有用的比较频繁时,这时候我们可以编写一个TO对象专门用来传递参数
package com.pjf.mybatis.po;
public class HotelTo {
private int id;
private int price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
这时候接口就可以修改为
package com.pjf.mybatis.dao; import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.pjf.mybatis.po.Hotel; public interface HotelMapper {
public Hotel getHotel(Map<String,Integer> map); //传入HotelTo 模型
public void insertHotel(HotelTo hotelTo);
}
思考:
public void insertHotel(Integer id,Hotel hotel);对于这个id应该sql怎么取值呢,是不是可以使用#{param1},那么的Hotel对象的price应该怎么取值呢?
mybatis学习(六)——参数处理的更多相关文章
- mybatis学习六 parameterType 属性
1. 在 XXXMapper.xml 中<select><delete>等标签的 parameterType 可以控制参数类型2. SqlSession 的 selectLis ...
- mybatis 学习六 MyBatis主配置文件
在定义sqlSessionFactory时需要指定MyBatis主配置文件: <bean id="sqlSessionFactory" class="org.myb ...
- hive学习(六) 参数和动态分区
1.hive 参数.变量 1.1hive的命名空间: hive当中的参数.变量,都是以命名空间开头
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- (转)MyBatis框架的学习(六)——MyBatis整合Spring
http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)
继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...
- Mybatis 的输入参数学习
mybatis 的输入参数: 指得就是parameterType的参数 这个参数就代表的sql语句中的输入参数 sql语句中的参数使用 有两种方式 : 使用#{} 获取: 8个基本数据类型 + S ...
- mybatis学习之CLOB、BLOB处理及多参数方法映射
CLOB数据mysql对应数据类型为longtext.BLOB类型为longblob: model实体: ... private Integer id; private String name; pr ...
- Mybatis学习笔记之一(环境搭建和入门案例介绍)
一.Mybatis概述 1.1 Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了go ...
随机推荐
- hdu 5093 Battle ships (二分图)
二分图最大匹配问题 遇到冰山就把行列拆成两个部分.每个部分x也好,y也好只能匹配一次 图画得比较草,将就着看 横着扫一遍,竖着扫一遍,得到编号 一个位置就对应一个(xi,yi)就是X集到Y集的一条边, ...
- 在DataGridView控件中显示图片
实现效果: 知识运用: DataGridView控件的DataSource属性 实现代码: private void Form1_Load(object sender, EventArgs e) { ...
- JDBC连接数据库报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. ......
问题:Java程序使用JDBC连接MySQL数据库时,控制台报错如下: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' ...
- Java基础面试操作题: File IO 文件过滤器FileFilter 练习 把一个文件夹下的.java文件复制到另一个文件夹下的.txt文件
package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- iOS 绘制1像素的线
一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到P ...
- python入门:从安装python开始
python简介: Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明 ...
- ipvsadm启动报错解决方法
Centos7 yum -y install ipvadm 安装后,启动ipvsadm却报错. Redirecting to /bin/systemctl start ipvsadm.service ...
- paper:synthesizable finite state machine design techniques using the new systemverilog 3.0 enhancements 之 standard verilog FSM conding styles(三段式)
Three always block style with registered outputs(Good style)
- golang http 中间件
golang http 中间件 源码链接 golang的http中间件的实现 首先实现一个http的handler接口 type Handler interface { ServeHTTP(Respo ...
- centos 7 安装WordPress的参考博文
安装方法: https://www.cnblogs.com/flankershen/p/7476415.html 安装完,测试不成功的解决办法: https://blog.csdn.net/u0104 ...