使用 Map 传参
当我们的实体类或者对应的数据库表的字段过多时,应当考虑使用Map!
我们之前通过对象传递参数来实现增改时,是通过传递对象做参数 来实现的:
我们在测试类中调用接口中的方法后,UserMapper.xml 会自动根据对象的属性来确定参数从而实现参数的传递,所以对象的属性名必须和UserMapper.xml 中的参数名一一对应!【paramtype="com.lyh.pojo.User"】
注意:
- UserMapper.xml 中尽量避免中文注释,容易报错!
- 提交增删改语句时必须通过事务,否则不生效!
我们使用Map传递参数,UserMapper.xml 可以直接通过map的键来读取到对应的值,所以map的键必须和UserMapper.xml 中的参数名一一对应!【paramtype="map"】
但是一个实体类的属性名通常比较规范,而我们的Map的键名比较随意,重点是对应好UserMapper.xml 中的参数名即可。
只有一个基本类型(通过id或name来查找或者删除用户时)的情况下,我们可以直接在sql中取到。但这也仅限于一个参数,多个参数时,仍然应该通过map来传递参数【paramtype="int/String"】
新增用户
map的key可以随意定义,但需要和UserMapper.xml 的参数名一一对应。
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
try {
//传递给 UserMapper.xml 一个对象 它可以通过对象的属性将参数取出来
map.put("userId",2);
map.put("userName","李元芳");
map.put("password","12345");
int num = mapper.addUser2(map);
System.out.println(num +" ");
//提交事务
sqlSession.commit();
if (num>=1)
System.out.println("插入成功");
else
System.out.println("插入失败");
}catch (Exception e){
System.out.println("SQL异常,该Id已存在");
}finally {
sqlSession.close();
}
}
UserMapper.xml
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd)
values (#{userId},#{userName},#{password});
</insert>
UserMapper.java
在接口中新增方法
//通过map添加用户
int addUser2(Map<String,Object> map);
查找用户
@Test
public void getUserById2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获得接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("helloId",2); //使用map可以随意定制参数名 只要对应UserMapper.xml 中的参数名即可
User user = mapper.getUserById2(map);
System.out.println(user);
sqlSession.close();
}
在接口中新增方法
User getUserById2(Map<String ,Object> map);
修改映射文件
<select id="getUserById2" resultType="com.study.pojo.User" parameterType="map">
select * from mybatis.user where id = #{helloId}
</select>
模糊查询
在MyBatis的映射文件中,parameterType
参数是可选的。它用于指定 SQL 语句中使用的参数的类型。如果不指定 parameterType
,MyBatis 将会根据传递给映射语句的参数来自动推断参数类型。但如果我们提供了明确的参数类型时,MyBatis 可以更好地处理参数转换和类型匹配。因此,如果知道参数的类型,最好还是在映射文件中显式地定义 parameterType
,以确保正确的类型处理。
1、在Java代码中使用通配符
在接口中新增方法
List<User> getUserLike(String value);
映射文件
<select id="getUserLike" resultType="com.study.pojo.User" parameterType="String">
select * from mybatis.user where name like #{value}
</select>
测试类
@Test
public void getUserListLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获得接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserLike("%李%");
for(User user: users)
System.out.println(user);
sqlSession.close();
}
2、在SQL中使用通配符
<select id="getUserLike" resultType="com.study.pojo.User" parameterType="String">
select * from mybatis.user where name like "%"#{value}"%"
</select>