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());
        }

    }

    @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());
        }

    }


    @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();
    }

    @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();
    }
}

重点说明

动态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注入成功。

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/java/274143.html

(0)
上一篇 2022年7月13日 19:47
下一篇 2022年7月13日 20:18

相关推荐

发表回复

登录后才能评论