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 ...
随机推荐
- Vue中使用computed与watch结合实现数据变化监听
目的:当数据变化时,为其中重要数据增加边框,实现闪烁以达到提醒目的.数据格式如下,只有在未处理火警/故障时增加闪烁边框.可以使用watch进行深度监听.数据格式已定,也非常明确要监听的数据是有两个.既 ...
- 在DataGridView控件中显示图片
实现效果: 知识运用: DataGridView控件的DataSource属性 实现代码: private void Form1_Load(object sender, EventArgs e) { ...
- 11.使用while和for循环分别打印字符串s=’asdfer’中每个元素
1).for循环 s = 'asdfer' for i in s: print(i) 2).while循环 s = 'asdfer' while 1: print(s[index]) index += ...
- JavaScript之基操
局部变量前面要加var 如 var name = "jiahuai" 全局变量 name = "jiahuai" 写完每一行JavaScript代码用;号隔 ...
- luogu4608 [FJOI2016]所有公共子序列问题
题目描述: luogu loj 题解: 序列自动机(?)+高精+普及dp. 这个是猫老师的序列自动机(字符串从1开始): ]) { memset(t[n],-,sizeof(t[n])); ;i> ...
- k8s基于canel的网络策略
Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kube ...
- web开发框架tornado
在server.py文件中 import tornado.web import tornado.ioloop import tornado.httpserver import config from ...
- 安装VS2010 无法打开数据文件deffactory.dat
VS2010旗舰版可用Key: YCFHQ9DWCYDKV88T2TMHG7BHP 解压VS2010安装ISO文件,找到setup\deffactory.dat文件,用记事本打开,将里面内容清空,将以 ...
- ProC第二弹
一.提要 上文简单介绍了Windows下ProC配置开发,这次我们使用Linux平台再次配置Oracle ProC开发环境(RedHat Linux 9 + Oracle 92). <OR ...
- 如何锁定Android系统CPU的频率
接触到了Android系统的Performance测试,所以有锁定CPU的需求: 由于要首先读取到此系统所支持的CPU频率,之后再所支持的频率中选取你想要的频率,之后进行锁定. 这个过程,手动也是可以 ...