#{ }和${ } 、参数处理

目录

[#{ }和{ }](#{ }和{ })

参数处理

入参-parameterType

使用Map

[使用Bean / List](#使用Bean / List)<Bean>

使用多参数

@Param注解(命名参数)

出参-resultType

[返回Map / List](#返回Map / List)<Map>

返回Map<String,Map>

属性名不一致-resultMap结果映射


#{ }和${ }

如果查找 carType=#{carType},carType=${carType}

#{}:底层是PreparedStatement实现,会先编译再拼接。

变成:type =' ',再把值传进去,即 type=' 燃油车 '。

${}:底层是Statement实现,会先拼接再编译

变成type=燃油车,会出现语法错误,因为燃油车应该添加单引号,'${carType}'

使用${}

1、给sql语句传关键字(asc|desc)

XML 复制代码
<select>
  select * from car order by carNum ${key}
</select>

2、sql语句字段拼接,字段名例如:字段+日期

XML 复制代码
<select>
    //传入date
    select * from monster_${date}
</select>

3、批量删除,有两种写法in和or(动态sql)

XML 复制代码
<delete>
    //传入字符串 "1,2,3"
    delete form monster where id in (${ids})
</delete>

4、模糊查询

XML 复制代码
<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方法不存在会报错。

使用多参数

XML 复制代码
List<Student> selectByNameAndSex(String name, Character sex);
XML 复制代码
<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

java 复制代码
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注解(命名参数)

java 复制代码
List<Student> selectByNameAndAge(@Param(value="name") String name
                                , @Param("age") int age);
java 复制代码
List<Student> stus = mapper.selectByNameAndAge("张三", 20);
        stus.forEach(student -> System.out.println(student));

@Param("这里填写的其实就是map集合的key")

出参-resultType

返回Map / List<Map>

当返回的数据,没有合适的实体类,可以采用Map集合接收

只有一条数据,则返回一个Map集合即可

java 复制代码
    @MapKey("id")
    public List<Map<String,Object>> find(Map<String, Object> map);
XML 复制代码
<select id="find" parameterType="map" resultType="map">
        select * from `monster` where `id` > #{id} and `salary` >= #{salary}
</select>
java 复制代码
@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>

java 复制代码
@MapKey("id")  
public Map<Integer,Map<String,Object>> findAll();
java 复制代码
@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>

当属性名和数据库列名一致时,可以省略。但建议都写上。

XML 复制代码
<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的字段名保持一致

第三种

开启驼峰命名自动映射

XML 复制代码
<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

前提:

java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名规范

sql命名规范:全部小写,单词之间采用下划线分割

相关推荐
loser.loser4 小时前
QQ邮箱发送验证码(Springboot)
java·spring boot·mybatis
毅航7 小时前
Trae复刻Mybatis之旅(一):创建SqlSession会话,构建代理
后端·mybatis·trae
潮流coder8 小时前
mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因
java·tomcat·mybatis
BillKu10 小时前
Java + Spring Boot + Mybatis 实现批量插入
java·spring boot·mybatis
dog shit11 小时前
web第十次课后作业--Mybatis的增删改查
android·前端·mybatis
emo了小猫11 小时前
Mybatis #{} 和 ${}区别,使用场景,LIKE模糊查询避免SQL注入
数据库·sql·mysql·mybatis
yuren_xia20 小时前
Spring Boot + MyBatis 集成支付宝支付流程
spring boot·tomcat·mybatis
神仙别闹1 天前
基于Java(SpringBoot、Mybatis、SpringMvc)+MySQL实现(Web)小二结账系统
java·spring boot·mybatis
crud1 天前
Spring Boot 整合 MyBatis-Plus:从入门到精通,一文搞定高效持久层开发!
java·spring boot·mybatis
爱上语文1 天前
MyBatisPlus(3):常用配置
java·后端·mybatis