mybatis知识
mybatis起着连接Java程序与数据库之间的关系,我们在进行项目开发的过程中,需要定义实体类对应数据库表中的字段,那么在mybatis语句中,什么情况下要用实体类属性名,什么时候需要用到数据库字段名?
记住一条铁律即可:
MyBatis 里凡是带
#{}
、${}
或 表达式的地方,一律写 Java 实体类中的属性名;凡是直接写在 SQL 语句里的,一律写数据库表的列名(或别名)。
下面为大家举一些例子:
场景 写实体类属性还是表字段? 示例 #{}
占位符✅ 实体类属性 #{userName}
${}
拼接✅ 实体类属性 ${orderBy}
<if test="">
表达式✅ 实体类属性 <if test="status != null">
SQL 语句中的列名 ✅ 表字段或别名 SELECT user_name FROM t_user
SQL 语句中的表名 ✅ 表名 FROM t_user
resultType
/resultMap
的 column✅ 表字段或别名 <result column="user_name" property="userName"/>
举个完整的例子:
表结构
CREATE TABLE clazz (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
begin_date DATE,
end_date DATE
);
实体类:
public class ClazzQueryParam {
private String name; // 对应表列 name
private LocalDate begin; // 对应表列 begin_date
private LocalDate end; // 对应表列 end_date
}
Mapper文件:
<select id="list" resultType="com.xxx.Clazz">
SELECT
id,
name,
begin_date, <!-- 表字段 -->
end_date
FROM clazz
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%') <!-- #{name} 用实体属性 -->
</if>
<if test="begin != null and end != null">
AND begin_date BETWEEN #{begin} AND #{end} <!-- #{begin} / #{end} 用实体属性-->
</if>
</where>
</select>