MyBatis——占位符,转义字符,多元素查询(模糊查询),动态sql(多条件中多查询,多条件中单查询)
占位符:${},#{}
${}:充当占位符时,无法防止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(多条件中多查询,多条件中单查询)相关推荐
- c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...
目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...
- Mybatis占位符问题—ReflectionException: There is no getter for property named xxx
使用${}占位符时(PS:一般都使用#{},不建议使用${}),发现xml文件中的SQL语句使用了$后会报错:具体情况如下: 解决方案如下:在参数前加上@Param("id")注解
- Java MyBatis 占位符
不同点: #{}:相当于预处理中的占位符?.可以防止SQL注入. ${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出.会引起SQL注入. 相同点: 可以接受HashMap.POJO类型的参数 ...
- mybatis collection标签_MyBatis第二天(结果映射+动态sql+关联查询)
笑不出莱:MyBatis第一天(介绍+文件配置+Mapper动态代理)zhuanlan.zhihu.com 一.导包+配置文件+pojo类 1.jar包:mybatis的核心包和依赖包+连接数据库的 ...
- ORM框架之Mybatis(二)数据库连接池、事务及动态SQL
一.MybatisMybatis连接池与事务深入 1.1 Mybatis的连接池技术 在Mybatis中也有连接池技术,但是它采用的是自己的连接池技术.在Mybatis的SqlMapConfig. ...
- mybatis if test 用法_SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis拿得出手的功能之一...
MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? 是将传入的值当做字符串的形式, ...
- 如何在SQL Server 2016中使用并行插入以提高查询性能
介绍 (Introduction ) In the first part of this article, we will discuss about parallelism in the SQL S ...
- 取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例
Mysql 动态取第N个元素 简介 基于mysql实现对某个表的某个字段按照顺(逆)序取第N个排序对应的元素,该语句通过存储过程结合预处理实现,也可在程序语言里通过SQL拼接实现. 示例 --1存储过 ...
- mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)
子查询的限制 ● 通常,不能在子查询中修改表并从同一表中进行选择.例如,此限制适用于以下形式的语法: 1. DELETE FROM t WHERE ... (SELECT ... FROM t ... ...
最新文章
- 知乎高赞怎么自学 python,大概要多久?
- Java对象转xml报文和xml报文转Java对象帮助类
- 360加固分析(二)
- 某同学正为自己安装不上sqlserver数据库而愁眉苦脸,使用朋友给的方法顿时喜笑颜开,那么朋友到底出了个什么样的方法呢?...
- 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!
- 【2016年第1期】农业大数据资产管理面临的挑战与思考
- java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)
- windows下替代SSH,Xshell软件的mobaxterm
- 智慧景区管理系统提升游客服务体验
- linux连接交换机命令,Linux连接路由器交换机防火墙Console接口的5个实用命令
- 用Vue.js开发企业管理后台,我做到了
- 星宸科技嵌入式CPU-SSD222D芯片在人脸门锁应用
- Git 远程篇之查看远程仓库信息
- 删除域控中的一个服务器,删除 Active Directory 域服务
- 一个普通计算机培训学校学生的迷茫。
- JavaScript有关this指向问题,如何修改this指向
- 简要视音频发展编年史
- 英特尔助力腾讯云深度优化云硬盘CBS 产品,打造极速云存储体验
- 没有100亿,你玩什么无人货架 | 深度
- 【高等代数研究对象】