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支持使用#{} 和${},两者功能相似,实际还是有区别
- 使用${}方式传入的参数,mybatis不会对它进行特殊处理,而是用#{}传进来的参数,Mybatis会默认将其当成字符串
- #和$在预编译处理中是不一样的。# 类似jdbc中的PreparedStatement,对于传入的参数,在预处理阶段会使用?代替,待真正查询的时候即在数据库管理系统中(DBMS)才会代入参数。比如:
select * from student where id = ?;
而${}则是简单的替换,如下:
select * from student where id = 2;
总结
- 能使用#{}的地方应尽量使用#{}
- 像PreparedStatement ,#{}可以有效防止sql注入,${}则可能导致sql注入成功。
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/java/274143.html