MyBatis获取参数值的两种方式

目录

1.单个字面量类型的参数

2.多个字面量类型的参数

3.map集合类型的参数

4.实体类类型的参数

5.使用@Param标识参数


MyBatis获取参数值的两种方式:${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;

但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号


我们来创建一个应用实例:

public class User {
	
	private Integer id;
	private String username;
	private String password;
	private Integer age;
	private String gender;
	private String email;

	public User() {
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "User{" +
				"id=" + id +
				", username='" + username + '\'' +
				", password='" + password + '\'' +
				", age=" + age +
				", gender='" + gender + '\'' +
				", email='" + email + '\'' +
				'}';
	}
}
public interface UserMapper {
	/**
	 * 根据用户名查询用户信息
	 * @param username
	 * @return
	 */
	User getUserByUsername(String username);
}

核心配置文件:mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

      <!--
            Mybatis核心配置文件中的标签必须按照指定的顺序配置:
            properties?,settings?,typeAliases?,typeHandlers?,
            objectFactory?,objectWrapperFactory?,reflectorFactory?,
            plugins?,environments?,databaseIdProvider?,mappers?)
      -->

      <properties resource="jdbc.properties"/>

      <typeAliases>
            <package name="com.godairo.mybatis.pojo.User"/>
      </typeAliases>

      <environments default="development">
            <environment id="development">
                  <transactionManager type="JDBC"/>
                  <dataSource type="POOLED">
                        <property name="driver" value="${jdbc.driver}"/>
                        <property name="url" value="${jdbc.url}"/>
                        <property name="username" value="${jdbc.username}"/>
                        <property name="password" value="${jdbc.password}"/>
                  </dataSource>
            </environment>
      </environments>

      <!--引入mybatis的映射文件-->
      <mappers>
            <package name="com.godairo.mybatis.mapper"/>
      </mappers>
</configuration>

1.单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型 此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号

比如刚刚我们写的案例,根据用户名查询用户信息,它的参数就是单个的字符串类型,那么我们在映射文件中可以这么写。

<?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.godairo.mybatis.mapper.UserMapper">

      <!--User getUserByUsername(String username);-->
      <select id="getUserByUsername" resultType="User">
            select * from t_user where username = #{username}
      </select>
      
</mapper>

然后我们进行测试

@Test
public void testGetUserByUsername(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	User user = mapper.getUserByUsername("admin");
	System.out.println(user);
}

我们可以看看sql语句,我们自己写的是#{},但是结果却变成了问号,所以说我们使用#{}的时候,在底层#{}会直接被当做占位符来解析。

但是当我们把#{}里的内容改一下

会发现这里面的值随便写,都没有问题,其实参数里的username,把这个数据真正传输到映射文件的时候,在mybatis执行sql语句的底层代码里,根本不知道参数名叫什么,只知道我们传过来的值是admin,并不知道我们传过来的参数名叫username,我们在#{}这个地方可以用任意内容获取当前参数值,但是建议我们写的有意义些。  


那么我们用${}的时候,会报错。

我们需要手动加单引号

<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
      select * from t_user where username = '${username}'
</select>


2.多个字面量类型的参数

若mapper接口中的方法参数为多个时

此时MyBatis会自动将这些参数放在一个map集合中,

以arg0,arg1...为键,以参数为值;

以 param1,param2...为键,以参数为值;

因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,

注意${}需要手动加单引号

此时我们根据用户名和密码两个参数才查询信息。

/**
 * 验证登陆
 * @param username
 * @param password
 * @return
 */
User checkLogin(String username,String password);

这里我们来验证一下,一个参数是这种写法,那么两个参数也用这种写法试试

<!--User checkLogin(String username,String password);-->
<select id="checkLogin" resultType="User">
      select * from t_user where username = #{username} and password = #{password}
</select>
@Test
public void testCheckLogin(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	User user = mapper.checkLogin("admin","123456");
	System.out.println(user);
}

这里就会发现报错

这里报错意思就是:解析配置文件的时候错误,绑定参数的时候出现异常,参数username没有找到。

