springboot--06

一、根据 ID 查询

1. 基础 SQL 与接口

sql

复制代码
-- SQL语句
select * from emp where id = 19;

java

运行

复制代码
// Mapper接口方法
@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);

2. 问题:字段与属性名不匹配

  • 数据库字段:dept_idcreate_timeupdate_time(下划线命名)
  • 实体类属性:deptIdcreateTimeupdateTime(驼峰命名)
  • 结果:默认情况下,MyBatis 无法自动封装这些不匹配的字段值。

二、数据封装的三种解决方案

方案 1:SQL 中给字段起别名

在查询语句中,将下划线字段起别名,使其与实体类属性名一致:

java

运行

复制代码
@Select("select id, username, password, name, gender, image, job, entrydate, " +
        "dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id}")
public Emp getById(Integer id);

✅ 优点:实现简单,无需额外配置❌ 缺点:每次查询都要手动写别名,代码冗余


方案 2:使用@Results@Result注解手动映射

java

运行

复制代码
@Results({
    @Result(column = "dept_id", property = "deptId"),
    @Result(column = "create_time", property = "createTime"),
    @Result(column = "update_time", property = "updateTime")
})
@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);

✅ 优点:一次配置,注解可复用,SQL 语句更简洁❌ 缺点:需要额外编写注解配置


方案 3:开启驼峰命名自动映射(推荐)

application.properties中添加配置:

properties

复制代码
# 开启下划线到驼峰的自动映射:a_column → aColumn
mybatis.configuration.map-underscore-to-camel-case=true

✅ 优点:一劳永逸,无需修改 SQL 或添加注解,MyBatis 自动完成映射❌ 缺点:需要全局配置,适合项目中统一使用驼峰命名的场景


三、条件查询

1. 错误示例(存在 SQL 注入)

java

运行

复制代码
// 不推荐:使用${}拼接字符串,存在SQL注入风险
@Select("select * from emp where name like '%${name}%' and gender = #{gender} " +
        "and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

2. 正确示例(使用预编译,安全高效)

java

运行

复制代码
// 推荐:使用concat函数拼接模糊查询,结合#{}参数传递
@Select("select * from emp where name like concat('%', #{name}, '%') and gender = #{gender} " +
        "and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
  • 说明:concat('%', #{name}, '%') 可以安全实现模糊查询,同时利用预编译防止 SQL 注入。

四、XML 映射文件规范

当 SQL 语句较复杂时,推荐使用 XML 映射文件管理 SQL:

  1. 同包同名 :XML 文件名与 Mapper 接口名一致,且放在与 Mapper 接口相同的包下(如com.itheima.mapper.EmpMapper对应resources/com/itheima/mapper/EmpMapper.xml
  2. namespace 绑定 :XML 的namespace属性值为 Mapper 接口的全限定名
  3. 方法绑定 :XML 中<select>标签的id属性值与 Mapper 接口方法名一致,resultType为返回结果的实体类全限定名

示例 XML:

xml

复制代码
<mapper namespace="com.itheima.mapper.EmpMapper">
    <select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp where name like concat('%', #{name}, '%') and gender = #{gender}
        and entrydate between #{begin} and #{end} order by update_time desc
    </select>
</mapper>
相关推荐
野生技术架构师16 分钟前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
爱吃火鸡面呀18 分钟前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
奥莱维26 分钟前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
牛大兵35 分钟前
机顶盒获取局域网已经使用IP,开放的端口号,扫描摄像头,NAS,共享主机等开机自启局域网全量扫描工具
数据库·网络协议·tcp/ip
知行产研40 分钟前
中国矿山无人驾驶出海的三重门
数据库·mysql·php
l1258651 小时前
# RAG低延迟架构设计:从5秒到500ms的优化全链路
数据库·人工智能·python·langchain
RisunJan1 小时前
Linux命令-vgdisplay(显示卷组详细属性)
linux·运维·数据库
爱和冰阔落2 小时前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
JacksonMx2 小时前
企业级 JPA 与数据库架构落地指南
数据库·数据库架构
Dxy12393102162 小时前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql