mybatis接口方法参数传参解读

简介: mybatis接口方法参数传参解读

单个简单类型参数

简单类型包括:

  • byte short int long float double char
  • Byte Short Integer Long Float Double Character
  • String
  • java.util.Date
  • java.sql.Date
1. /**
2.      * 根据学生id进行查询
3.      * @param id
4.      * @return
5.      */
6.     Student selectById(Long id);

对应的映射xml文件

1.     <select id="selectById" resultType="com.study.pojo.Student">
2.         select * from t_student where id=#{id};
3.     </select>

简单类型对于mybatis来说都是可以自动类型识别的:

  • 也就是说对于mybatis来说,它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。

如果参数只有一个的话,#{} 里面的内容就随便写了。对于 ${} 来说,注意加单引号。

Map参数

需求:根据name和age查询

1. /**
2. * 根据name和age查询
3. * @param paramMap
4. * @return
5. */
6. List<Student> selectByParamMap(Map<String,Object> paramMap);

 对应的映射xml文件

1. <select id="selectByParamMap" resultType="com.study.pojo.Student">
2.         select * from t_student where name=#{name} and age=#{age}
3. </select>

对应的java测试代码

1. @org.junit.Test
2. public void test02(){
3. SqlSession sqlSession = SqlSessionUtil.openSession();
4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
5.         Map map=new HashMap();
6.         map.put("name","张三");
7.         map.put("age","18");
8.         List<Student> student = mapper.selectByParamMap(map);
9.         System.out.println(student);
10.     }

这种方式是手动封装Map集合,将每个条件以key和value的形式存放到集合中。然后在使用的时候通过#{map集合的key}来取值。

实体类(pojo)参数

需求:插入一条Student数据

1. /**
2.      * 插入学生数据
3.      * @param student
4.      * @return
5.      */
6. int insertStudent(Student student);

对应的映射xml文件

1.     <insert id="insertStudent">
2.         insert  into t_student values (null ,#{name},#{age},#{brith})
3.     </insert>

 对应的java测试代码

1. @org.junit.Test
2. public void test03(){
3. SqlSession sqlSession = SqlSessionUtil.openSession();
4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
5. Student student = new Student();
6.         student.setAge("28");
7.         student.setBrith(new Date());
8.         student.setName("李四");
9. int i = mapper.insertStudent(student);
10.         System.out.println(i);
11.         System.out.println(student);
12.     }

这里需要注意的是:#{} 里面写的是属性名字。这个属性名其本质上是:set/get方法名去掉set/get之后的名字,也就是使用了反射进行。

多参数

需求:通过name和sex查询

1. /**
2.      * 根据name和age查询
3.      * @param name
4.      * @param age
5.      * @return
6.      */
7.     List<Student> selectByNameAndAge(String name, String age);

 对应的映射xml文件(错误示范)

1.     <select id="selectByNameAndAge" resultType="com.study.pojo.Student">
2.         select * from t_student where name=#{name} and age=#{age}
3.     </select>

  对应的java测试代码

1. @org.junit.Test
2. public void test04(){
3. SqlSession sqlSession = SqlSessionUtil.openSession();
4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
5.         List<Student> student = mapper.selectByNameAndAge("张三", "18");
6.         System.out.println(student);
7.     }

运行报错

异常信息描述了:name参数找不到,可用的参数包括[arg1, arg0, param1, param2]

修改StudentMapper.xml配置文件:尝试使用[arg1, arg0, param1, param2]去参数

修改xml文件

1. <select id="selectByNameAndAge" resultType="com.study.pojo.Student">
2.         select * from t_student where name=#{param1} and age=#{param2}
3. </select>

再次运行得到结果

同时也可以将xml文件修改为:

1. <select id="selectByNameAndAge" resultType="com.study.pojo.Student">
2.         select * from t_student where name=#{arg0} and age=#{arg1}
3. </select>

通过测试可以看到:

  • arg0 是第一个参数
  • param1是第一个参数
  • arg1 是第二个参数
  • param2是第二个参数

实现原理:实际上在mybatis底层会创建一个map集合,以arg0/param1为key,以方法上的参数为value例如以下代码:

1. Map<String,Object> map = new HashMap<>();
2. map.put("arg0", name);
3. map.put("arg1", sex);
4. map.put("param1", name);
5. map.put("param2", sex);
6. 
7. // 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2}
8. // 其本质就是#{map集合的key}
注意:使用mybatis3.4.2之前的版本时:要用#{0}和#{1}这种形式。

@Param注解(命名参数)

可以不用arg0 arg1 param1 param2吗?这个map集合的key我们自定义可以吗?当然可以。使用@Param注解即可。这样可以增强可读性。

需求:根据name和age查询

添加注解

1. /**
2.      * 根据name和age查询
3.      * @param name
4.      * @param age
5.      * @return
6.      */
7.     List<Student> selectByNameAndAge(@Param("name") String name,@Param("age") String age);

对应的xml文件

1.     <select id="selectByNameAndAge" resultType="com.study.pojo.Student">
2.         select * from t_student where name=#{name} and age=#{age}
3.     </select>


相关文章
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
51 10
|
3月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
XML Java 数据库连接
MyBatis中的接口代理机制及其使用
【8月更文挑战第5天】MyBatis的接口代理机制是其核心功能之一,允许通过定义接口并在运行时生成代理对象来操作数据库。开发者声明一个带有`@Mapper`注解的接口,MyBatis则依据接口方法、映射配置(XML或注解)及数据库信息动态生成代理类。此机制分为四步:创建接口、配置映射文件或使用注解、最后在业务逻辑中注入并使用代理对象。这种方式简化了数据库操作,提高了代码的可读性和可维护性。例如,在电商系统中可通过`OrderMapper`处理订单数据,在社交应用中利用`MessageMapper`管理消息,实现高效且清晰的数据库交互。
|
5月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
78 11
|
5月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
MybatisPlus--IService接口基本用法,MP提供了Service接口,save(T) 这里的意思是新增了一个T, saveBatch 是批量新增的意思,saveOrUpdate是增或改
MybatisPlus--IService接口基本用法,MP提供了Service接口,save(T) 这里的意思是新增了一个T, saveBatch 是批量新增的意思,saveOrUpdate是增或改
|
5月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
145 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
73 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
下一篇
DataWorks