目录
#{ }和${ }
参数处理
入参-parameterType
使用Map
使用Bean / List<Bean>
使用多参数
@Param注解(命名参数)
出参-resultType
返回Map / List<Map>
返回Map<String,Map>
属性名不一致-resultMap结果映射
#{ }和${ }
如果查找 carType=#{carType},carType=${carType}
#{}:底层是PreparedStatement实现,会先编译再拼接。
变成:type =' ',再把值传进去,即 type=' 燃油车 '。
${}:底层是Statement实现,会先拼接再编译
变成type=燃油车,会出现语法错误,因为燃油车应该添加单引号,'${carType}'
使用${}
1、给sql语句传关键字(asc|desc)
<select> select * from car order by carNum ${key} </select>
2、sql语句字段拼接,字段名例如:字段+日期
<select> //传入date select * from monster_${date} </select>
3、批量删除,有两种写法in和or(动态sql)
<delete> //传入字符串 “1,2,3” delete form monster where id in (${ids}) </delete>
4、模糊查询
<select> //在jdbc中,'%?%'中的?不会被识别为占位符 //传入name select * from `monster` where `name` like '%${name}%' like concat('%',#{name},'%') like "%"#{name}"%"使用较多 </select>
参数处理
入参-parameterType
使用Map
#{} 里写的是map集合的key,如果key不存在不会报错,数据库表中会插入NULL
使用Bean / List<Bean>
#{} 里写的是get方法的方法名去掉get之后将剩下的单词首字母变小写
getAge对应的是#{age},get方法不存在会报错。
使用多参数
List<Student> selectByNameAndSex(String name, Character sex);
<select id="selectByNameAndSex" resultType="student"> select * from t_student where name = #{name} and sex = #{sex} </select>
name参数找不到,可用的参数包括[arg1, arg0, param1, param2]
在底层会创建一个map集合,以arg0/param1为key,以方法上的参数为value
Map<String,Object> map = new HashMap<>(); map.put("arg0", name); map.put("arg1", sex); map.put("param1", name); map.put("param2", sex); // 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2} // 其本质就是#{map集合的key}
@Param注解(命名参数)
List<Student> selectByNameAndAge(@Param(value="name") String name
, @Param("age") int age);
List<Student> stus = mapper.selectByNameAndAge("张三", 20);
stus.forEach(student -> System.out.println(student));
@Param("这里填写的其实就是map集合的key")
出参-resultType
返回Map / List<Map>
当返回的数据,没有合适的实体类,可以采用Map集合接收
只有一条数据,则返回一个Map集合即可
@MapKey("id")
public List<Map<String,Object>> find(Map<String, Object> map);
<select id="find" parameterType="map" resultType="map">
select * from `monster` where `id` > #{id} and `salary` >= #{salary}
</select>
@Test
public void m4() {
Map<String, Object> map = new HashMap<>();
map.put("id",3);
map.put("salary",1000);
List<Map<String,Object>> monsterlist = monsterMapper.find(map);
for (Map<String, Object> monsterMap : monsterlist) {
// 方式一
// Set<String> keys = monsterMap.keySet();
// for (String key : keys) {
// System.out.println(key+ " " + monsterMap.get(key));
// }
// System.out.println("===========");
// 方式二
for(Map.Entry<String,Object> entry : monsterMap.entrySet()) {
System.out.println(entry.getKey()+ " " + entry.getValue());
}
System.out.println("=========");
}
}
返回Map<String,Map>
@MapKey("id")
public Map<Integer,Map<String,Object>> findAll();
@Test
public void find() {
HashMap<String, Object> map = new HashMap<>();
map.put("type","women");
Map<Integer, Map<String, Object>> all = monsterMapper.findAll(map);
System.out.println(all);
}
属性名不一致-resultMap结果映射
select查询后,某些字段为null,是因为Bean的字段名和表的字段名不一致
第一种(常用)
resultMap:
id:这个结果映射的标识,作为select标签的resultMap属性的值。
type:结果集要映射的类。可以使用别名。主键使用id标签<id property="id" column="id"/>提高效率,其他都是<result>
当属性名和数据库列名一致时,可以省略。但建议都写上。
<resultMap id="carResultMap" type="car">
<id property="id" column="id"/>
<result property="useremail" column="user_email"/>
<result property="username" column="user_name"/>
</resultMap>
<select id="selectAllByResultMap" resultMap="carResultMap">
select * from t_car
</select>
第二种
在写sql语句的时候写别名,跟Bean的字段名保持一致
第三种
开启驼峰命名自动映射
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
前提:
java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名规范
sql命名规范:全部小写,单词之间采用下划线分割