占位符:${},#{}

${}:充当占位符时,无法防止sql注入,纯纯的外面给啥,他就往上放啥
#{}:充当…,可以防止sql注入

实体类:

package com.itjh.pojo;public class Employee {String name;Integer age;String gander;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGander() {return gander;}public void setGander(String gander) {this.gander = gander;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", gander='" + gander + '\'' +'}';}
}
  • ${}:

Mapper文件:占位符中写上你要查询的字段名

<mapper namespace="com.itjh.mapp.EmployeeMapper"><select id="selectone" resultMap="employee">select*from farther where age = ${age}</select>
</mapper>

Mapper接口:在括号中定义和Mapper文件中占位符内相同的参数int age

package com.itjh.mapp;import com.itjh.pojo.Employee;
import java.util.List;public interface EmployeeMapper {List<Employee> selectone(int age);
}

测试类:在调用selectone()中加入Mapper接口需要的参数:age(测试类中先定义一个有值的age)

import com.itjh.mapp.EmployeeMapper;
import com.itjh.pojo.Employee;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;public class TestEmployee {public static void main(String[] args) throws IOException {int age=29;String resource = "mybatis-emplyee.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession=sqlSessionFactory.openSession();EmployeeMapper employeeMapper=sqlSession.getMapper(EmployeeMapper.class);List<Employee> list=employeeMapper.selectone(age);System.out.println(list);}
}

结果中的sql语句:

 select * from farther where age = 29

这个就是用了${}占位符,他直接把29传进来了,无法防止sql注入

  • #{}:

将Mapper文件中的sql语句中的占位符写成#{}:

<mapper namespace="com.itjh.mapp.EmployeeMapper"><resultMap id="employee" type="com.itjh.pojo.Employee"><result property="iName" column="name"></result></resultMap><select id="selectone" resultMap="employee">select*from farther where age = #{age}</select>
</mapper>

结果:传入参数的位置变成了?,可以防止sql注入

简概:1、传递参数时:#{}
2、对表名、列名进行动态设置只可用${}

 select * from farther where age = ?
  • paremeterType:定义传参类型(图中 int 和 integer都可以)

<mapper namespace="com.itjh.mapp.EmployeeMapper"><resultMap id="employee" type="com.itjh.pojo.Employee"><result property="iName" column="name"></result></resultMap><select id="selectone" parameterType="integer" resultMap="employee">select*from farther where age = #{age}</select>
</mapper>

转义字符

  • 转移字符表:如:< 无法在mybatis的xml中进行正确释义,就需要别的字符来代替它,到运行的时候,便会自动转换为 <
    ![在这里插入图片描述]

  • CDATA:<![CDATA[ 想要写的字符 ]]>:

<mapper namespace="com.itjh.mapp.EmployeeMapper"><resultMap id="employee" type="com.itjh.pojo.Employee"><result property="iName" column="name"></result></resultMap><select id="selectone" parameterType="integer" resultMap="employee">select*from farther where age<![CDATA[  <  ]]>#{age}</select>
</mapper>

多元素查询(利用模糊查询)

如下表,想要查询所有姓,性别为的人信息:只需要对性别和姓氏做手脚即可

Mapper配置文件:like #{参数(与Mapper接口中方法的参数保持一致)}

<mapper namespace="com.itjh.mapp.EmployeeMapper"><select id="selectmany" resultType="com.itjh.pojo.Employee">select*from farther wheregander like#{gander}and name like#{name}</select>
</mapper>

三种方法:

Mapper配置文件不需要动,改Mapper接口和测试类即可

一些名称应当注意:

  • Mapper接口:@Param(“1”) 2 3

1:与Mapper配置文件里面模糊查询花括号中的参数一致
2:参数类型:int String …
3:与实体类中的属性一致

package com.itjh.mapp;import com.itjh.pojo.Employee;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmployeeMapper {List<Employee> selectmany(@Param("gander")String gander,@Param("name")String name);
}

实体类:没啥特殊的

package com.itjh.pojo;public class Employee {String name;Integer age;String gander;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGander() {return gander;}public void setGander(String gander) {this.gander = gander;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", gander='" + gander + '\'' +'}';}
}

测试类:定义好需要的参数的值,调用Mapper接口方法时进行传参

import com.itjh.mapp.EmployeeMapper;
import com.itjh.pojo.Employee;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;public class TestEmployee {public static void main(String[] args) throws IOException {String gander="男";gander="%"+gander+"%";String name="张";name=name+"%";String resource = "mybatis-emplyee.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession=sqlSessionFactory.openSession();EmployeeMapper employeeMapper=sqlSession.getMapper(EmployeeMapper.class);List<Employee> list=employeeMapper.selectmany(gander,name);System.out.println(list);}
}
  • 实体法:

Mapper接口文件修改一下:参数为一个实体对象

package com.itjh.mapp;import com.itjh.pojo.Employee;
import java.util.List;public interface EmployeeMapper {List<Employee> selectmany(Employee employee);
}

测试类:看代码上的注释,实体类的属性需要和接口的参数保持一致

import com.itjh.mapp.EmployeeMapper;
import com.itjh.pojo.Employee;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;public class TestEmployee {public static void main(String[] args) throws IOException {//接收参数String gande="男";String name="张";//对数据加工一下,方便以后重用给上面两行代码传参就行,不用把模糊查询写死gande="%"+gande+"%"name=name+"%";//创建一个实体类对象,并且将上面的数据扔进去Employee employee=new Employee();employee.setName(name);employee.setGander(gande);String resource = "mybatis-emplyee.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession=sqlSessionFactory.openSession();EmployeeMapper employeeMapper=sqlSession.getMapper(EmployeeMapper.class);//接收上面已经搞好的实体类对象,返回一个集合List<Employee> list=employeeMapper.selectmany(employee);System.out.println(list);}
}
  • Map法:

Mapper接口文件修改一下:参数为一个Map集合

package com.itjh.mapp;import com.itjh.pojo.Employee;
import java.util.List;public interface EmployeeMapper {List<Employee> selectmany(Employee employee);
}

测试类:重点看注释

import com.itjh.mapp.EmployeeMapper;
import com.itjh.pojo.Employee;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class TestEmployee {public static void main(String[] args) throws IOException {//接收参数String gander="男";String name="张";//对数据加工一下,方便以后重用给上面两行代码传参就行,不用把模糊查询写死gander="%"+gander+"%"name=name+"%";//创造一个Map集合,用来将上面的数值扔进去,put()方法的`""`中的名称需要和//Mapper配置文件中的模糊查询中的参数一致Map map=new HashMap();map.put("gander",gander);map.put("name",name);String resource = "mybatis-emplyee.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession=sqlSessionFactory.openSession();EmployeeMapper employeeMapper=sqlSession.getMapper(EmployeeMapper.class);//将上面的map传进来List<Employee> list=employeeMapper.selectmany(map);System.out.println(list);}
}

结果的一部分:

15:35:56.462 [main] DEBUG com.itjh.mapp.EmployeeMapper.selectmany - ==>  Preparing: select * from farther where gander like? and name like?
15:35:56.500 [main] DEBUG com.itjh.mapp.EmployeeMapper.selectmany - ==> Parameters: %男%(String), 张%(String)
15:35:56.558 [main] DEBUG com.itjh.mapp.EmployeeMapper.selectmany - <==      Total: 2
[Employee{name='张飞', age=29, gander='男'}, Employee{name='张益达', age=31, gander='男'}]

动态sql(多条件中多查询):

当Mapper配置文件写了相对应的全部字段的时候,如果你只想查询一部分条件下的东西,那么你的sql语句就会有问题,结果会报错,所以可以加入判断语句:没有传进参数的部分不会执行,if标签,其中test添加判断

<mapper namespace="com.itjh.mapp.EmployeeMapper"><select id="selectmany" resultType="com.itjh.pojo.Employee">select*from farther where<if test="gander!=null">gander like#{gander}</if><if test="name!=null">and name like#{name}</if><if test="age!=age">and age like#{age}</if></select>
</mapper>

缺点:如果是第一个元素没有执行,那么第二个元素就是从and 开始,即sql语句中的where之后就是and,明显错了
解决办法:1、在where之后添加1=1即可
2、将sql语句中的where换成where标签:他会帮你写1=1并且把不必要的and去掉

<mapper namespace="com.itjh.mapp.EmployeeMapper"><select id="selectmany" resultType="com.itjh.pojo.Employee">select*from farther<where><if test="gander!=null">gander like#{gander}</if><if test="name!=null">and name like#{name}</if><if test="age!=age">and age like#{age}</if></where></select>
</mapper>

动态sql(多条件中单查询):

前端页面上给你几个选项,你在其中选一个:用choose(when,otherwise),类似于java中的switch

<mapper namespace="com.itjh.mapp.EmployeeMapper"><select id="selectmany" resultType="com.itjh.pojo.Employee">select*from farther where<choose><when test="gander!=null and gander!=''">gander like#{gander}</when><when test="name!=null and name!=''">name like#{name}</when><when test="age!=null and age!=''">age like#{age}</when><otherwise>1=1</otherwise></choose></select>
</mapper>

其中otherwise标签可以用where标签替换:

<mapper namespace="com.itjh.mapp.EmployeeMapper"><select id="selectmany" resultType="com.itjh.pojo.Employee">select*from farther<where><choose><when test="gander!=null and gander!=''">gander like#{gander}</when><when test="name!=null and name!=''">name like#{name}</when><when test="age!=null and age!=''">age like#{age}</when></choose></where></select>
</mapper>

MyBatis——占位符,转义字符,多元素查询(模糊查询),动态sql(多条件中多查询,多条件中单查询)相关推荐

  1. c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...

    目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...

  2. Mybatis占位符问题—ReflectionException: There is no getter for property named xxx

    使用${}占位符时(PS:一般都使用#{},不建议使用${}),发现xml文件中的SQL语句使用了$后会报错:具体情况如下: 解决方案如下:在参数前加上@Param("id")注解

  3. Java MyBatis 占位符

    不同点: #{}:相当于预处理中的占位符?.可以防止SQL注入. ${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出.会引起SQL注入. 相同点: 可以接受HashMap.POJO类型的参数 ...

  4. mybatis collection标签_MyBatis第二天(结果映射+动态sql+关联查询)

    笑不出莱:MyBatis第一天(介绍+文件配置+Mapper动态代理)​zhuanlan.zhihu.com 一.导包+配置文件+pojo类 1.jar包:mybatis的核心包和依赖包+连接数据库的 ...

  5. ORM框架之Mybatis(二)数据库连接池、事务及动态SQL

    一.MybatisMybatis连接池与事务深入  1.1 Mybatis的连接池技术  在Mybatis中也有连接池技术,但是它采用的是自己的连接池技术.在Mybatis的SqlMapConfig. ...

  6. mybatis if test 用法_SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis拿得出手的功能之一...

    MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? 是将传入的值当做字符串的形式, ...

  7. 如何在SQL Server 2016中使用并行插入以提高查询性能

    介绍 (Introduction ) In the first part of this article, we will discuss about parallelism in the SQL S ...

  8. 取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例

    Mysql 动态取第N个元素 简介 基于mysql实现对某个表的某个字段按照顺(逆)序取第N个排序对应的元素,该语句通过存储过程结合预处理实现,也可在程序语言里通过SQL拼接实现. 示例 --1存储过 ...

  9. mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)

    子查询的限制 ● 通常,不能在子查询中修改表并从同一表中进行选择.例如,此限制适用于以下形式的语法: 1. DELETE FROM t WHERE ... (SELECT ... FROM t ... ...

最新文章

  1. 知乎高赞怎么自学 python,大概要多久?
  2. Java对象转xml报文和xml报文转Java对象帮助类
  3. 360加固分析(二)
  4. 某同学正为自己安装不上sqlserver数据库而愁眉苦脸,使用朋友给的方法顿时喜笑颜开,那么朋友到底出了个什么样的方法呢?...
  5. 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!
  6. 【2016年第1期】农业大数据资产管理面临的挑战与思考
  7. java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)
  8. windows下替代SSH,Xshell软件的mobaxterm
  9. 智慧景区管理系统提升游客服务体验
  10. linux连接交换机命令,Linux连接路由器交换机防火墙Console接口的5个实用命令
  11. 用Vue.js开发企业管理后台,我做到了
  12. 星宸科技嵌入式CPU-SSD222D芯片在人脸门锁应用
  13. Git 远程篇之查看远程仓库信息
  14. 删除域控中的一个服务器,删除 Active Directory 域服务
  15. 一个普通计算机培训学校学生的迷茫。
  16. JavaScript有关this指向问题,如何修改this指向
  17. 简要视音频发展编年史
  18. 英特尔助力腾讯云深度优化云硬盘CBS 产品,打造极速云存储体验
  19. 没有100亿,你玩什么无人货架 | 深度
  20. 【高等代数研究对象】

热门文章

  1. 别再体验百度AI了,自己搞起来吧,人工智能很简单!
  2. 动态规划-LCS、LIS
  3. 我说CMMI2.0 之需求开发与管理
  4. uc/OS II——多任务设计
  5. 解决“excel复制到txt行数增多问题”
  6. dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息
  7. 注意九宫格系统中文键盘输入特殊字符问题
  8. java剪切_java---头像剪切功能
  9. 防火墙工作在哪个层_Stratix 5950工业防火墙透明模式使用
  10. 最常用的18个学术搜索引擎