目录
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
- "1.0" encoding="UTF-8" ?>
- configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
-
-
-
- <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>
-
-
- <mappers>
- <package name="com.godairo.mybatis.mapper"/>
- mappers>
- configuration>
若mapper接口中的方法参数为单个的字面量类型 此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
比如刚刚我们写的案例,根据用户名查询用户信息,它的参数就是单个的字符串类型,那么我们在映射文件中可以这么写。
- "1.0" encoding="UTF-8" ?>
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
- <mapper namespace="com.godairo.mybatis.mapper.UserMapper">
-
-
- <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,我们在#{}这个地方可以用任意内容获取当前参数值,但是建议我们写的有意义些。
那么我们用${}的时候,会报错。
我们需要手动加单引号
- <select id="getUserByUsername" resultType="User">
- select * from t_user where username = '${username}'
- select>
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,
以arg0,arg1...为键,以参数为值;
以 param1,param2...为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,
注意${}需要手动加单引号
此时我们根据用户名和密码两个参数才查询信息。
- /**
- * 验证登陆
- * @param username
- * @param password
- * @return
- */
- 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没有找到。
那么我们应该这么解决:
- <select id="checkLogin" resultType="User">
- select * from t_user where username = #{arg0} and password = #{arg1}
- select>
还有一种解决方式:
- <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为键,以参数值为值
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
在Mybatis中,会把多个参数放在map集合中,那放在map集合里,还要以它设置的键进行访问,那我们现在自己把这些数据放在map里,然后我们就以自己设置的键来访问。
- /**
- * 验证登陆(以map集合作为参数)
- * @param map
- * @return
- */
- User checkLoginByMap(Map
map) ;
比如说map集合里存储的是用户名和密码,用户名的键是username,密码的键是password
- @Test
- public void testCheckLoginByMap(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- Map
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
- <select id="checkLoginByMap" resultType="User">
- select * from t_user where username = #{username} and password = #{password}
- select>
这是我们自己设置的map集合中的键,访问到了相应的数据。但是还需要自己把这些数据手动放到map集合中。
若mapper接口中的方法参数为实体类对象时
此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
现在是第四种情况,比如说我们现在实现添加用户信息功能,我们一开始需要在页面收集用户输入的内容,然后把这些内容提交到服务器中,获取完之后,需要封装到User对象里,这个时候做的就是传到Service,Service则是调用Mapper接口,而Mapper接口中的参数就应该是User对象,也就是一个实体类类型的参数,那我们现在要做的就是把实体类中各个属性的值拼接到SQL语句中,来实现一个添加语句的功能。
- /**
- * 添加用户信息
- * @param 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);
- }
我们还是以登陆功能为例。
我们之前在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);
- <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封装参数时候的键