#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。
#{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value
count(1)会统计包括null值的所有符合条件的字段的条数。
count(0)将返回表格中所有存在的行的总数包括值为null的行,
然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)
distinct 列名,得到的结果将是除去值为null和重复数据后的结果 。
Count(列名) 一列中包含值的个数,不包含空值,而count(*)中包含空值
对比下两个执行计划我们可以发现是完全一样的,这也就说明count(*)和count(1)的执行效率是完全一样 的,根本不存在所谓的单列扫描和多列扫描的问题。
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
Count(0)
count(1)
Count(*)
结论:Count(0)最快,count(1)最慢
resultType:直接表示返回类型,包括基础数据类型和复杂数据类型。
resultMap 则是对外部 resultMap 定义的引用,对应外部 resultMap 的 id,表示返回结果映射到哪一个 resultMap 上。它的应用场景一般是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 @ApiOperation("返回底纹") @RequestMapping(value = "/inputBox", method = RequestMethod.GET) public Response queryInputBox (Integer type) { return new Response().buildSuccess(channelService.findAllInputBox(type)); } @Override public List<String> findAllInputBox (Integer type) { List<String> list=new ArrayList<>(); int cnt=channelMapper.countByTypeAndStatus(type,true ); if (cnt!=0 ){ list.add(channelMapper.findDefaultBox(type)); }else { list=channelMapper.findListByType(type,cnt); } return list; } Integer countByTypeAndStatus (Integer Type, Boolean status) ; List<String> findListByType (Integer type, Integer cnt) ; String findDefaultBox (Integer type) ; <select id="countByTypeAndStatus" resultType="Integer" > select count (0 ) from search_inputbox_config where type =#{type} and status=true </select> <select id="findListByType" resultMap="string" > select name from search_inputbox_config where type=#{type} and status=true order by level ASC limit #{cnt} </select> <select id="findDefaultBox" resultType="string" > select name from search_inputbox_default where type=#{type} </select>