1 MyBatis 传递参数

对应 SQL 映射文件中的相关属性:parameterType 属性resultType 属性resultMap 属性

1.1 一个简单参数

Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{任意字符},和方法的参数名无关。

若 mapper 接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值,注意${}需要手动加单引号。尽量不使用后者,后者会有 SQL 注入。

// Dao 接口中
Student selectById(int id);
// 测试
Student student = studentDao.selectById(1005);

#{studentId} , studentId 是自定义的变量名称,和方法参数名无关。

//映射文件
<select id="selectById" resultType="com.bjpowernode.domain.Student">
	select id,name,email,age from student where id=#{studentId}
</select>
 
<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
	select * from t_user where username = '${username}'
</select>

1.2 多个参数使用 @Param

// Dao 接口中
List<Student> selectMultiParam(@Param("personName") String name, @Param("personAge") int age);
// 测试
List<Student> stuList = studentDao.selectMultiParam("李力",20);
//映射文件
<select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
	select id,name,email,age from student where name=#{personName} or age =#{personAge}
</select>

1.3 多个参数使用 Java 对象

使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。每一个属性就是一个参数。
语法格式:#{property, javaType=java 中数据类型名, jdbcType=数据类型名称 } javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{property}

// Java 对象
public class Book {
    private String bookName;
    private int bookAge;
}
 
// Dao 接口
List<Student> selectMultiObject(Book queryParam);
 
// 测试
QueryParam qp = new QueryParam();
qp.setQueryName("李力");
qp.setQueryAge(20);
List<Student> stuList = studentDao.selectMultiObject(qp);
//映射文件
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
	select id,name,email,age from student where name=#{bookName} or age =#{bookAge}
</select>
// 或
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
	select id,name,email,age from student where name=#{bookName,javaType=string,jdbcType=VARCHAR} or age =#{bookAge,javaType=int,jdbcType=INTEGER}
</select>

1.4 多个参数按位置

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

List<Student> selectByNameAndAge(String name,int age);
<select id="selectByNameAndAge" resultType="com.bjpowernode.domain.Student">
	select id,name,email,age from student where name=#{arg0} or age =#{arg1}
</select>

1.5 多个参数使用 Map

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

// 接口方法:
List<Student> selectMultiMap(Map<String,Object> map);
// 测试
Map<String,Object> data = new HashMap<>();
data.put("myname","李力");// #{myname}
data.put("myage",20); // #{myage}
// mapper 文件:
<select id="selectMultiMap" resultType="com.bjpowernode.domain.Student">
	select id,name,email,age from student where name=#{myname} or age =#{myage}
</select>

1.6 查询多条数据为 map 集合

// 方法一:
List<Map<String, Object>> getAllUserToMap();
 
// 方法二:
@MapKey("id")
Map<String, Object> getAllUserToMap();
<!-- 方法二 -->
<select id="getAllUserToMap" resultType="map">
	select * from t_user
</select>
<!--
	结果:
	[{password=123456, sex=男, id=1, age=23, username=admin},
	{password=123456, sex=男, id=2, age=23, username=张三},
	{password=123456, sex=男, id=3, age=23, username=张三}]
-->

1.7 # 和 $

# 占位符,告诉 mybatis 使用实际的参数值代替。并使用 PrepareStatement 对象执行 sql 语句 , #{…} 代替 sql 语句的 “?”。这样做更安全,更迅速,通常也是首选做法,

$ 字符串替换告诉 mybatis 使用 $ 包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和 ${} 的内容连接起来。主要用在替换表名,列名,不同列排序等操作。通用方法,使用不同列作为查询条件。

// 接口
Student findByDiffField(@Param("col") String colunName,@Param("cval") Object value);
// 测试
Student student1 = studentDao.findByDiffField("id",1002);
System.out.println("按 id 列查询:"+student1);
Student student2 = studentDao.findByDiffField("email"," zhou@126.net ");
System.out.println("按 email 列查询:"+student2);
<select id="findByDiffField" resultType="com.bjpowernode.domain.Student">
	select * from student where ${col} = #{cval}
</select>