参数获取

之前我们都是采用#{}的方式进行参数传递,其实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. 设计模式のInterpreter Patern(解释器模式)----行为模式

    一.问题产生背景 有一句话“小明和小龙是好朋友”,我想分析其中谁是人,我想分析他们的关系等多种需求,那么我们应该如何处理,如果为每一个关系都进行判断?显然不合适,我们可以将二者的关系进行抽象处理,然后 ...

  2. centos6.5下配置django+uwsgi+nginx

    https://blog.csdn.net/huanbia/article/details/54630180

  3. python之常用模块(续)

    time模块 random模块 sys模块 os模块 序列化模块  time模块 有三种方式表示 在Python中,通常有三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串 ...

  4. mac下安装redis详细步骤

    Linux下安装redis也可以参照下面的步骤哦!!!! 1.到官网上下载redis,我下载的版本是redis-3.2.5.tar 官网地址:http://redis.io/ 2.将下载下来的tar. ...

  5. Python中使用class(),面向对象有什么优势 转自知乎

    https://www.zhihu.com/question/19729316 首先我是辣鸡,然后这个问题的确有点意思 首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个 ...

  6. Java时间api

  7. 解决 Vim 的 quickfix 插件错误信息乱码问题

      将以下代码插入 vim 配置文件即可,       function! QfMakeConv()        let qflist = getqflist()        for i in q ...

  8. wxWidgets 在 Linux 下开发环境配置

    本文基于 CodeBlocks (16.0.1) 和 wxWidgets (3.0.2) 搭建 Linux 下 GUI 开发环境. 1. 安装 CodeBlocks Ubuntu 默认的源当前 Cod ...

  9. 典型分布式系统分析:Bigtable

    本文是典型分布式系统分析的第三篇,分析的是Bigtable,一个结构化的分布式存储系统. Bigtable作为一个分布式存储系统,和其他分布式系统一样,需要保证可扩展.高可用与高性能.与此同时,Big ...

  10. Luogu4916 魔力环 莫比乌斯反演、组合、生成函数

    传送门 先不考虑循环同构的限制,那么对于一个满足条件的序列,如果它的循环节长度为\(d\),那么与它同构的环在答案中就会贡献\(d\)次. 所以如果设\(f_i\)表示循环节长度恰好为\(i\)的满足 ...