使用通用Mapper需要注意的地方

1、自己自定义的Mapper.xml中不能使用和通用mapper中同名的接口

2、如果POJO对象名和数据库中实际的表名不同,一定要在POJO对象中使用@Table(name = "t_test_course"),否则使用insertUseGeneratedKeys插入会报表(小写字母开头的POJO对象名)不存在。

3、tk.mapper(通用mapper)出现的问题:Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvider.dynamicSQL)
java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.SpecialProvider.<init>()

解决方案:

将SpringBoot 启动类中的@MapperScan 注解引入的包由

org.mybatis.spring.annotation.MapperScan

替换成:

tk.mybatis.spring.annotation.MapperScan

引入的依赖为:

<!-- MyBatis 通用 Mapper -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

4、mybatis insertUseGeneratedKeys 返回主键为null

解决方案:

建表的时候主键名定义为id,否则不会返回主键 && 主键字段属性id上一定要加上@Id

/**
 * JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
 *
 * TABLE:使用一个特定的数据库表格来保存主键。 
 * SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
 * IDENTITY:主键由数据库自动生成(主要是自动增长型) 
 * AUTO:主键由程序控制。
 */
@Id
//@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

 

### Java MyBatis Mapper Include Usage and Examples MyBatis 提供了一种强大的功能,即 `<include>` 标签,用于在 SQL 映射文件中重用 SQL 片段。通过这种方式可以减少重复代码,提高可维护性和一致性。 #### 使用 `<sql>` 定义可重用片段 可以通过 `<sql>` 标签定义一段 SQL 代码,并为其指定一个唯一的 `id` 属性以便后续引用。例如: ```xml <sql id="userColumns"> ID, USERNAME, PASSWORD, EMAIL, CREATED_AT </sql> ``` 此部分定义了一个名为 `userColumns` 的 SQL 片段,包含了用户表中的列名列表[^1]。 #### 在其他 SQL 中使用 `<include>` 一旦定义好了 `<sql>` 片段,就可以通过 `<include>` 标签将其嵌入到其他的 SQL 查询中。以下是几个常见的例子: ##### 示例 1:查询所有用户信息 假设有一个场景需要查询所有的用户数据,则可以在 SELECT 语句中引入之前定义好的列名集合: ```xml <select id="selectAllUsers" resultType="User"> SELECT <include refid="userColumns"/> FROM USERS </select> ``` 这里利用了 `<include>` 来代替手动输入每一列的名字,从而简化了代码结构[^1]。 ##### 示例 2:动态条件查询 当面对复杂的业务逻辑时,可能需要用到动态拼接 WHERE 子句的情况。此时也可以借助 `<if>` 和 `<where>` 配合 `<include>` 实现灵活的组合查询: ```xml <sql id="dynamicWhereClause"> <where> <if test="username != null">USERNAME = #{username}</if> <if test="email != null">AND EMAIL = #{email}</if> </where> </sql> <select id="findUserByConditions" parameterType="map" resultType="User"> SELECT <include refid="userColumns"/> FROM USERS <include refid="dynamicWhereClause"/> </select> ``` 在这个例子中不仅复用了列的选择还加入了动态生成的过滤条件。 #### 注意事项 虽然 `<include>` 能够极大地提升开发效率,但在实际应用过程中也需要注意一些细节问题: - **命名冲突**:确保不同地方使用的 `refid` 不会发生名称上的碰撞。 - **性能考量**:过度依赖于通用模板可能导致某些特定情况下无法针对具体需求优化SQL语句。 另外值得注意的是,如果项目采用了更高层次的技术栈比如 MyBatis Plus ,那么其内置的一些特性可能会覆盖原始 mybatis 功能实现方式 [^3] 。所以在升级或切换工具链的时候要特别留意这些变化带来的影响。 ```python # Python 示例仅作说明用途,与当前主题无关 def example_function(): pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值