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 浏览: 133
这是一个比较常见的 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 代码生成器的源代码。
怎么读取带有@tablename注解的类的数据
在MyBatis中,当你需要从数据库读取数据并且某个实体类(通常带有`@Table`或`@TableName`注解)作为结果集的目标,你可以按照以下步骤操作:
1. **创建实体类**:首先,在Java中定义一个实体类(通常是Java Bean),例如 `User.java`,并使用`@Table`或`@TableName`注解指定对应的数据库表名:
```java
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
@TableName("user_table")
public class User {
@TableId
private Long id;
@TableField("username")
private String username;
// 其他字段...
}
```
2. **编写Mapper接口**:在对应的Mapper接口中,使用`@Select`、`@Insert`等注解指定SQL语句,并使用泛型指定返回值类型(这里是`List<User>`):
```java
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("SELECT * FROM ${tableName}")
List<User> selectAllUsers();
}
```
3. **注入Mapper**:在Service或Repository类中通过`@Autowired` 注入UserMapper实例:
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectAllUsers();
}
}
```
4. **调用方法获取数据**:通过Service层的`getAllUsers()`方法即可读取到数据库中存储的用户数据。
阅读全文