Mybatis之深入理解参数

1>parameterType

  • parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。
    • int 或 java.lang.Integer
    • hashmap 或 java.util.HashMap
    • list 或 java.util.ArrayList
    • student 或 com.bjpowernode.domain.Student
    • <select>,<insert>,<update>,<delete>都可以使用 parameterType 指定类型

2>一个简单参数

  • Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符},和方法的参数名无关
  • 接口方法:
Student selectById(int id);
  • mapper 文件:
<select id="selectById" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where id=#{studentId}
</select>
  • #{studentId} , studentId 是自定义的变量名称,和方法参数名无关。
  • 测试方法:
@Test
public void testSelectById(){
// 一个参数
Student student = studentDao.selectById(1005);
System.out.println(" 查询 id 是 1005 的学生:"+student);
}

3>多个参数

3.1、使用@param

  • 当 Dao 接口方法多个参数,需要通过名称使用参数。 在方法形参前面加入@Param(“自定义参数名”), mapper文件使用#{自定义参数名}。
    • 例如定义 List<Student> selectStudent( @Param(“personName”) String name ) { … }
    • mapper文件 select * from student where name = #{ personName}
  • 接口方法:
List<Student> selectMultiParam(@Param("personName") String name,
@Param("personAge") int age);
  • mapper 文件:
<select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where name=#{personName} or age
=#{personAge}
</select>
  • 测试方法:
@Test
public void testSelectMultiParam(){
List<Student> stuList = studentDao.selectMultiParam(" 李力",20);
stuList.forEach( stu -> System.out.println(stu));
}

3.2、使用对象

  • 使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。
  • 语法格式: #{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 } javaType,jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{property}
  • 创建保存参数值的对象 QueryParam
package com.bjpowernode.vo;
public class QueryParam {
private String queryName;
private int queryAge;
//set , get 方法
}
  • 接口方法:
List<Student> selectMultiObject(QueryParam queryParam);
mapper 文件:
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where name=#{queryName} or age
=#{queryAge}
</select><select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
where name=#{queryName,javaType=string,jdbcType=VARCHAR}
or age =#{queryAge,javaType=int,jdbcType=INTEGER}
</select>
  • 测试方法:
@Test
public void selectMultiObject(){
	QueryParam qp = new QueryParam();
	qp.setQueryName(" 李力");
	qp.setQueryAge(20);
	List<Student> stuList = studentDao.selectMultiObject(qp);
	stuList.forEach( stu -> System.out.println(stu));
}

3.3、按位置

  • 参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是#{arg0}, 第二个是#{arg1}
  • 注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。
  • 接口方法:
List<Student> selectByNameAndAge(String name,int age);
mapper 文件
<select id="selectByNameAndAge" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where name=#{arg0} or age =#{arg1}
</select>
  • 测试方法:
@Test
public void testSelectByNameAndAge(){
// 按位置参数
	List<Student> stuList = studentDao.selectByNameAndAge("李力",20);
	stuList.forEach( stu -> System.out.println(stu));
}

3.4、使用Map

  • Map集合可以存储多个值,使用Map向mapper文件一次传入多个参数。Map集合使用String的key,
  • Object 类型的值存储参数。 mapper 文件使用 # {key} 引用参数值。
  • 例如:
	Map<String,Object> data = new HashMap<String,Object>();
	data.put(“myname”,”李力”);
	data.put(“myage”,20);
  • 接口方法:
List<Student> selectMultiMap(Map<String,Object> map);
  • mapper 文件:
<select id="selectMultiMap" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where name=#{myname} or age =#{myage}
</select>
  • 测试方法:
@Test
public void testSelectMultiMap(){
	Map<String,Object> data = new HashMap<>();
	data.put("myname"," 李力");// #{myname}
	data.put("myage",20); // #{myage}
	List<Student> stuList = studentDao.selectMultiMap(data);
	stuList.forEach( stu -> System.out.println(stu));
}
  • 实际上后两种很少用,大多数情况都是用前两种

4>#和$

4.1、#

:占位符,告诉 mybatis 使用实际的参数值代替。并使用 PrepareStatement 对象执行 sql 语句, #{…}代替

  • sql 语句的“?”。这样做更安全,更迅速,通常也是首选做法,
  • mapper 文件
<select id="selectById" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where id=#{studentId}
</select>
  • 转为 MyBatis 的执行是:
String sql="select id,name,email,age from student where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1005);
  • 解释:
  • where id=? 就是 where id=#{studentId} ps.setInt(1,1005) , 1005 会替换掉
    #{studentId}

4.2、$

  • $ 字符串替换, ,告诉 mybatis 使用 包 含 的 “ 字 符 串 ” 替 换 所 在 位 置 。 使 用 S t a t e m e n t 把 s q l 语 句 和 包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和 使Statementsql{}的内容连接起来。主要用在替换表名,列名,不同列排序等操作。
  • 例 1: 分别使用 id , email 列查询 Student
  • 接口方法:
Student findById(int id);
Student findByEmail(String email);
  • mapper 文件:
<select id="findById" resultType="com.bjpowernode.domain.Student">
select * from student where id=#{studentId}
</select>
<select id="findByEmail" resultType="com.bjpowernode.domain.Student">
select * from student where email=#{stuentEmail}
</select>
  • 测试方法:
@Test
public void testFindStuent(){
Student student1 = studentDao.findById(1002);
System.out.println("findById:"+student1);
Student student2 = studentDao.findByEmail("zhou@126.net");
System.out.println("findByEmail:"+student2);
}
  • 例 2:通用方法,使用不同列作为查询条件
  • 接口方法:
Student findByDiffField(@Param("col") String colunName,@Param("cval") Object
value);
  • mapper 文件:
<select id="findByDiffField" resultType="com.bjpowernode.domain.Student">
select * from student where ${col} = #{cval}
</select>
  • 测试方法:
@Test
public void testFindDiffField(){
Student student1 = studentDao.findByDiffField("id",1002);
System.out.println("按id列查询:"+student1);
Student student2 = studentDao.findByDiffField("email","zhou@126.net");
System.out.println("按email列查询:"+student2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值