mybatis基础应用中需要注意的地方
在用mybatis的时候需要注意的点,做下笔记。
1、在全局配置文件中映射器如果是采用批量方式的时候,mapper接口和sql映射文件必须在同一个包名下
<mappers>
<!-- <mapper resource="EmployeeMapper.xml"/> -->
<!-- 批量注册时,mapper接口和sql映射文件必须在同一个包名下 -->
<package name="com.luohp.mybatis.dao"/>
</mappers>
这样也是可以的
2、mybatis的参数传递
2.1、${}与#{}的区别:${}在动态解析的时候把参数直接与sql语句拼起来,这种方式会造成sql注入。#{}是在预编译时用占位符 ?代替,然后再设置参数。
2.2、单个参数:如果基本类型mybatis不会做特殊处理,可以#{}获取,大括号里面属性不做规定,但最好跟你的参数同名。如果是对象,则直接根据属性名取就可以了。如果是传入的是String的值,则必须使用#{_parameter}或#{value}
public User find(int id);//接口方法
//sql语句
<select id="findEmp" parameterType="int" resultType="Employee">
select * from tbl_employee where id = #{id}或#{value}
</select>
public List<Employee> findListByLastName(String name);
//<!-- 使用#{_parameter}或#{value}固定写法获取传入单个的String类型的参数 -->
<select id="findListByLastName" parameterType="String" resultType="Employee">
select * from tbl_employee where last_name=#{_parameter}或#{value}
</select>
2.3、多个参数:多个参数时mybatis会把每个参数都封装到map里作为value,生成默认的key为param1.....paramN,或者也可以通过参数的索引获取。
public Employee findByParams1(Integer id, String name);
//通过默认生成的key获取
<select id="findByParams" resultType="Employee">
select * from tbl_employee where id = #{param1} and last_name like '%${param2}%'
</select>
//也可以通过参数命名的方式指定map的key,这样更直观更方便操作
public Employee findByParams(@Param("id")Integer id, @Param("emp")Employee e);
//通过指定的key获取
<select id="findByParams" resultType="Employee">
select * from tbl_employee where id = #{id} and last_name like '%${emp.name}%'
</select>
OPJO:如果你传入的参数是数据模型里的属性,就可以直接传入pojo。#{属性名}:取出传入的pojo的属性值。
Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用也可以传入map。#{key}:取出map中对应的值
TO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象。比如我们分页就是编写一个to来保存分页数据,比如pageIndex,pageSize等等。
注意:如果是集合或数组类型的参数,也会做特殊处理,封装到map中。集合则用list作为key,数组则用array作为key。
//参数为集合或数组类型
public Employee findByCollectionOrArray(List<Integer> li, String[] arr);
//list和array是固定写法
<select id="findByCollectionOrArray" resultType="Employee">
select * from tbl_employee where id=#{list[0]} and last_name=#{array[0]}
</select>
2.4、在mybatis模糊查询中关于${}和#{}的使用
如果sql语句中通过#{}取值的话,会报错。
<select id="findListByLastName" parameterType="String" resultType="Employee">
select * from tbl_employee where last_name like '%#{_parameter}%'
</select>
报错信息
然后结合控制台打印出来的sql信息来看,原因是在编译的时候会把#{_parameter}替换成了占位符?,又会把整个'%?%'当成一个字符串,当在设置参数时找不到占位符?,所以才会报错。
解决办法:
<!-- 使用${}取值方式,但这种方式可能会引发sql注入不推荐使用 -->
select * from tbl_employee where last_name like '%${_parameter}%'
<!-- 使用拼串的方式这样两个%是独立的字符串,或使用concat()函数拼也行-->
select * from tbl_employee where last_name like '%'#{_parameter}'%'
如果有什么不对的地方还请大家指正。上一篇: python 十进制和十六进制相互转换
下一篇: JMX 博客分类: java jmx
推荐阅读
-
mybatis基础应用中需要注意的地方
-
使用XHTML1.0 Strict中需要特别注意的地方
-
MySQL中修改表结构时需要注意的一些地方
-
MySQL中修改表结构时需要注意的一些地方
-
使用XHTML1.0 Strict中需要特别注意的地方
-
Logo设计的过程中需要注意的基础细节介绍
-
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量),常量php_PHP教程
-
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量),常量php
-
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量),常量php_PHP教程
-
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量),常量php