Mybatis查询数据库进行传参的方式有5种,常用的有两种,其他三种都不常用。现在从简单的一一介绍一下。
第一种:传一个简单类型的参数。不常用。
注:mybatis把java的基本数据类型和String都叫简单类型。
语法: #{任意字符}
接口中:
public Student selectStudentById(int id);
mapper文件中:
<select id="selectStudentById" resultType="com.gx.pojo.Student">
select * from student where student_id=#{id}
</select>
测试:
public void testSelectStudentById(){
//获取SqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//使用mybatis动态代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//执行sql,查询student_id为1003的学生
Student student = studentDao.selectStudentById(1003);
//输出
System.out.println("一个简单类型传参查询的学生="+student);
}
结果:
第二种:命名传参,使用到@Param,在接口方法中使用。
语法:@Param("myName") String name
接口:
public List<Student> selectMultiParam(@Param("myName") String name, @Param("myAge") int age);
mapper文件:
<select id="selectMultiParam" resultType="com.gx.pojo.Student">
select * from student where name=#{myName} or age=#{myAge}
</select>
测试:
public void testSelectMultiParam(){
//获取SqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//使用mybatis动态代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//执行sql
List<Student> listStudent = studentDao.selectMultiParam("鲁班七号",17);
//关闭SqlSession
sqlSession.close();
//遍历
for (Student stu : listStudent) {
System.out.println("命名参数查询的学生="+stu);
}
}
结果:
第三种:使用java对象
语法:#{对象属性名称}
接口:
public List<Student> selectMultiObject(Student student);
mapper文件:有两种方式,一种详细写法(不常用),还有一种是简化写法(常用)代码下注释有。
注:javaType:Java对象的全限定名称;jdbcType:数据库对应类型名称
<select id="selectMultiObject" resultType="com.gx.pojo.Student">
select * from student where
/*name=#{name,javaType=java.lang.String,jdbcType=VARCHAR} or
age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}*/
name=#{name} or age=#{age}
</select>
测试:
public void testSelectMultiObject(){
//获取SqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//使用mybatis动态代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//定义参数
Student student = new Student();
student.setName("鲁班大师");
student.setAge(18);
//执行sql
List<Student> listStudent = studentDao.selectMultiObject(student);
//关闭SqlSession
sqlSession.close();
//遍历
for(Student stu : listStudent){
System.out.println("对象传参查询的学生="+stu);
}
}
结果:
第四种: 位置传参(按位置获取参数)
语法:
mybatis.3.4版本以前#{0},#{1}
mybatis.3.4版本以后#{arg0},#{arg1}
例如:#{0}对应name
接口:
public List<Student> selectMultiPosition(String name,Integer age);
mapper文件:
<select id="selectMultiPosition" resultType="com.gx.pojo.Student">
select * from student where name=#{arg0} or age=#{arg1}
</select>
测试:
public void testSelectMultiPosition(){
//获取SqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//使用mybatis动态代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//执行sql
List<Student> listStudent = studentDao.selectMultiPosition("鲁班七号",17);
//关闭SqlSession
sqlSession.close();
//遍历
for(Student stu : listStudent){
System.out.println("位置传参查询的学生="+stu);
}
}
结果:
第五种:Map 传参
语法:Map<String,Object> map
接口:
public List<Student> selectMultiMap(Map<String,Object> map);
mapper文件:
<select id="selectMultiMap" resultType="com.gx.pojo.Student">
select * from student where name=#{name} or age=#{age}
</select>
测试:
public void testSelectMultiMap(){
//获取SqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//使用mybatis动态代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//定义查询条件
Map<String,Object> map = new HashMap<>();
map.put("name","鲁班七号");
map.put("age",17);
//执行sql
List<Student> listStudent = studentDao.selectMultiMap(map);
//关闭SqlSession
sqlSession.close();
//遍历
for(Student stu : listStudent){
System.out.println("Map传参查询的学生="+stu);
}
}
结果:
总结:
两种常用传参方法:命名传参、对象传参
三种不常用的方法:
1)、一个简单参数传参方式
缺点:因为名字可以不一样,所以容易忘记
2)、位置传参
缺点:容易混淆参数位置
3)、Map传参
缺点:可读性差