1.为什么要使用@Param注解
在上篇博客中,我们以及将代码跑起来了,在跑起来后,我们是否思考过当方法中传递多个参数的时候,这个方法该怎么办,有人可能想到用逗号分开,但是发现会报错。就很神奇,说明MyBatis有专门的方法来解决多个简单参数赋值的方法。这就是我今天要说的@Param注解
2. @Param注解的使用情况
在什么情况使用@Param注解呢??
1.当方法有多个参数时。(最常用)
2.想给方法的参数取别名。(可以将复杂的参数名称换个简单的)
3.当xml文件的sql语句含有占位符$($占位符稍后会讲解)
4.如果在动态 SQL 中使用了参数作为变量,那么也需要 @Param 注解,即使你只有一个参数。
3.@Param注解的使用方法
@Param(value = "自定义名称") 数据类型 参数名称
@Param注解是由MyBatis提供的。 位置放到形参前面。 属性 value= 可以省略不写 。可能看的不是很明白,下面就说个例子
List<Student> selectNameAge(@Param(value = "myname") String name, @Param("age") Integer age);
在这个例子中将参数"name" 取别名为“myname”。在xml文件中相关的写入的就是“myname”了。 下面是完整代码。
在StudentDao接口中写入方法
List<Student> selectNameAge(@Param(value = "myname") String name, @Param("age") Integer age);
在StudentDao.xml文件中
<!-- 多个简单类型参数 当使用@Param(value)后在本 配置文件中使用#{value名} 例如@Param(“myname”) 在这里不能写#{name} 而是#{myname}--> <select id="selectNameAge" resultType="com.liuhaiyang.domain.Student"> select *from student where name=#{myname} or age=#{age} </select>
测试类
@Test public void TestNameAge(){ SqlSession session =MybatisUtils.getSqlSession(); StudentDao dao=session.getMapper(StudentDao.class); List<Student> student=dao.selectNameAge("王五",22); student.forEach(stu -> System.out.println(stu)); }
运行结果:
4.方法的参数说明
方法的参数不仅仅只能是简单类型,它可以是类也可以是集合 ,但是map作为参数是不建议使用的。不管是那种参数都可以做增删改查操作。下面举两个例子。看着代码来理解会更容易。
StudentDao接口要添加的代码
//java对象作为参数 List<Student> selectStudents(Student student); //用map作为参数 不建议使用 List<Student> selectMap(Map<String,Object> map); // 修改操作 int updateStudent(Student student);
StudentDao.xml文件要写的代码
<!-- 一个Java对象作为方法的参数,使用对象的属性作为参数值使用 简单的语法 #{属性名},mybatis调用此属性的getXXX()方法来获取属性值 --> <!--根据传入的参数name和age,查询传入参数name和age的人的个人信息--> <select id="selectStudents" resultType="com.liuhaiyang.domain.Student"> select * from student where name=#{name} or age=#{age} </select> <!-- 下面是完整版本的,后面的内容基本是可以省略不写的 <select id="selectStudents" resultType="com.liuhaiyang.domain.Student"> select * from student where name=#{name,javaType=java.lang.String,jdbcType=VARCHAR} or age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER} </select>--> <!-- map作为传参 不建议使用--> <!--根据传入的参数name和age,查询他们的个人信息--> <select id="selectMap" resultType="com.liuhaiyang.domain.Student"> select * from student where name=#{myname} or age=#{myage} </select> <!--根据id修改数据库的name和age--> <update id="updateStudent"> update student set name=#{name},age=#{age} where id=#{id} </update>
测试代码
@Test public void selectObject(){ SqlSession session =MybatisUtils.getSqlSession(); StudentDao stu=session.getMapper(StudentDao.class); Student student=new Student(); student.setName("张三"); student.setAge(23); List<Student> st= stu.selectStudents(student);//查询名字叫张三 或者年龄等于23的人的个人信息 st.forEach(s -> System.out.println(s)); session.close(); } @Test public void TestMap(){ SqlSession session=MybatisUtils.getSqlSession(); StudentDao dao=session.getMapper(StudentDao.class); Map<String,Object> map=new HashMap<>(); map.put("myname","王五"); map.put("myage",22); List<Student> stu= dao.selectMap(map); //查询名字叫王五 或者年龄等于22的人的个人信息 stu.forEach(s->System.out.println(s)); } @Test public void Testupdate(){ SqlSession session = MybatisUtils.getSqlSession(); StudentDao dao=session.getMapper(StudentDao.class); Student student=new Student(); student.setAge(23); student.setName("刘海洋"); student.setId(10001); student.setEmail("liuhaiyang@qq.com"); //把id等于10001的人name改为“刘海洋”,age改为23 int a=dao.updateStudent(student); session.commit(); System.out.println(a); session.close(); }
运行结果
selectStudents类
selectMap类
updateStudent类