欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis基础应用中需要注意的地方

程序员文章站 2024-03-17 13:04:10
...

在用mybatis的时候需要注意的点,做下笔记。

1、在全局配置文件中映射器如果是采用批量方式的时候,mapper接口和sql映射文件必须在同一个包名下

<mappers>
    <!-- <mapper resource="EmployeeMapper.xml"/> -->
    <!-- 批量注册时,mapper接口和sql映射文件必须在同一个包名下 -->
    <package name="com.luohp.mybatis.dao"/>
</mappers>

这样也是可以的

mybatis基础应用中需要注意的地方


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>

报错信息

mybatis基础应用中需要注意的地方

然后结合控制台打印出来的sql信息来看,原因是在编译的时候会把#{_parameter}替换成了占位符?,又会把整个'%?%'当成一个字符串,当在设置参数时找不到占位符?,所以才会报错。

mybatis基础应用中需要注意的地方

解决办法:

<!-- 使用${}取值方式,但这种方式可能会引发sql注入不推荐使用 -->
select * from tbl_employee where last_name like '%${_parameter}%'
<!-- 使用拼串的方式这样两个%是独立的字符串,或使用concat()函数拼也行-->
select * from tbl_employee where last_name like '%'#{_parameter}'%'
如果有什么不对的地方还请大家指正。