目录
1.parameterType
3.dao接口方法中有多个简单类型的参数
4.dao接口方法使用一个对象作为参数
5.dao接口中多个简单类型的参数,使用位置
6.dao接口参数是一个Map
参数就是通过java程序把数据传入到mapper文件中的sql语句。参数主要是指dao接口方法的形参
1.parameterTypeparameterType:表示参数的类型,指定dao方法的形参数据类型。这个形参的数据类型是给mybatis使用。mybatis是给sql语句的参数赋值时使用。
PreparedStatement.setXXX(位置, 值)
要想理解这里必须对JDBC中的PreparedStatement有足够的了解,推荐看我之前写的一篇文章
一文学会JDBC(两万字,适用于新手)_ypxcan的博客-CSDN博客
我们来看mapper文件中select查询语句
mybatis要执行的sql语句为:
select id, name, email, age from student where id = ?
?是占位符,使用JDBC中的PreparedStatement执行这样的sql语句
PreparedStatement ps = conn.prepareStatement("select id, name, email, age from student where id = ?");
我们给 ? 位置进行赋值
- 如果参数是Integer,则执行ps.setInt(1, 1005)
- 如果参数是String,则执行ps.setString(1, "1005")
那么parameterType的第一个用法:
java类型的全限定类型名称 parameterType = "java.lang.Integer"
那么代码就是这样写:
select id, name, email, age from student where id = #{studentId}
第二种用法,使用别名
既然我们这里是Integer类型,那么别名就是int,那么代码就是这么写
我们在测试类中测试一下
发现是可以执行的
但是我们发现一个问题,好像parameterType不写也是可以的,没错,parameterType不是强制的,mybatis通过反射机制是可以得到参数类型的,绝大多数情况下我们不需要写这个参数。
2.dao接口方法参数一个简单类型的参数如果dao接口中方法的形参是一个简单类型,那么mapper文件中,获取这个参数值,使用#{任意字符}
简单类型:八种基本类型 + String
我们来讲一个例子,首先在dao接口中定义一个方法
package com.lu.dao; import com.lu.entity.Student; public interface StudentDao { Student selectStudentByEmail(String email); }
在mapper文件中来写查询代码
我们去测试类中去调用
@Test public void testselectStudentByEmail() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); Student student = dao.selectStudentByEmail("zhangsan@qq.com"); System.out.println(student); session.close(); }
控制台输出:
3.dao接口方法中有多个简单类型的参数这里我们要使用@Param这个注解
@Param:命名参数,在方法的形参前面使用的,定义参数名。
我们先来看一下不适用这个注解会出现什么情况
我们在dao接口中重新定义一个方法
ListselectByNameOrAge(String name, Integer age);
在mapper文件中写代码
在测试类中测试
@Test public void testSelectByNameOrAge() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); Liststudents = dao.selectByNameOrAge("张三", 25); students.forEach(student -> System.out.println(student)); session.close(); }
控制台输出:
报错了,mybatis不能识别多个参数,所以这时候我们就需要使用@Param注解
该注解的使用位置在dao接口中
ListselectByNameOrAge(@Param("myname") String name, @Param("myage") Integer age);
当使用了@Param后,例如@Param("myname"),在mapper文件中,使用#{命名的参数},
例如#{myname},那么mapper文件中就需要改成
重新在测试类汇总进行测试
可以看到测试成功了,这种方式只针对少量参数,如果参数比较多,四五个或者更多,那么这样就会非常繁琐,如果参数非常多,我们推荐使用对象的方式
4.dao接口方法使用一个对象作为参数方法的形参是一个java对象,这个java对象表示多个参数。使用对象的属性值作为参数使用。
下面我们来举一个例子
我们首先在dao接口中定义一个方法
ListselectByObject(Student student);
然后在mapper文件中写sql语句
这里我们只写了name和age,那么测试类中就可以这么写
@Test public void testSelectByObject() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); Student student = new Student(); student.setName("张三"); student.setAge(25); Liststudents = dao.selectByObject(student); students.forEach(stu -> System.out.println(stu)); session.close(); }
控制台输出:
可以看到可以正常输出
我们必须明白我们的参数不一定使我们定义的Student实体类,也可以是其他类,只要该类的属性有set和get方法即可
5.dao接口中多个简单类型的参数,使用位置参数位置:dao接口中方法的形参列表,从左往右,参数位置是0,1,2...
语法格式:#{arg0},#{arg1}
下面来讲一个例子:
我们首先在接口中定义一个方法
ListselectByPosition(String name, Integer age);
mapper文件中
在测试类中
@Test public void testSelectByPositon() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); Liststudents = dao.selectByPosition("张三", 18); students.forEach(student -> System.out.println(student)); session.close(); }
控制台输出:
这种方法看起来好像更简单,但是我们不推荐使用这种方法,因为代码可读性低,我们要想知道传的是什么值,就必须去dao接口中查看方法的参数,不能见名知意
6.dao接口参数是一个Mapmap作为dao接口的参数,使用key获取参数值,mapper文件中, 语法格式 #{key}
我们来写一个例子:
我们首先在dao接口中定义一个方法
//使用Map作为参数 ListselectStudentByMap(Map map);
mapper文件中:
测试类中:
@Test public void testSelectByMap() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); //使用Map传递参数 Mapdata = new HashMap<>(); data.put("myname", "张三"); data.put("myage", 20); List students = dao.selectStudentByMap(data); students.forEach(student -> System.out.println(student)); session.close(); }
控制台输出:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)