前言
本章学习MyBatis参数传递的相关知识
方法
1.概念
在之前的例子中,我们在XXXMapper.xml中写入的查询语句都是查询全部,那么带有where语句的参数该如何传递呢?接下来讲解一下关于参数传递的问题。
2.方法
1)配置参数的类型
在XXXMapper.xml配置查询方法的时候,属性parameterType为参数类型
#{}获取参数内容
- 使用索引:从0开始代表第一个参数,1第二个参数,以此类推;或使用param1代表第一个参数,以此类推
- 使用具体的名称
特别的:MyBatis3.4.4及之后的版本不可用#{0},#{1}获取参数,将使用#{arg0},#{arg1}
在MyBatis中也可以使用${内容}来获取参数内容,不常用,知道即可
#{}和${}最主要的区别在于:
- #{}底层使用sql预处理,也就是使用了?作为占位符
- ${}底层直接使用sql进行拼接,容易造成sql注入
一个具体的例子如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper配置文件的根路径,namespace代表实现类的全路径(包名+类名) -->
<mapper namespace="cn.edu.ccut.mapper.StudentMapper">
<!-- 该处每一个标签代表一个方法(select、insert、delete、update等),
id为方法名,
parameterType为参数类型,
resultType为返回值类型
-->
<select id="doLogin" resultType="User" parameterType="String">
select * from users where id = #{0}
</select>
</mapper>
2)编写测试类进行测试
package cn.edu.ccut.test;
import cn.edu.ccut.bo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class StudentTest {
@Test
public void testLoginUser(){
SqlSession session = null;
try {
//获取sqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession对象
session = sqlSessionFactory.openSession();
//使用sqlSession对象进行查询操作
User user = session.selectOne("doLogin","1");
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭连接
session.close();
}
}
}
注意:目前为止,如果传递两个及两个以上的参数,我们需要使用map或者实体类对象进行操作
实例:传递两个参数
配置文件设置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper配置文件的根路径,namespace代表实现类的全路径(包名+类名) -->
<mapper namespace="cn.edu.ccut.mapper.StudentMapper">
<!-- 该处每一个标签代表一个方法(select、insert、delete、update等),
id为方法名,
parameterType为参数类型,
resultType为返回值类型
-->
<select id="doLogin" resultType="User" parameterType="map">
select * from users where id = #{id} and username = #{username}
</select>
</mapper>
测试类编写:
package cn.edu.ccut.test;
import cn.edu.ccut.bo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class StudentTest {
@Test
public void testLoginUser(){
SqlSession session = null;
try {
//获取sqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession对象
session = sqlSessionFactory.openSession();
//使用map放置多个参数
Map<String,Object> map = new HashMap<String,Object>();
map.put("id","1");
map.put("username","admin");
//使用sqlSession对象进行查询操作
User user = session.selectOne("doLogin",map);
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭连接
session.close();
}
}
}