Mybatis(5) ——万能Map和模糊查询实现

1、Map集合

    我们知道,Map集合就是为了便于我们查阅数据的集合,里面的数据都是按照<K,V>键值对的形式进行的存储,而我们在MyBatis中也有可以使用到它的地方

    使用场景:当我们的实体类拥有的属性很多,比如有200个,而我们一次向里面插入或修改的字段并不多只有几个的时候,按照上一节笔记的思路,我们新建或修改的时候需要传入一个user对象,而new一个user对象的时候我们就需要按照构造参数来new
    ①那如果我只是想要修改一条记录中某一个字段的值,那么我们就需要将这个对象重新new一遍,将除了要修改的字段值该掉之外,其他的字段都要保留,这显然是不符合我们开发效率的
    ②如果我们想要new一个实体类对象插入数据表中,那么我们需要将构造中所有的参数都填写上才能实现

    这个时候我们就可以使用Map集合来实现只对某个记录的某一个字段进行修改或只向数据表中插入我想插入的数据的操作

固定3步步骤

  • DAO/MAPPER接口定义
//3.1、使用Map作为参数
int insertUser2(Map<String,Object> map);
  • MAPPER.XML实现接口
    注意:这里可以看出使用Map和直接使用POJO的区别
    ①parameterType的值直接写map
    ②使用插入语句的时候,除了主键+非空字段,我们可以任意指定某一个字段插入还是不插入,虽然我们使用POJO也可以实现,但是前提是这个POJO你要向new出来,而POJO中一般只有两个构造,一个无参一个全参,要实现这样的功能我们只能先new一个全参的POJO,而使用Map的方便之处就在这里,我们只需要传入必须插入字段+想要插入字段的<K,V>,然后直接在values()中使用#{ }按照key来取对应的值就可以了
    ③使用Map的另一个好处也在下面这段代码中展现出来,由于我们使用的是Map集合,在取值的时候是按照键值对取值,所以我们key的命名没有规范,不用和数据表中的字段保持一致,这就节省了我们写代码的时候查字段名称的时间;而是要POJO实现的时候,我们values()中的变量名称必须和POJO属性名保持一致才行
    <insert id="insertUser2" parameterType="map">
        insert into mybatis.user(id,pwd) values(#{newId},#{password})
    </insert>
  • 测试
    @Test
    public void test6(){
        //1、获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("newId",6);
        map.put("password","2333");
        mapper.insertUser2(map);

        sqlSession.commit();
        sqlSession.close();
    }

在这里插入图片描述
    思考:使用Map是可以简便的实现我们想插入几个字段就插入几个字段的需求,但是对应的,我们需要在Dao/Mapper中多写一个方法的定义,在mapper.xml中多写一条这个方法对应的SQL语句,这显然也是比较麻烦的
    所以,使用Map是一种思路,一种可以实现你的定制化需求的思路,在以后开发的过程中如果遇到这样的需求,我们可以按照这种思路来解决问题

    上面的例子没有举修改数据的例子,其实修改的例子和插入的例子相似,只有方法名称不同、SQL语句不同,其他的都大致相同

2、模糊查询

需求:使用名字字段进行模糊查询

  1. 在方法传参的时候将传入的字符串前后拼接%
    在这里插入图片描述
  • MAPPER
//1.1、模糊查询
List<User> getUserLike(String name);
  • MAPPER.XML
<select id="getUserLike" resultType="com.thhh.pojo.User">
    select * from mybatis.user where name like #{name}
</select>
  • 测试
    @Test
    public void getUserLike(){
        //1、获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        String name = "%李%";
        List<User> userList = mapper.getUserLike(name);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.commit();
        sqlSession.close();
    }

在这里插入图片描述

  1. 将SQL语句写死,使用 ‘%${name}%’(外面的引号也要要),不能直接使用 “%”#{name}"%",会报错
  • MAPPER.XML
<select id="getUserLike" resultType="com.thhh.pojo.User">
    select * from mybatis.user where name like  '%${name}%'
</select>
  • 测试
    @Test
    public void getUserLike(){
        //1、获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        String name = "李";
        List<User> userList = mapper.getUserLike(name);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.commit();
        sqlSession.close();
    }

在这里插入图片描述
    可见两种方法效果相同,但是对比之下,个人觉得第二种更好,这样不用对方法调用处传递的参数做出拼接的要求

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值