dao层接口向mapper.xml中的sql传递了一个带有@tablename和@tableField的实体类,sql中的where语句的 mv.GMSFHM = #{gmsfhm,jdbcType=VARCHAR} and mv.RKGLZXLBDM = 0 <if test="sjgsdwdm != null and sjgsdwdm != ''"> AND ga.JZZ_GAJGDM = #{sjgsdwdm} </if> 参数名和实体类的一样
时间: 2024-04-03 21:35:14 浏览: 19
这是一个比较常见的 DAO 层接口向 Mapper XML 中的 SQL 语句传递参数的方式。其中,@tablename 和 @tableField 是用于动态生成 SQL 语句的注解,通常在实体类中使用。例如,在 Mapper XML 中,#{gmsfhm,jdbcType=VARCHAR} 会将 DAO 层接口中传递的 gmsfhm 参数传递给 SQL 语句中的 mv.GMSFHM,而 <if test="sjgsdwdm != null and sjgsdwdm != ''"> 会判断 sjgsdwdm 参数是否为 null 或者空字符串,如果不是,则将 SQL 语句中的 AND ga.JZZ_GAJGDM = #{sjgsdwdm} 语句拼接进去,否则不会拼接。在实际开发中,这种方式可以通过动态生成 SQL 语句来适应不同的业务需求,提高了代码的复用性和灵活性。
相关问题
mapper.xml.vm详细
以下是 MyBatis-Plus 代码生成器中生成的 Mapper XML 模板(mapper.xml.vm)的详细说明:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<mapper namespace="$!{mapperPackage}.${tableInfo.mapperName}">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="$!{tableInfo.entityName}">
<id column="$!{tableInfo.keyColumn}" property="$!{tableInfo.keyProperty}" />
#foreach($field in $tableInfo.fields)
<result column="$!{field.column}" property="$!{field.property}" />
#end
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
#foreach($field in $tableInfo.fields)
$!{field.column},
#end
</sql>
<!-- 插入数据 -->
<insert id="insert" parameterType="$!{tableInfo.entityFullName}">
insert into $!{tableInfo.tableName} (
#foreach($field in $tableInfo.fields)
$!{field.column},
#end
) values (
#foreach($field in $tableInfo.fields)
#{ $!{field.property},jdbcType=$!{field.jdbcType}},
#end
)
</insert>
<!-- 更新数据 -->
<update id="update" parameterType="$!{tableInfo.entityFullName}">
update $!{tableInfo.tableName}
<set>
#foreach($field in $tableInfo.fields)
<if test="$!{field.property} != null">
$!{field.column} = #{ $!{field.property},jdbcType=$!{field.jdbcType}},
</if>
#end
</set>
where $!{tableInfo.keyColumn} = #{ $!{tableInfo.keyProperty},jdbcType=$!{tableInfo.keyJdbcType}}
</update>
<!-- 删除数据 -->
<delete id="delete" parameterType="$!{tableInfo.keyJdbcType}">
delete from $!{tableInfo.tableName} where $!{tableInfo.keyColumn} = #{ $!{tableInfo.keyProperty},jdbcType=$!{tableInfo.keyJdbcType}}
</delete>
<!-- 查询单条数据 -->
<select id="selectById" resultMap="BaseResultMap" parameterType="$!{tableInfo.keyJdbcType}">
select <include refid="Base_Column_List" /> from $!{tableInfo.tableName} where $!{tableInfo.keyColumn} = #{ $!{tableInfo.keyProperty},jdbcType=$!{tableInfo.keyJdbcType}}
</select>
<!-- 分页查询数据 -->
<select id="selectPage" resultMap="BaseResultMap" parameterType="com.baomidou.mybatisplus.extension.plugins.pagination.Page">
select <include refid="Base_Column_List" /> from $!{tableInfo.tableName} where 1=1
#if($strategy.validTablePrefix && $strategy.tablePrefix != "")
and $!{tableInfo.tableName}.table_name like '${strategy.tablePrefix}%'
#end
#if($strategy.validFieldPrefix && $strategy.fieldPrefix != "")
and $!{tableInfo.tableName}.column_name like '${strategy.fieldPrefix}%'
#end
order by $!{tableInfo.keyColumn} asc
limit #{offset}, #{limit}
</select>
</mapper>
```
该模板中包含了常见的增删改查操作的 SQL 语句模板,以下是详细说明:
- `<resultMap>`:定义了映射结果的规则,包括将数据库中的列名映射到 Java 实体类中的属性名;
- `<sql>`:定义了通用的查询结果列;
- `<insert>`:定义了插入数据的 SQL 语句模板,包括表名、列名和值;
- `<update>`:定义了更新数据的 SQL 语句模板,包括表名、列名、值和条件(主键);
- `<delete>`:定义了删除数据的 SQL 语句模板,包括表名和条件(主键);
- `<select>`:定义了查询数据的 SQL 语句模板,包括表名、列名和条件(主键、分页等)。
以上 SQL 语句模板中的变量均通过 MyBatis-Plus 代码生成器中的变量替换功能实现,具体实现方式可以参考 MyBatis-Plus 代码生成器的源代码。
那结果类可以给属性写@TableField代表某个表的属性吗,还有类上的@TableName,是不是就不能写了
对于结果类,通常不需要使用`@TableField`和`@TableName`注解来表示某个表的属性或表名。这些注解主要用于实体类与数据库表的映射关系。
在关联查询的结果类中,你可以直接定义与查询结果字段对应的属性,而无需使用`@TableField`注解。因为关联查询的结果不一定对应于某个单独的表的属性,所以这些注解在结果类中没有意义。
以下是一个示例结果类的定义:
```java
public class Result {
private String fieldA;
private int fieldB;
private Date fieldC;
// 构造方法、getter和setter等省略
}
```
这样定义的结果类可以用于保存关联查询的结果。在mapper中使用`resultMap`来映射查询结果到该结果类。通过这种方式,你可以在查询时获取到关联查询结果的自定义类对象。