一、占位符的使用
#{}占位符
- 底层是由jdbc中PrepareStatement对象实现
- mybatis的底层会把#{}占位符替换成jdbc占位符中?的形式,可以防止发生sql注入,它是安全的,但是他不能表示表名和列名
${}占位符
- 底层是由jdbc中Statement对象实现的
- mybatis的底层会把${}占位符变成字符串拼接的形式,他不会对传入的参数做出类型的改变,使用起来不安全,有sql注入的风险,常常在确保安全的情况下使用或用来表示表名、列名
使用方法
这两个占位符的使用方法都是一样的,只是有上边那些不同
使用示例
<select id="selectStudentById" parameterType="int" resultType="org.example.demain.Student">
select id,name,email,age from student where id=#{id}
</select>
二、Mybatis的5种传参方法
1、一个简单类型的参数
Mapper标签中的代码为
<select id="selectStudentById" parameterType="int" resultType="org.example.demain.Student">
select id,name,email,age from student where id=#{id}
</select>
dao接口的方法名设置为
package org.example.dao;
import org.apache.ibatis.annotations.Param;
import org.example.demain.Student;
import java.util.List;
public interface StudentDao {
Student selectStudentById(Integer id);
}
测试类中的代码为
package org.example;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void testtwo(){
// 首先获取SqlSession对象
SqlSession session= MybatisUtils.getSqlSession();
// 利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
StudentDao stu=session.getMapper(StudentDao.class);
// 调用实现类方法获取查询的返回对象
Student student=stu.selectStudentById(1003);
// 输出返回对象
System.out.println(student);
// 释放资源
session.close();
}
}
测试结果

2、多个简单类型的参数
@Param注解
@Param注解是专门用来对传入的参数命名的,命名好的参数可以被占位符识别
具体使用
- 首先使用@Param注解在dao接口的方法中命名好传入的参数
package org.example.dao;
import org.apache.ibatis.annotations.Param;
import org.example.demain.Student;
import java.util.List;
public interface StudentDao {
Student selectaaa(@Param("id1") Integer id, @Param("ema1") String email);
}
- 然后在Mapper文件的占位符中配置,占位符中需要传入的名字就可以直接在{}中写我们定义好的名字
<select id="selectaaa" resultType="org.example.demain.Student">
select id,name,email,age from student where id=#{id1} and email=#{ema1}
</select>
- 测试类跟之前的一样
package org.example;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void testone(){
// 首先获取SqlSession对象
SqlSession session= MybatisUtils.getSqlSession();
// 利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
StudentDao stu=session.getMapper(StudentDao.class);
// 调用实现类方法获取查询的返回对象
Student student=stu.selectaaa(1003,"wangwu@126.com");
// 输出返回对象
System.out.println(student);
// 释放资源
session.close();
}
}
- 测试结果

3、实体类传参
- 如果需要传入的参数特别特别特别特别的多的话,使用@Param注解命名可能会很麻烦,所以我们就用到了实体类传参
- 实体类传参的步骤就是需要创建一个传参类,他的属性就是需要传入的参数,生成该类的getter和setter方法,该类的需要使用的属性名需要和sql语句占位符中的名字一样,在运行过程mybatis会通过反射机制调用该类的getter方法,自动匹配与占位符名字相同的类属性进行传参
- 测试的时候先生成类的实例对象,然后利用setter给该类属性赋值,然后把该类的实例对象传参
首先创建一个传参类,生成它的getter和setter方法
package org.example.demain;
public class clq {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
private Integer age;
}
dao接口设置
package org.example.dao;
import org.apache.ibatis.annotations.Param;
import org.example.demain.Student;
import org.example.demain.clq;
import java.util.List;
public interface StudentDao {
List<Student> selectbbb(clq a);
}
mapper文件设置
<select id="selectbbb" resultType="org.example.demain.Student">
select id,name,email,age from student where id=#{id} or age=#{age}
</select>
测试类
package org.example;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.example.demain.clq;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void Testthree(){
// 首先获取SqlSession对象
SqlSession session= MybatisUtils.getSqlSession();
// 利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
StudentDao stu=session.getMapper(StudentDao.class);
// 调用实现类方法获取查询的返回对象
clq cl1=new clq();
cl1.setId(1001);
cl1.setAge(21);
List<Student> student=stu.selectbbb(cl1);
// 输出返回对象
System.out.println(student);
// 释放资源
session.close();
}
}
测试结果

4、位置传参和map传参
这两个不常用,也不多做赘述,需要的时候查网上资料
版权声明:本文为weixin_47544732原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。