通过parameterType指定输入参数的类型,类型可以是简单类型,pojo,包装类型,hashmap。
#{}实现向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符。
使用占位符可以防止sql的注入,在使用时不需要关心参数的类型,mybatis会自动的进行Java与jdbc的转换。#{} 可以接受简单类型和pojo的属性值。如果parameterType中指定的是单个的简单类型,#{}中可以使用value或是其他值。
#{}与${}的不同:
通过${}可以将parameterType传入的内容拼接在sql中,并且不进行jdbc类型转换,${}可以接受简单类型和pojo的属性值,若parameterType为单个简单类型时,${}中必须使用value。使用${}不能防止sql注入,但有时会很方便,例如:
再比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:
ORDER BY${columnName}
如果使用#{}将无法实现此功能。
开发中通过pojo传递查询条件,查询条件是综合的查询条件时,不仅包含用户的查询条件,而且包含其他的查询条件,这时可以使用包装对象类型传递参数。
1. 定义包装类型对象:
public class QueryVo {
private User user;
//自定义用户扩展类
private UserCustom userCustom;
2.mapper.xml文件:
说明 :mybatis底层是通过ognl从pojo中获取属性值:#{userCustom.sex} ,userCustom即是传入的pojo包装对象的属性值。 queryVo即是上面包装对象的别名。
1.mapper.xml文件:
2.测试文件:
public void findUserListHashmap() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
//通过session自动创建mapper代理对象
UserMapper userMap = session.getMapper(UserMapper.class);
Map map = new HashMap();
map.put("sex", "1");
map.put("name","小明");
List list = userMap.findUserListHashmap(map);
System.out.println(list);
}
1.mapper.xml文件:
输出简单类型时,必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。使用session中的selectOne可进行查询单条记录。
1.mapper.xml
(方法调用selectOne)
(方法调用selectList)
输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。
返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List
输出类型可以改为hashMap,输出的字段名作为key,输出的字段值为value
ResultType可以指定pojo,将查询结果映射成pojo的属性。但是要求数据库列名与pojo属性名必须相同,才能映射成功。
如过查询的字段名与pojo的属性名不同,则通过resultMap,将字段名和属性名做一个映射,resultMap实质上,还是将数据库字段映射到pojo中。
resultMap可以实现将查询结果映射为复杂类型的pojo。如:在查询结果映射对象中,包括pojo和list实现一对一和一对多的查询。
例子:
实现下面一个sql的输出结果的参数映射:
select id,id_ ,name, name_ from user where id=#{id}
User类中属性名和上面查询的列名不一样。
定义ResultMap:
ResultMap中参数的含义:
type:定义映射的最终类型。 id:引用时的标识
id:表示查询结果集中唯一标识。 column:查询出来的列名。 property:type指定的pojo类中的属性名。
reslut:对普通列的标识。
通过mybatis提供的标签进行动态的sql拼接。
mybatsi的核心,对sql语句进行灵活的操作,通过表达式进行判断,对sql进行灵活的拼接、组装。
可以对输出参数进行判断,若果输入参数不为空,或是符合条件才进行sql拼接。
将上面动态sql判断代码块抽取出来,组成一个sql片段。其他的statement可以对其引用。
and user.sex=#{userCustom.sex}
and user.username LIKE '%${userCustom.username}%'
引用sql片段:
向sql传递数组或者List,Mybatis使用foreach解析:
例如:
1.在输入参数类型中添加List
public class UserQueryVo {
private UserCustom userCustom;
private List ids;
2.mapper.xml: