(自我总结)mybatis万能Map示例+模糊查询示例+#和$的区别

2023-05-16

录💡

  • 🕊万能的map
    • 🕊插入完整数据
    • 🕊测试结果
    • 🕊修改某用户的某字段
    • 🕊测试
  • 🕊模糊查询
    • 🕊SQL注入
    • 🕊例子
    • 🕊测试
  • 🕊#和$的区别

🕊万能的map

假设我们的实体类,或者数据库中的表、字段或者参数过多,我们应当考虑使用Map!
以下同样是使用和上一篇博客相同的数据表user
在这里插入图片描述
我们知道在update数据库一条数据时,每次都要传入一个完整的用户,但是如果使用万能的Map,就不需要。使用这个还有一个好处那就是我不需要知道数据库里有什么,我只要去查我想要的对应的字段,以下为代码用例,所用的文件结构等都在这篇博客:来啦(本系列都是同一个项目,同一张表)

🕊插入完整数据

先用插入一行数据为例,可以看到其实和不用没什么很大的区别,较大的区别就是插入时values()里的值${},括号里的值可以自己定义,不用和User对象属性名id name pwd一样,可自定义
UserDao.java

//    万能的map插入
    int addUser2(Map<String, Object> map);

UserMapper.xml

<!--    万能map,values后面的#{},括号里的值可以不用和User对象的属性名一一对应,反正传递的时map的key值-->
    <insert id="addUser2" parameterType="map" >
        insert into mybatis.user (id,name ,pwd) values (#{userId}, #{userName}, #{Password})
    </insert>

Test.java

@Test
public void test5(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    Map<String, Object> map = new HashMap<>();
    map.put("userId", 4);
    map.put("userName", "aa");
    map.put("Password", "444444");
    mapper.addUser2(map);
    sqlSession.commit();
    sqlSession.close();
}

🕊测试结果

在这里插入图片描述

🕊修改某用户的某字段

假设现在要修改某用户的密码,就用刚刚插入的id=4的数据为例,修改密码为333333
UserDao.java

//    万能map修改用户密码
    int updateUser2(Map<String, Object> map);

UserMapper.xml

<!--    万能map修改用户密码-->
    <update id="updateUser2" parameterType="map">
        update mybatis.user set pwd=#{Password} where id=#{userId}
    </update>

Test.java

@Test
public void test6(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    Map<String, Object> map = new HashMap<>();
    map.put("userId", 4);
    map.put("Password", "333333");
    mapper.updateUser2(map);
    sqlSession.commit();
    sqlSession.close();
}

🕊测试

在这里插入图片描述
在这里如果要更新数据不使用map对应的映射sql语句(只是一个例子):

    <update id="updateUser" parameterType="com.xmonster.pojo.User">
        update mybatis.user set name=#{name}, pwd=#{pwd} where id=#{id}
    </update>

那么你就要将所有的参数都写出来,因为你传过去的是一个对象User,那么你肯定要把这个对象的所有的属性都写上,不然会报错

🕊模糊查询

🕊SQL注入

🔻拼接SQL,了解一下SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

🕊例子

查找名字中带有字母’o’的人名
第一种:Java代码执行的时候,传递通配符%
UserDao.java

//    模糊查询
    List<User> getUserLike(String value);

UserMapper.xml

    <select id="getUserLike" resultType="com.xmonster.pojo.User">
        select * from mybatis.user where name like #{value};
    </select>

Test.java

@Test
public void test7(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    List<User> userLike = mapper.getUserLike("%o%");
    for (User user : userLike) {
        System.out.println(user);
    }
    sqlSession.close();
}

第二种:sql拼接中使用通配符
在UserMapper.xml中写死

    <select id="getUserLike" resultType="com.xmonster.pojo.User">
        select *
        from mybatis.user where name like "%"#{value}"%";
    </select>

这样在调用的时候就直接可以传递一个字母’o’过去就行了

🕊测试

在这里插入图片描述

🕊#和$的区别

1、#{}将传入的数据都被当成一个字符串,会对自动传入的数据加一个双引号,看看例子:

order by #{id}
//传入1,变成:
order by "1"

2、${}将传入的数据直接显示生成在sql中,看看例子:

order by ${id}
//传入1,变成:
order by 1

3、#能够很大程度防止sql注入,$方式则不行,综上,一般情况下,一般采用#不采用 $

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(自我总结)mybatis万能Map示例+模糊查询示例+#和$的区别 的相关文章

随机推荐