使用 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>