Mybatis参数(Parameters)传递方式
作者:路在何方い
1.单个普通类型(基本类型、包装类型、String)的参数
封装规则:Mybatis不会做特殊的处理
取值 #{随便写,建议与实际的参数名保持一致}
例如:
操作:public Employee getEmployeeById(Integer id );
取值:#{id}
<!-- 关于select 的查询语句 resulType:查询结果对应的类型 id 当前sql语句的唯一标识 #{id}:获取传递的参数 resultType用于指定结果集的封装类型 parameter:确定传递参数的类型,也可以省略,mybatis会自动识别当前参数类型是什么 --> <select id="getEmployeeById" resultType="employee" parameterType="java.lang.Integer" databaseId="mysql"> select id,last_name lastName,email,gender from tbl_employee where id=#{id} </select>
2.多个参数
封装规则:Mybatis会把多个参数封装成一个Map,封装时使用的key是:0 1 2 ....N-1/param1param2....paramN.
取值:#{0 1 2 ....N-1/param1param2....paramN}
例如:
操作:public Employee getEmpsByLastNameAndId(String lastName, Integer id );
取值:#{lastName}、#{id}错误
异常:Cause: org.apache.ibatis.binding.BindingException: Parameter 'lastName' not found. Available parameters are[0, 1, param1, param2]
取值:#{0}、#{1} 或者#{param1}、#{param2}正确
不方便:参数一旦多了,不知道参数具体在第几个位置
<!--${param1} and id=${param2} 参数一旦多了 不知道参数具体在第几个位置 --> <select id="getEmpsLastNameAndId" resultType="employee"> select * from tbl_employee where last_name=#{param1} and id=#{param2} </select>
3.命名参数
使 用@Param()来指定多个参数封装Map时所使用的key
封装规则:Mybatis会把多个参数封装成一个Map,封装时使用的key是:通过@Param指定的key、param1param2....paramN
取值:#{@Param指定的key/param1param2....paramN}
例如:
操作:public Employee getEmpsLastNameAndIdNamedParameter(@Param("lastName") String lastName, @Param("Id") Integer id);
取值:#{lastName/param1}#{id/param2}
<select id="getEmpsLastNameAndIdNamedParameter" resultType="employee"> select * from tbl_employee where last_name=#{param1} and id=#{param2} </select> <select id="getEmpsLastNameAndIdNamedParameter" resultType="employee"> select * from tbl_employee where last_name=#{lastName} and id=#{id} </select>
4.Map 如果参数很多
但是不属于某个对象的属性,也是很常用,可以直接封装成map进行传递。
封装规则:Mybatis不做特殊处理,直接使用传递的Map
取值 :#{map中的key}
例如:public List<Employee> getEmpsByLastNameLikeAnsEmailLike(Map<String,Object> map);
<select id="getEmpsByLastNameLikeAnsEmailLike" resultType="employee"> select * from tbl_employee where last_name like '${ln}' and email like '${email}' </select>
/* * 5.如果参数很多,但不属于某个对象的属性,也不是很常用,可以直接封装成map进行传递 封装规则 Mybatis不做特殊处理 直接使用传递的map * 取值 #{map中的key} */ @Test public void testMap() throws IOException { SqlSessionFactory ssf = getSqlSessionFactory(); SqlSession sqlSession = ssf.openSession(); Map<String, Object> map = new HashMap<String, Object>(); map.put("ln", "%bq%"); map.put("email", "%qq%"); EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); List<Employee> emps = mapper.getEmpsByLastNameLikeAnsEmailLike(map); System.out.println("使用map参数封装时的结果对象 " + emps); }
5.POJO ---> 传递单个对象
封装规则:Mybatis不做特殊处理
取值: #{POJO的属性名}
例如:
操作:public Integer addEmployee(Employee employee);
取值:#{employee的属性名idlastNameemailgender}
<!--1. 字段名和属性名一一对应 2.parameter:确定传递参数的类型,也可以省略,mybatis会自动识别当前参数类型是什么 useGeneratedKeys:true使用自增主键的方式 keyProperty="id" 确定当前对象的哪个属性保存主键信息 保存自增主键值 --> <insert id="addEmployee" parameterType="com.hbsi.bean.Employee" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert>
6.TO: Transfer Object数据传输对象
如果参数很多,但不属于某个对象的属性,却很常用,推荐写成java类,封装成对象进行传递
例如:在分页功能用的较多:封装成Page类{ int pageNo, int pageSize, int pages , boolean isHasPrevpage,boolean isHasNextPge......}
7.集合-------使用mybatis迭代
封装规则: MyBatis对 CollectionArray 会进行特殊处理, 也会封装Map。
封装的key:
Collection(List/Set)
:使用的key: collectionList
:使用的key: collection/ listArray
:使用的key:array
例如:
操作:
public void deleteByExample(List<Integer> ids);
取值:(此时的key必须为list或collection)
<delete id="deleteByExample"> delete from tbl_employee where id in <if test="_parameter!=null"> <foreach close=")" collection="list" item="id" open="(" separator=","> #{id} </foreach> </if> </delete>
集合-------使用mybatis迭代也可使 用@Param()来指定参数封装Map时所使用的key,多个参数也可以
操作
public void deleteByExample(@Param("listId")List<Integer> ids);
取值:此时的可以使用@Param("listId")指定的别名,listId
<delete id="deleteByExample"> delete from tbl_employee where id in <if test="_parameter!=null"> <foreach close=")" collection="listId" item="id" open="(" separator=","> #{id} </foreach> </if> </delete>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。