参数获取

之前我们都是采用#{}的方式进行参数传递,其实MyBatis还有另外的参数传递方式${}

使用方法相同,但是还是有很大区别的

这里做一个测试:

  1. <select id="getEmpByMap" resultType="com.figsprite.bean.Employee">  
  2.     select id,last_name lastName,gender,email from tb_employee where id = ${id} and last_name = #{lastName}  
  3. </select>  

查看log4j中的打印内容:

select id,last_name lastName,gender,email from tb_employee where id = 3 and last_name = ?

使用$取出来的值会直接拼装在sql语句中,而使用#取得值在sql语句中是个?号,可以防止sql注入,这个区别就类似于原生JDBC Statement和PrepareStatement的最大区别,即预编译。

$也不是一无是处,原生JDBC不支持占位符的地方我们可以使用${}进行取值,比如分表信息,还有order by 之后的内容,下面演示一下分表信息中${}的使用:

假设,一个公司有很多部门,每个部门存一张员工表,如果我们为每个部门都写一句相同的查询语句,就十分麻烦,因此,编写如下映射语句

<select id="getEmpByMap" resultType="com.figsprite.bean.Employee">
select id,last_name lastName,gender,email from #{table_name} where id = #{id} and last_name = #{lastName}
</select>

我们先用#{}试试

public void test7() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession(); try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("id",3);
map.put("lastName","Hello");
map.put("table_name","tb_employee");
Employee e = mapper.getEmpByMap(map);
System.out.println(e);
}finally {
openSession.close();
}
}

  

select id,last_name lastName,gender,email from ? where id = ? and last_name = ?

运行发现报错,我们再换成${}发现就没有问题了

#{}取值时指定参数相关规则

规定参数规则的一些规则

javaType,jdbcType,mode(存储过程),numbericScale,resultMap,typeHandler…….

我们主要说说jdbcType,它在某种特定条件下被设置,比如数据库之间的差异,在我们数据为null的时候,有些数据库可能无法识别mybatis对null的默认处理,比如oracle(报错)

如果我们执意要用null传给Oracle会报,JdbcType OTHER:无效类型,的错误,因为Mybatis对所有null都映射的是原生JDBC的 OTHER,Oracle无法识别,所以需要更改

insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)

values (#{id},#{lastName},#{email,jdbcType=NULL})

全局配置文件setting中有一项jdbcTypeForNull的属性进行更改,改为NULL

select标签

返回list类型对象

    List<Employee> getEmpByLastNameLike(String lastName);
<select id="getEmpByLastNameLike" resultType="com.figsprite.bean.Employee">
select * from tb_employee where last_name like #{lastName}
</select>

这里需要注意的是,resultType填写的是List中的元素类型,

@Test
public void test8() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession(); try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
List<Employee> list = mapper.getEmpByLastNameLike("%吴%"); for (Employee e : list) {
System.out.println(e);
}
} finally {
openSession.close();
}
}

  

MyBatis映射文件4(参数获取#{}和${}/select标签详解[返回类型为list])的更多相关文章

  1. Mybatis --- 映射文件、参数处理、参数值的获取、select元素

    映射文件:指导着MyBatis如何进行数据库增删改查, 有着非常重要的意义:   - cache   命名空间的二级缓存配置 - cache-ref   其他命名空间缓存配置的引用. - result ...

  2. MyBatis映射文件3(参数处理Map)

    参数命名 POJO 如果多个参数,正好是业务逻辑的数据模型,那么我们就可以直接传入POJO,这样#{}中就可以直接使用属性名 Map 如果多个参数不是业务逻辑的数据模型,没有对应的POJO,为了方便, ...

  3. Mybatis映射文件中#取值时指定参数相关规则

    Mybatis映射文件中#取值时指定参数相关规则 在#{}中,除了需要的数值外,还可以规定参数的一些其他规则. 例如:javaType,jdbcType,mode(存储过程),numericScale ...

  4. MyBatis映射文件中用#和$传递参数的特点

    在MyBatis映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...

  5. SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis

    一:DAO实体编码 1:首先,在src目录下,新建org.myseckill.entity包,用于存放实体类: 2:实体类设计 根据前面创建的数据库表以及映射关系,创建实体类. 表一:秒杀商品表 对应 ...

  6. MyBatis 映射文件详解

    1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...

  7. MyBatis映射文件 相关操作

    一.MyBatis映射文件 1.简介 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行 ...

  8. Java-MyBatis-MyBatis3-XML映射文件:参数

    ylbtech-Java-MyBatis-MyBatis3-XML映射文件:参数 1.返回顶部 1. 参数 你之前见到的所有语句中,使用的都是简单参数.实际上参数是 MyBatis 非常强大的元素.对 ...

  9. MyBatis 映射文件详解(六)

    MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...

随机推荐

  1. python2.7 3.5 3.6 3.7 的不同

    https://blog.csdn.net/kwame211/article/details/77862166/

  2. 12个 Linux 中 grep 命令的超级用法实例

    12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一 ...

  3. python第七十课——python2与python3的一些区别

    1.性能:py3.x起始比py2.x效率低,但是py3.x有极大的优化空间,效率正在追赶 2.编码:py3.x原码文件默认使用utf-8编码,使得变量名更为广阔 中国='CHI' print(中国) ...

  4. [CQOI2018]解锁屏幕

    嘟嘟嘟 这题感觉真的很简单-- \(O(n ^ 2 logn)\)的做法特别好理解,但得开O2. 看数据范围,肯定是状压dp.但刚开始我没想通状压啥,因为点与点之间还有顺序问题.但后来发现这个顺序是子 ...

  5. ClickHouse最简单的安装方法

    安装包地址: https://packagecloud.io/Altinity/clickhouse 无需下载安装包,更新yum源即可!! 最后: yum install -y clickhouse- ...

  6. 【转】wamp 3.0.6(apache 2.4.23) 403 forbidden 解决办法

    最近为了使用laraval框架,将wamp 升级到了比较高的版本,相应的apache也升级到了 2.4.23. larval是使用的挺好的,原来的apache倒是出现了问题:同一个局域网内,别人机器不 ...

  7. ubuntu 学习

    参考博客:http://www.cnblogs.com/resn/p/5800922.html 在Linux 里一切皆文件 / : 根 查看是否安装了中文支持:locale -a 如果有zh_CN.u ...

  8. conda install 出错

    在下载包时出现下面的错误: userdeMBP:pytorch user$ conda install -n deeplearning matplotlib Solving environment: ...

  9. Linux 通过rinetd端口转发来访问内网服务

    可以通过端口映射的方式,来通过具有公网的云服务器 ECS 访问用户名下其它未购买公网带宽的内网 ECS 上的服务.端口映射的方案有很多,比如 Linux 下的 SSH Tunnel.rinetd,Wi ...

  10. OpenCV3计算机视觉Python语言实现笔记(二)

    1. 图像与原始字节之间的转换 从概念上讲,一个字节能表示0到255的整数.目前,对于多有的实时图像应用而言,虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.a ...