参数处理

1.一个参数:MyBatis不会做特殊处理

使用#{参数名},取出参数

 

2.多个参数:MyBatis会做特殊处理

如果还使用使用#{参数名},取出参数的话会出现异常

异常信息:

因为MyBatis的特殊处理,将参数封装成了一个map

key=param1,param2......paramN

value=传入的参数值

取出参数的操作:

#{param1},#{param2}....

3.命名参数:明确的指定封装参数是map的key,不要使用param1,param2了

使用@param注解,明确指定key

public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);

 

4.POJO

如果多个参数正好是我们业务逻辑的数据模型,可以直接传入POJO

#{属性名},取出传入的pojo的属性值

5.Map

如果多个参数不是业务逻辑的数据模型,不经常使用,可以传入map

#{key},取出map中对应得value值

测试:

接口方法:

public Employee getEmpByMap(Map<String, Object> map);

测试类:

	@Test
	void test05() throws IOException {
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

		SqlSession openSession = sqlSessionFactory.openSession();

		try {
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);

			Map<String, Object> map = new HashMap<String, Object>();
			map.put("id", 2);
			map.put("lastName", "张三");

			Employee employee = mapper.getEmpByMap(map);
			System.out.println(employee);

		} finally {
			openSession.close();
		}
	}

映射文件:

<!--public Employee getEmpByMap(Map<String, Object> map); -->
	<select id="getEmpByMap" resultType="emp">
		select * from tbl_employee where id = #{id} and last_name = #{lastName}
	</select>

查询结果:

TO: 

 如果多个参数不是业务逻辑中的数据,但是经常使用,推荐编写一个TO(Transfer Object)数据传输对象


 参数值的获取:

1.#{}:可以取出map的值或者pojo对象的属性值

2.${}:可以取出map的值或者pojo对象的属性值

区别:

#{}:是以预编译的形式,将参数设置到sql语句中,防止sql注入

            日志打印的运行的sql语句:

${}:取出的值直接拼装在sql语句上,无法防止sql注入

            日志打印的运行的sql语句:

原生JDBC不支持占位符的地方可以使用${}进行取值

eg:select * from table order by ${f_name} ${order} 动态排序


#{}:更多的用法

规定参数的一些规则

javaType、jdbcType、mode(存储过程)、numberScale、resultMap、typeHandler、jdbcTypeName

jdbcType通常需要在某种特定的条件向下被设置:

           在我能数据为null时,有些数据库可以不能识别MyBatis对null值的默认处理。比如Oracle(报错)

           jdbcType OTHER:无效类型,因为MyBatis对所有的null都映射的是原生jdbc的OTHER类型,Oracle不能                        识别。

解决:

1、#{value jdbcType=NULL}

2、全局配置文件设置jdbcTypeForNull=NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值