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

🕊万能的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注入,$方式则不行,综上,一般情况下,一般采用#不采用 $

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是X大魔王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值