parameterType

写在mapper文件中的一个属性,代表dao接口中方法的参数类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过反射机制,推断出具体传入语句的参数,默认值为未设置( unset)。 接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。

int 或 java.lang.Integer
hashmap 或 java.util.HashMap
list 或 java.util.ArrayList
student 或 com.bjpowernode.domain.Student

例如存在接口:public Student selectStudentById(Integer id);

  1. @Test
  2. public void testSelectStudentById() {
  3. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  4. StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
  5. Student student = studentDao.selectStudentById(1001);
  6. System.out.println(student);
  7. }

传入一个简单类型的参数

  • 简单类型:java基本类型和String, sql语句中在对应的位置采用占位符:#{任意字符}, 和方法的参数名无关。

    实现原理

    在使用#{}后,mybatis执行sql是使用jdbc中的PreparedStatement对象
    由mybatis执行下面的代码:
  1. mybatis创建Connection,PreparedStatement对象
  2. 执行sql,封装为resultType对象

传入多个参数

使用@param命名参数【重要】

在接口中使用,在方法的形参前面加入 @Param("自定义参数名") 对应的在mapper文件中使用 #{自定义参数名}

  1. public List<Student> selectStudentMultiParam(@Param("myname") String name,
  2. @Param("myage") Integer age);
  1. <select id="selectStudentMultiParam" resultType="com.liangwei.entity.Student">
  2. select id, name, email, age from student where name=#{myname} or age=#{myage}
  3. </select>

使用对象传参【重要】

  • 前提:有一个对象,能够对应数据库中的字段
  • 在mapper文件中, 使用 #{类中的成员变量名称}
  • 完整格式为:#{变量名称, javaType=java的全限定名, jdbcType=jdbc中的类型名称} (后面两个可以省略)

按位置传参(了解)

参数位置从 0 开始, 引用参数语法 #{ arg ``位置 ``}, 第一个参数是#{arg0}, 第二个是#{arg1}注意: mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。

使用map存放

Map 集合可以存储多个值, 使用Map向 mapper 文件一次传入多个参数。Map 集合使用 String的 key,Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值。
image.png
image.png

#和$的区别

  1. #

select id, name, email, age from student where id=#{studentId}
结果:select id, name, email, age from student where id=?

  1. $ -> 使用Statement对象执行,效率比PreparedStatement低-> 可能产生 SQL注入

select id, name, email, age from student where id=${studentId}
结果:select id, name, email, age from student where id=1001
字符串拼接的方式:
String sql = "select id, name, email, age from student where id=" + "1001"

【说明】${}更常用在替换列名、表名上面。
例如:select * from student order by ${colName}