MyBatis传递多个参数方式
作者:pan_junbiao
MyBatis是一款优秀的ORM框架。
使用MyBatis进行开发时经常需要往方法中传递多个参数,下面将介绍几种MyBatis传递多个参数的方法。
【示例】
根据用户账号和用户密码,获取用户信息。
(1)在MySQL数据库中创建用户信息表(tb_user),并添加数据。
-- 创建“用户信息”数据表 CREATE TABLE IF NOT EXISTS tb_user ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号', user_account VARCHAR(50) NOT NULL COMMENT '用户账号', user_password VARCHAR(50) NOT NULL COMMENT '用户密码', blog_url VARCHAR(50) NOT NULL COMMENT '博客地址', remark VARCHAR(50) COMMENT '备注' ) COMMENT = '用户信息表'; -- 添加数据 INSERT INTO tb_user(user_account,user_password,blog_url,remark) VALUES('pan_junbiao的博客','123456','https://blog.csdn.net/pan_junbiao','您好,欢迎访问 pan_junbiao的博客');
(2)创建用户信息持久化类(User.java)。
package com.pjb.mybatis.po; /** * 用户信息的持久化类 * @author pan_junbiao **/ public class User { private int id; //用户编号 private String userAccount; //用户账号 private String userPassword; //用户密码 private String blogUrl; //博客地址 private String remark; //备注 //省略getter与setter方法... }
(3)开启驼峰命名规则。
实例中使用了MyBatis驼峰命名规则。
需要在MyBatis的全局配置文件SqlMapConfig.xml(mybatis-config.xml)中,设置开启驼峰命名规则配置。
<!-- 开启自动驼峰命名规则(camel case)映射 --> <setting name="mapUnderscoreToCamelCase" value="true"/>
方法一:顺序传参法
创建SQL配置文件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.pjb.mybatis.mapper.UserMapper"> <!-- 根据用户账号和用户密码,获取用户信息 --> <select id="getUser" resultType="com.pjb.mybatis.po.User"> SELECT * FROM tb_user WHERE user_account = #{arg0} AND user_password = #{arg1} </select> </mapper>
说明:顺序传递参法使用:#{arg0}、#{arg1}... 作为占位符,数字代表传入参数的顺序。
注意:在Mybatis3.4.2或之前的版本中使用:#{0}、#{1}... 作为占位符,但在新版本的MyBatis中,这种方式已经过时了,会提示错误:
org.apache.ibatis.binding.BindingException: Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2]
创建用户信息Mapper动态代理接口。
package com.pjb.mybatis.mapper; import com.pjb.mybatis.po.User; /** * 用户信息Mapper动态代理接口 * @author pan_junbiao **/ public interface UserMapper { public User getUser(String account,String password); }
编写执行方法。
/** * MyBatis传递多个参数 * @author pan_junbiao */ @Test public void getUser() { DataConnection dataConnection = new DataConnection(); SqlSession sqlSession = dataConnection.getSqlSession(); //获取Mapper代理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //执行Mapper代理对象的查询方法 User user = userMapper.getUser("pan_junbiao的博客","123456"); if(user!=null) { System.out.println("用户编号:" + user.getId()); System.out.println("用户账号:" + user.getUserAccount()); System.out.println("用户密码:" + user.getUserPassword()); System.out.println("博客地址:" + user.getBlogUrl()); System.out.println("备注信息:" + user.getRemark()); } sqlSession.close(); }
执行结果:
方法二:@Param注解传参法(推荐)
public User getUser(@Param("userAccount") String account,@Param("userPassword") String password);
<select id="getUser" resultType="com.pjb.mybatis.po.User"> SELECT * FROM tb_user WHERE user_account = #{userAccount} AND user_password = #{userPassword} </select>
#{}里面的名称对应的是注解@Param括号里面修饰的名称。
这种方法在参数不多的情况还是比较直观的,推荐使用。
方法三:Map传参法
public User getUser(Map<String, Object> params);
<select id="getUser" parameterType="java.util.Map" resultType="com.pjb.mybatis.po.User"> SELECT * FROM tb_user WHERE user_account = #{userAccount} AND user_password = #{userPassword} </select>
调用方法:
//获取Mapper代理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //查询参数 Map params = new HashMap(); params.put("userAccount","pan_junbiao的博客"); params.put("userPassword","123456"); //执行Mapper代理对象的查询方法 User user = userMapper.getUser(params);
#{}里面的名称对应的是Map里面的key名称。
这种方法适合传递多个参数,且参数易变能灵活传递的情况。
方法四:JavaBean传参法(推荐)
创建用户信息参数类(UserParam.java)。
package com.pjb.mybatis.po; /** * 用户信息参数类 * @author pan_junbiao **/ public class UserParam { private String userAccount; //用户账号 private String userPassword; //用户密码 //省略getter与setter方法... }
public User getUser(UserParam userParam);
<select id="getUser" parameterType="com.pjb.mybatis.po.UserParam" resultType="com.pjb.mybatis.po.User"> SELECT * FROM tb_user WHERE user_account = #{userAccount} AND user_password = #{userPassword} </select>
调用方法:
//获取Mapper代理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //查询参数 UserParam userParam = new UserParam(); userParam.setUserAccount("pan_junbiao的博客"); userParam.setUserPassword("123456"); //执行Mapper代理对象的查询方法 User user = userMapper.getUser(userParam);
#{}里面的名称对应的是UserParam类里面的成员属性。
这种方法很直观,需要建一个实体类,推荐使用。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。