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>