03【MyBatis参数深入】
创始人
2024-04-08 13:44:57

三、MyBaits参数深入

  • parameterType: 输入参数。对应方法的形参。

  • resultType: 输出参数。表示方法的返回值类型。

3.1 parameterType输入参数

parameterType用于确定方法的形参,在mapper映射文件中,parameterType可写可不写;

3.1.1 传递单个参数

在传递单个参数时,mybatis不会做特殊处理,#{参数名/任意名}都可以取出参数值,

接口:

package com.dfbz.dao;import com.dfbz.entity.Emp;/*** @author lscl* @version 1.0* @intro:*/
public interface EmpDao {Emp findById(Integer id);
}

dao接口映射:

传递的是基本数据类型和String时,#{}里面的内容可以随便填写,取得都是形参中的值



测试:

package com.dfbz.demo;import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Emp;
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.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_MyBatis_ParameterType测试 {InputStream is;SqlSessionFactory sessionFactory;SqlSession session;EmpDao empDao;@Beforepublic void init() throws Exception{is = Resources.getResourceAsStream("MyBatisConfig.xml");sessionFactory = new SqlSessionFactoryBuilder().build(is);session = sessionFactory.openSession(true);empDao = session.getMapper(EmpDao.class);}@Afterpublic void close() throws Exception{session.close();is.close();}@Testpublic void test1() throws IOException {Emp emp = empDao.findById(1);System.out.println(emp);}
}

3.1.2 传递多个参数时

1)MyBatis提供的方式

MyBaits在传递多个参数时会特殊处理,多个参数会被封装成 一个map,key从#{param1}一直到#{paramN},或者使用索引#{arg0}一直到#{argN}

举例:创建dao接口,根据薪资范围查询

  • dao接口:
List findBySalaryScope(Double minSalary,Double maxSalary);
List findBySalaryScope2(Double minSalary,Double maxSalary);
  • 接口映射:

  • 测试类:
@Test
public void test2() throws IOException {List empList1 = empDao.findBySalaryScope(6000.0, 7000.0);List empList2 = empDao.findBySalaryScope2(6000.0, 7000.0);System.out.println(empList1);System.out.println(empList2);
}

2)使用@param注解

  • 接口:
/*** 使用@Param注解来确定参数名* @param minSalary* @param maxSalary* @return*/
List findBySalaryScope3(@Param("minSalary") Double minSalary, @Param("maxSalary")Double maxSalary);
  • 接口映射:

3.1.3 CDATA批量转译



3.1.4 传递PoJo对象

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBean,pojo包装类型指的是一个对象里面又包含了另外一个对象。

查询需求: 按照薪资的范围查询员工姓张的员工。

  1. 自定义一个查询类:Condition
  2. Condition中里面维护了User对象、还有薪资的开始、结束字段。

1)定义Pojo对象

package com.dfbz.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author lscl* @version 1.0* @intro:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Condition {private Emp emp;private Double minSalary;private Double maxSalary;
}

2)dao接口

// 根据条件查询
List findByCondition(Condition condition);

3)接口映射



4)测试

@Test
public void test3() throws IOException {Emp emp =new Emp();emp.setName("%张%");Condition condition=new Condition();// 设置empcondition.setEmp(emp);condition.setMinSalary(3000.0);condition.setMaxSalary(10000.0);// 根据条件查询List empList = empDao.findByCondition(condition);empList.forEach(System.out::println);
}

3.2 resultType输出参数

3.2.1 简单类型

1)dao接口:

Long count();

2)接口映射:



3)测试:

@Test
public void test4() throws IOException {Long count = empDao.count();System.out.println("查询到: " + count + "条记录");
}

3.2.2 PoJo类型

1)dao接口:

/*** 根据员工姓名模糊查询* @param name* @return*/
List findByNameLike(String name);

2)接口映射:



3)测试:

@Test
public void test7() throws IOException {List empList = empDao.findByNameLike("%小%");empList.forEach(System.out::println);
}

3.2.3 Map类型

1)dao接口:

// 根据id查询用户,结果集为hashmap
Map findUserMapById(Integer id);// 查询所有用户,结果集为List
List> findAllUserMap();

2)接口映射:




3)测试:

@Test
public void test6() throws IOException {Map userMap = empDao.findUserMapById(1);System.out.println(userMap);List> userMapAll = empDao.findAllUserMap();System.out.println(userMapAll);
}

3.3 resultMap输出参数

前面通过resultType作为输出参数,可以把查询的结果,自动封装为对象。但是,有要求,数据库中的列名称,要与对象的属性一致。否则,不能正确封装数据。此时,可以使用resultMap解决; 设置列与属性的映射关系。

默认情况下,查询封装的结果集表的列名必须和属性名一模一样(默认情况下驼峰命名也不行)

可以在SqlMapConfig.xml配置文件中开启驼峰映射:



3.3.1 接口

List findAllEmp();

3.3.2 接口映射





3.3.3 测试类

@Test
public void test8() throws IOException {List empList = empDao.findAllEmp();for (Emp emp : empList) {System.out.println(emp);}
}

3.4 SQL注入问题

在MyBatis传值的过程中,除了可以使用#{}获取值之外,还可以使用${}获取值:

定义一个接口:

List findByName2(String name);

接口映射:





注意:使用${}时,里面必须填写value;在新版本可以写任意的值

根据测试结果,不能防止sql注入。

// 不能防止SQL注入
List empList = userDao.findByNameLike2("abc' or 1=1 -- ");// 能防止SQL注入
List empList = userDao.findByNameLike("abc' or 1=1 -- ");

3.5 #{}和${}的区别

既然#{}${}好那么多,那为什么还要有${}这个东西存在呢?干脆都用#{}不就万事大吉吗?其实不是的,${}也有用武之地;

  • 场景举例:



  • 测试代码:
@Test
public void test10() throws IOException {List empList = empDao.test1("emp");for (Emp emp : empList) {System.out.println(emp);}
}@Test
public void test11() throws IOException {List empList = empDao.test1("select * from emp");for (Emp emp : empList) {System.out.println(emp);}
}

总结:

1)#{}会对特殊字符进行过滤,传递的参数不会参与SQL语句的生成。

2)${}不会对特殊字符进行过滤,传递的参数本就是用于参与SQL语句生成的,因此会出现SQL注入的问题

3)${}里面必须填写value(新版本已经改进),#{}随意

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...