Mybatis系列--03-Map和模糊查询拓展

Map和模糊查询拓展

概述

本文主要讲利用map类型进行参数传入和使用模糊查询获取结果
利用map类型进行参数传入不太规范,但是在表中字段众多且无需传入所有字段的情况下比较好用(狂神说的,我在实际项目中没有用到)

实践

跟上一篇一样,基础环境搭建代码我就不写了,仅写核心的java和xml文件

UserDao.java

package com.kuang.dao;

import java.util.List;
import java.util.Map;

import com.kuang.pojo.User;

/**
 * 功能描述
 *
 * @since 2022-07-11
 */
public interface UserDao {
    List<User> getUserList();

    List<User> getUserLike(String s);

    int addUser(User user);

    int addUser2(Map<String, Object> map);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.UserDao">
    <select id="getUserList" resultType="com.kuang.pojo.User">
        select *
        from user
    </select>

    <select id="getUserLike" resultType="com.kuang.pojo.User">
        select *
        from user
        where name like #{s}
    </select>

    <insert id="addUser" parameterType="com.kuang.pojo.User">
        insert into user (`id`, `name`, `pwd`)
        values (#{id}, #{name}, #{pwd})
    </insert>

    <insert id="addUser2" parameterType="map">
        insert into user (`id`, `name`, `pwd`)
        values (#{userId}, #{userName}, #{password})
    </insert>
</mapper>

测试代码

package com.kuang.dao;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.kuang.pojo.User;
import com.kuang.util.MyBatisUtils;

/**
 * 功能描述
 *
 * @since 2022-07-11
 */
public class UserDaoTest {
    @Test
    public void test1() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        Iterator<User> iterator = userList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        sqlSession.close();
    }

    @Test
    public void getlike() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserLike("%h%");
        Iterator<User> iterator = userList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        sqlSession.close();

    }


    @Test
    public void add() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        int result = mapper.addUser(new User(4, "lili", "123"));
        // 增删改操作需要提交事务 否则不生效
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void add2() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        Map<String, Object> map = new HashMap<>();
        map.put("userId", 5);
        map.put("userName", "heihei");
        map.put("password", "123456");
        int result = mapper.addUser2(map);
        // 增删改操作需要提交事务 否则不生效
        sqlSession.commit();
        sqlSession.close();
    }
}

重点说明

动态sql是mybatis的主要特性之一,在mybatis中我们可以把参数传到xml文件,由mybatis对sql及其语法进行解析,mybatis支持使用#{} 和${},两者功能相似,实际还是有区别

  1. 使用${}方式传入的参数,mybatis不会对它进行特殊处理,而使用#{}传进来的参数,Mybatis会默认将其当成字符串
  2. #和$在预编译处理中是不一样的。# 类似jdbc中的PreparedStatement,对于传入的参数,在预处理阶段会使用?代替,待真正查询的时候即在数据库管理系统中(DBMS)才会代入参数。比如:
    select * from student where id = ?;
    而${}则是简单的替换,如下:
    select * from student where id = 2;

总结

  1. 能使用#{}的地方应尽量使用#{}
  2. 像PreparedStatement ,#{}可以有效防止sql注入,${}则可能导致sql注入成功。
posted @ 2022-07-13 19:29  Oh,mydream!  阅读(55)  评论(0编辑  收藏  举报