问题:
Mybatis 参数传递说明
查询: age < 18 or age > 100
是否可以封装为对象?? 不可以!!
规则:
1.Mybatis 原生只支持单值传参
2.如果是多值,则想办法封装为单值
方法: 1.封装为对象
2.封装为Map集合<K,V> ={minAge: 18,maxAge:100}
补充说明: 现在mybatis版本 如果多值传参 则自动封装为Map集合
Key:参数名称 value: 参数的值
方式:
1、在dao层UserMapper中定义方法
2、在.xml文件中写执行的的sql语句
小于号 < 需要进行转义 为 <(LT);
3、在test中测试方法
dao层(mapper)UserMapper接口
package com.jt.mapper;
import com.jt.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
//@Mapper //将该接口交给Spring管理,spring创建对象
public interface UserMapper {
//查询所有的user用户
List<User> findAll();
/**
* 规则:
* 1.Mybatis 原生只支持单值传参
* 2.如果是多值,则想办法封装为单值
* 方法: 1.封装为对象
* 2.封装为Map集合<K,V> ={minAge: 18,maxAge:100}
* 补充说明: 现在mybatis版本 如果多值传参 则自动封装为Map集合
* Key:参数名称 value: 参数的值
*/
//List<User> findWhere(String name,Integer age,String sex);
List<User> findWhere(User user);
List<User> findAge(int minAge,int maxAge);
List<User> findName(String name);
//List<User> findAge(@Param("minAge") int minAge,@Param("maxAge") int maxAge);
}
UserMapper.xml文件
<?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="com.jt.mapper.UserMapper">
<!--Oracle中 ;号必定报错 不要加;号
resultType:
1.如果有别名包则自动拼接 com.jt.pojo.User
2.如果根据别名找不到,则使用默认规则
-->
<select id="findAll" resultType="User">
select * from demo_user
</select>
<!--驼峰规则说明:
Mybatis 功能1: 可以实现结果集与实体对象的映射!!!
对象与表 一一对应,
对象中的属性与表中的字段 一一对应.
User(userId,userName)
user表(user_id,user_name)
resultType: 不能映射.
resultMap: 自己手动编辑.
简化上述的操作: 引入驼峰规则.
思考:开启驼峰规则如下是否可以映射???
User(user_id,user_name)
user表(user_id,user_name)
字段user_id~~~userid~~~userId~~~~
setUserId(..)方法
规则: 如果开启驼峰规则,必须按照要求编辑否则报错
-->
<!--
查询: sex="男" age > 18岁
取值符号: #号 有预编译效果 能用#号不用$
自动的为参数添加一对 引号""
#号用法: #{属性/key}
-->
<select id="findWhere" resultType="User">
select * from demo_user
where
sex=#{sex}
and
age > #{age}
</select>
<!--
age < 18 or age > 100
-->
<select id="findAge" resultType="User">
select * from demo_user
where
age < #{minAge}
or
age > #{maxAge}
</select>
<!--说明: 如果只有一个参数(不是对象/map),则名称可以任意
Mybatis认为只有一个参数,不会有错.
-->
<select id="findName" resultType="User"><!--这个aaa可以随便取值--->
select * from demo_user where name = #{aaa}
</select>
</mapper>
测试类TestMybatis.java
package com.jt.test;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper; //必须有对象!!!!
@Test
public void test01(){
List<User> userList = userMapper.findAll();
System.out.println(userList);
}
/**
* Mybatis 参数传递说明
* 查询: sex="男" age > 18岁
*/
@Test
public void testMybatis(){
//参数使用对象进行封装
User user = new User();
user.setSex("男").setAge(18);
List<User> userList = userMapper.findWhere(user);
System.out.println(userList);
}
/**
* Mybatis 参数传递说明
* 查询: age < 18 or age > 100
* 思考: 1.是否可以封装为对象?? 不可以!!
*
*/
@Test
public void testMybatis2(){
int minAge = 18;
int maxAge = 100;
List<User> userList = userMapper.findAge(minAge,maxAge);
System.out.println(userList);
}
/**
* Mybatis 参数传递说明
* 查询name="王昭君"
*/
@Test
public void testMybatis3(){
String name = "王昭君";
List<User> userList = userMapper.findName(name);
System.out.println(userList);
}
}
补充:@Param注解
官方解析文档:
1、如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。
2、若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 "param" 作前缀,
3、再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2},这个是默认值。
4、如果注解是 @Param("person"),那么参数就会被命名为 #{person}。
在不使用@Param注解的时候,函数的参数只能为一个,并且在查询语句取值时只能用#{},且其所属的类必须为Javabean,
而使用@Param注解则可以使用多个参数,在查询语句中使用时可以使用#{}或者${}
使用:
1、使用@Param后,接口中的参数顺序也可以打乱,只要id唯一即可
2、当只有一个参数的时候可以不使用此注解
@Mapper
public interface LoginMapper extends BaseMapper<User> {
@Select("SELECT COUNT(1) FROM `user` WHERE name=#{username} AND PASSWORD=#{password} ")
public int checkLogin(@Param("username") String username, @Param("password") String password);
}
相似的注解@RequestParam
前端提交的form表单数据的name属性 和方法中的参数名不一致时 ,springMVC就无法自动封装参数,所以需要@RequestParam(前端name属性名称)来指定前端提交的表单的name属性的名称
当前端的name属性和方法的参数名一致的时候,可以不使用此注解
主要作用在Controller层