那么我们应该这么解决:

<!--User checkLogin(String username,String password);-->
<select id="checkLogin" resultType="User">
      select * from t_user where username = #{arg0} and password = #{arg1}
</select>


还有一种解决方式:

<!--User checkLogin(String username,String password);-->
<select id="checkLogin" resultType="User">
      select * from t_user where username = #{param1} and password = #{param2}
</select>


那么这是为什么呢??

如果我们当前的参数有2个,这个时候MyBatis会自动把这两个参数放在一个Map集合中,然后放在Map集合中,会以两种方式存储数据

第一种方式arg0,arg1的方式,以arg0,arg1为键,以参数值为值。

第二种方式param1,param2的方式,以param1,param2为键,以参数值为值


3.map集合类型的参数

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中

只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

在Mybatis中,会把多个参数放在map集合中,那放在map集合里,还要以它设置的键进行访问,那我们现在自己把这些数据放在map里,然后我们就以自己设置的键来访问。

/**
 * 验证登陆(以map集合作为参数)
 * @param map
 * @return
 */
User checkLoginByMap(Map<String,Object> map);

比如说map集合里存储的是用户名和密码,用户名的键是username,密码的键是password

@Test
public void testCheckLoginByMap(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	Map<String,Object> map = new HashMap<>();
	map.put("username","admin");
	map.put("password","123456");
	User user = mapper.checkLoginByMap(map);
	System.out.println(user);
}

这种情况就是自定义一下了,如果我们有多个参数,让mybatis自动放入map集合里,还需要以它的键进行访问,那么我们现在手动放map里,我们就可以以自己定义的键,来访问数据了。

UserMapper.xml

<!--User checkLoginByMap(Map<String,Object> map);-->
<select id="checkLoginByMap" resultType="User">
      select * from t_user where username = #{username} and password = #{password}
</select>

这是我们自己设置的map集合中的键,访问到了相应的数据。但是还需要自己把这些数据手动放到map集合中。


4.实体类类型的参数

若mapper接口中的方法参数为实体类对象时

此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号

现在是第四种情况,比如说我们现在实现添加用户信息功能,我们一开始需要在页面收集用户输入的内容,然后把这些内容提交到服务器中,获取完之后,需要封装到User对象里,这个时候做的就是传到Service,Service则是调用Mapper接口,而Mapper接口中的参数就应该是User对象,也就是一个实体类类型的参数,那我们现在要做的就是把实体类中各个属性的值拼接到SQL语句中,来实现一个添加语句的功能。

/**
 * 添加用户信息
 * @param user
 */
void insertUser(User user);
<!--void insertUser(User user);-->
<insert id="insertUser">
      insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
</insert>
@Test
public void testinsertUser(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	User user = new User(null,"root","123456",33,"女","123456@qq.com");
	mapper.insertUser(user);
}


5.使用@Param标识参数

我们还是以登陆功能为例。

我们之前在UserMapper的接口中定义了方法,之前有2种情况,第一种情况是mybatis会自动放在map中,我们需要以myabatis设置的键访问这些数据,然后第二种是手动放到map中,这样我们可以自己设置键进行访问。

现在我们直接在参数上加一个注解@Param(),在value属性值里设置一个字符串,比如就叫username,给password也加这个注解。这个时候mybats仍然会把它放在map集合里,这个时候放在map集合里的键就不会自己设置了,它会把我们当前注解的value属性值作为键,以当前参数作为值。

/**
 * 验证登陆(使用@Param注解)
 * @param username
 * @param password
 * @return
 */
User checkLoginByParam(String username,String password);
<!--User checkLoginByParam(String username,String password);-->
<select id="checkLoginByParam" resultType="User">
      select * from t_user where username = #{username} and password = #{password}
</select>
@Test
public void testCheckLoginByParam(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	User user = mapper.checkLogin("admin","123456");
	System.out.println(user);
}

这样也是可以的

@param:命名参数,可以帮我们设置Mybatis封装参数时候的键   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GodAiro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值