• MyBatis获取参数值的两种方式


    目录

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

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

    3.map集合类型的参数

    4.实体类类型的参数

    5.使用@Param标识参数


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

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

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


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

    1. public class User {
    2. private Integer id;
    3. private String username;
    4. private String password;
    5. private Integer age;
    6. private String gender;
    7. private String email;
    8. public User() {
    9. }
    10. public Integer getId() {
    11. return id;
    12. }
    13. public void setId(Integer id) {
    14. this.id = id;
    15. }
    16. public String getUsername() {
    17. return username;
    18. }
    19. public void setUsername(String username) {
    20. this.username = username;
    21. }
    22. public String getPassword() {
    23. return password;
    24. }
    25. public void setPassword(String password) {
    26. this.password = password;
    27. }
    28. public Integer getAge() {
    29. return age;
    30. }
    31. public void setAge(Integer age) {
    32. this.age = age;
    33. }
    34. public String getGender() {
    35. return gender;
    36. }
    37. public void setGender(String gender) {
    38. this.gender = gender;
    39. }
    40. public String getEmail() {
    41. return email;
    42. }
    43. public void setEmail(String email) {
    44. this.email = email;
    45. }
    46. @Override
    47. public String toString() {
    48. return "User{" +
    49. "id=" + id +
    50. ", username='" + username + '\'' +
    51. ", password='" + password + '\'' +
    52. ", age=" + age +
    53. ", gender='" + gender + '\'' +
    54. ", email='" + email + '\'' +
    55. '}';
    56. }
    57. }
    1. public interface UserMapper {
    2. /**
    3. * 根据用户名查询用户信息
    4. * @param username
    5. * @return
    6. */
    7. User getUserByUsername(String username);
    8. }

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

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <properties resource="jdbc.properties"/>
    7. <typeAliases>
    8. <package name="com.godairo.mybatis.pojo.User"/>
    9. typeAliases>
    10. <environments default="development">
    11. <environment id="development">
    12. <transactionManager type="JDBC"/>
    13. <dataSource type="POOLED">
    14. <property name="driver" value="${jdbc.driver}"/>
    15. <property name="url" value="${jdbc.url}"/>
    16. <property name="username" value="${jdbc.username}"/>
    17. <property name="password" value="${jdbc.password}"/>
    18. dataSource>
    19. environment>
    20. environments>
    21. <mappers>
    22. <package name="com.godairo.mybatis.mapper"/>
    23. mappers>
    24. configuration>

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

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

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

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.godairo.mybatis.mapper.UserMapper">
    6. <select id="getUserByUsername" resultType="User">
    7. select * from t_user where username = #{username}
    8. select>
    9. mapper>

    然后我们进行测试

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

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

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

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


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

    我们需要手动加单引号

    1. <select id="getUserByUsername" resultType="User">
    2. select * from t_user where username = '${username}'
    3. select>


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

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

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

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

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

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

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

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

    1. /**
    2. * 验证登陆
    3. * @param username
    4. * @param password
    5. * @return
    6. */
    7. User checkLogin(String username,String password);

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

    1. <select id="checkLogin" resultType="User">
    2. select * from t_user where username = #{username} and password = #{password}
    3. select>
    1. @Test
    2. public void testCheckLogin(){
    3. SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5. User user = mapper.checkLogin("admin","123456");
    6. System.out.println(user);
    7. }

    这里就会发现报错

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

    那么我们应该这么解决:

    1. <select id="checkLogin" resultType="User">
    2. select * from t_user where username = #{arg0} and password = #{arg1}
    3. select>


    还有一种解决方式:

    1. <select id="checkLogin" resultType="User">
    2. select * from t_user where username = #{param1} and password = #{param2}
    3. select>


    那么这是为什么呢??

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

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

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


    3.map集合类型的参数

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

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

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

    1. /**
    2. * 验证登陆(以map集合作为参数)
    3. * @param map
    4. * @return
    5. */
    6. User checkLoginByMap(Map map);

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

    1. @Test
    2. public void testCheckLoginByMap(){
    3. SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5. Map map = new HashMap<>();
    6. map.put("username","admin");
    7. map.put("password","123456");
    8. User user = mapper.checkLoginByMap(map);
    9. System.out.println(user);
    10. }

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

    UserMapper.xml

    1. <select id="checkLoginByMap" resultType="User">
    2. select * from t_user where username = #{username} and password = #{password}
    3. select>

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


    4.实体类类型的参数

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

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

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

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


    5.使用@Param标识参数

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

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

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

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

    这样也是可以的

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

  • 相关阅读:
    通过Go语言创建CA与签发证书
    docker 高级 compose/swarm
    circt firtool man page
    Paddle训练COCO-stuff数据集学习记录
    Python查找指定字符
    数字人直播软件多少钱,数字人直播系统多少钱,真正赚钱的是?
    算法记录 & 牛客网 & leetcode刷题记录
    【考研英语语法】状语从句精讲
    中文写代码?开始不信后来用中文写了剧情小游戏!嗯,真香~
    【Android笔记52】Android如何实现Fragment碎片适配器和Activity页面间的数据交互
  • 原文地址:https://blog.csdn.net/qq_44706176/article/details/126460871