1、Map集合
我们知道,Map集合就是为了便于我们查阅数据的集合,里面的数据都是按照<K,V>键值对的形式进行的存储,而我们在MyBatis中也有可以使用到它的地方
使用场景:当我们的实体类拥有的属性很多,比如有200个,而我们一次向里面插入或修改的字段并不多只有几个的时候,按照上一节笔记的思路,我们新建或修改的时候需要传入一个user对象,而new一个user对象的时候我们就需要按照构造参数来new
①那如果我只是想要修改一条记录中某一个字段的值,那么我们就需要将这个对象重新new一遍,将除了要修改的字段值该掉之外,其他的字段都要保留,这显然是不符合我们开发效率的
②如果我们想要new一个实体类对象插入数据表中,那么我们需要将构造中所有的参数都填写上才能实现
这个时候我们就可以使用Map集合来实现只对某个记录的某一个字段进行修改或只向数据表中插入我想插入的数据的操作
固定3步步骤
- DAO/MAPPER接口定义
//3.1、使用Map作为参数
int insertUser2(Map<String,Object> map);
- MAPPER.XML实现接口
注意:这里可以看出使用Map和直接使用POJO的区别
①parameterType的值直接写map
②使用插入语句的时候,除了主键+非空字段,我们可以任意指定某一个字段插入还是不插入,虽然我们使用POJO也可以实现,但是前提是这个POJO你要向new出来,而POJO中一般只有两个构造,一个无参一个全参,要实现这样的功能我们只能先new一个全参的POJO,而使用Map的方便之处就在这里,我们只需要传入必须插入字段+想要插入字段的<K,V>,然后直接在values()中使用#{ }按照key来取对应的值就可以了
③使用Map的另一个好处也在下面这段代码中展现出来,由于我们使用的是Map集合,在取值的时候是按照键值对取值,所以我们key的命名没有规范,不用和数据表中的字段保持一致,这就节省了我们写代码的时候查字段名称的时间;而是要POJO实现的时候,我们values()中的变量名称必须和POJO属性名保持一致才行
<insert id="insertUser2" parameterType="map">
insert into mybatis.user(id,pwd) values(#{newId},#{password})
</insert>
- 测试
@Test
public void test6(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("newId",6);
map.put("password","2333");
mapper.insertUser2(map);
sqlSession.commit();
sqlSession.close();
}
思考:使用Map是可以简便的实现我们想插入几个字段就插入几个字段的需求,但是对应的,我们需要在Dao/Mapper中多写一个方法的定义,在mapper.xml中多写一条这个方法对应的SQL语句,这显然也是比较麻烦的
所以,使用Map是一种思路,一种可以实现你的定制化需求的思路,在以后开发的过程中如果遇到这样的需求,我们可以按照这种思路来解决问题
上面的例子没有举修改数据的例子,其实修改的例子和插入的例子相似,只有方法名称不同、SQL语句不同,其他的都大致相同
2、模糊查询
需求:使用名字字段进行模糊查询
- 在方法传参的时候将传入的字符串前后拼接%
- MAPPER
//1.1、模糊查询
List<User> getUserLike(String name);
- MAPPER.XML
<select id="getUserLike" resultType="com.thhh.pojo.User">
select * from mybatis.user where name like #{name}
</select>
- 测试
@Test
public void getUserLike(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
String name = "%李%";
List<User> userList = mapper.getUserLike(name);
for (User user : userList) {
System.out.println(user);
}
sqlSession.commit();
sqlSession.close();
}
- 将SQL语句写死,使用 ‘%${name}%’(外面的引号也要要),不能直接使用 “%”#{name}"%",会报错
- MAPPER.XML
<select id="getUserLike" resultType="com.thhh.pojo.User">
select * from mybatis.user where name like '%${name}%'
</select>
- 测试
@Test
public void getUserLike(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
String name = "李";
List<User> userList = mapper.getUserLike(name);
for (User user : userList) {
System.out.println(user);
}
sqlSession.commit();
sqlSession.close();
}
可见两种方法效果相同,但是对比之下,个人觉得第二种更好,这样不用对方法调用处传递的参数做出拼接的要求