相当于select count(*) from emp where username = 'xxx' and password = '' or '1' = '1'
永远大于1,因此满足登录条件
使用预编译时:
把整个' or '1'='1作为一个完整的参数,赋值给第2个问号(' or '1'='1进行了转义,只当做字符串使用)
因此解决了注入问题
参数占位符
在Mybatis中提供的参数占位符有两种:${…} 、#{…}
{…}
执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值
使用时机:参数传递,都使用#{…}
${…}
拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题
使用时机:如果对表名、列表进行动态设置时使用
注意事项:在项目开发中,建议使用#{…},生成预编译SQL,防止SQL注入安全。
基础操作
删除
Mybatis框架让程序员更关注于SQL语句
接口方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
@Mapper publicinterfaceEmpMapper { //@Delete("delete from emp where id = 17") //public void delete(); //以上delete操作的SQL语句中的id值写成固定的17,就表示只能删除id=17的用户数据 //SQL语句中的id值不能写成固定数值,需要变为动态的数值 //解决方案:在delete方法中添加一个参数(用户id),将方法中的参数,传给SQL语句 /** * 根据id删除数据 * @param id 用户id */ @Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值 publicvoiddelete(Integer id); }
@Select("select * from emp " + "where name like concat('%',#{name},'%') " + "and gender = #{gender} " + "and entrydate between #{begin} and #{end} " + "order by update_time desc") public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mappernamespace="org.example.mybatisquickstart.mapper.EmpMapper"> <!-- namespace属性为Mapper接口全限定名 --> <!--查询操作--> <selectid="list"resultType="org.example.mybatisquickstart.pojo.Emp"> select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc </select> </mapper>
1 2 3 4 5 6 7 8 9
@Mapper publicinterfaceEmpMapper { /*@Select("select * from emp " + "where name like '%${name}%' " + "and gender = #{gender} " + "and entrydate between #{begin} and #{end} " + "order by update_time desc")*/ public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end); }
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
MybatisX
MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生。
野生的黑色黎博利出现了!
Mybatis动态SQL
if
<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
1 2 3
<iftest="条件表达式"> 要拼接的sql语句 </if>
原有的SQL语句
1 2 3 4 5 6 7
<selectid="list"resultType="org.example.mybatisquickstart.pojo.Emp"> select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc </select>
动态SQL语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<selectid="list"resultType="org.example.mybatisquickstart.pojo.Emp"> select * from emp <where> <iftest="name != null"> name like concat('%',#{name},'%') </if> <iftest="gender != null"> and gender = #{gender} </if> <iftest="begin != null and end != null"> and entrydate between #{begin} and #{end} </if> </where> order by update_time desc </select>
<selectid="list"resultType="org.example.mybatisquickstart.pojo.Emp"> <includerefid="commonSelect"/> <where> <iftest="name != null"> name like concat('%',#{name},'%') </if> <iftest="gender != null"> and gender = #{gender} </if> <iftest="begin != null and end != null"> and entrydate between #{begin} and #{end} </if> </where> order by update_time desc </select>