Mybatis使用出错

本文介绍了一种使用MyBatis进行数据库查询时遇到的参数类型不匹配问题,具体表现为无法从Integer类型中获取systemId属性。文章详细解释了错误产生的原因,并提供了解决方案,即更改参数类型为包含相应属性的实体类。

代码:

 <!--查询Source记录,还有Source属于的部门-->
    <select id="selectAllSourceAndDepart"  resultMap="SourceAndDepart"  parameterType="java.lang.Integer">
        select *
        FROM net_source
         JOIN sys_depart ON sys_depart.depart_id = net_source.depart_id
         AND sys_depart.depart_stat != 0
        <if test="systemId != -1">
        
        </if>
        WHERE source_stat != 0
        ORDER BY net_source.depart_id
    </select>
传入了一个Integer的参数systemId,并且通过if判断。

报错:

Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'systemId' in 'class java.lang.Integer'
### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'systemId' in 'class java.lang.Integer'
错误原因:

if语句中的参数,mybatis将通过反射机制去parameterType里面去调用getter方法得到参数,但是Integer里面,明显没有systemId,所以无法得到。

解决办法:

将parameterType换成一个包含这个参数的实体类,并且拥有getter方法


### MyBatis 使用教程 #### 什么是 MyBatisMyBatis 是一款优秀的持久层框架,它支持定制化 SQL 查询、存储过程以及高级映射。通过 MyBatis 的接口设计模式,开发者可以轻松实现数据库操作。 --- #### 配置与初始化 在使用 MyBatis 之前,需要完成基础配置工作。这些配置通常位于应用程序的全局配置文件中(例如 Spring Boot 中的 `application.properties` 或 XML 文件)。具体来说,数据源以及其他核心设置可以通过如下方式指定[^3]: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password mybatis.mapper-locations=classpath:mapper/*.xml ``` 上述代码片段展示了如何在 Spring Boot 应用程序中配置 MySQL 数据库连接和 Mapper 映射路径。 --- #### Mapper 接口的设计 Mapper 接口是 MyBatis 的核心组件之一,用于定义抽象方法来对应具体的 SQL 操作。当调用某个 Mapper 方法时,MyBatis 将解析该方法名及其参数类型,并执行对应的 SQL 语句[^1]。 以下是创建一个简单 Mapper 接口的例子: ```java public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User findById(int id); @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})") void insertUser(User user); } ``` 在此示例中,`@Select` 和 `@Insert` 注解分别表示查询和插入操作。 --- #### 动态 SQL 支持 对于复杂的业务场景,静态 SQL 可能无法满足需求。此时可借助 MyBatis 提供的动态 SQL 功能构建灵活的查询条件。关于动态 SQL 的安装与基本用法,请参阅官方文档或相关指南。 下面是一个简单的例子,展示如何利用 `<if>` 标签生成条件过滤器: ```xml <select id="findUsers" resultType="User"> SELECT * FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> </select> ``` 此模板允许根据传入参数动态调整查询条件。 --- #### CRUD 操作详解 除了手动编写 SQL 外,还可以结合工具类简化开发流程。例如,在 MyBatis-Plus 扩展包的支持下,能够快速实现常见的增删改查功能[^4]。 ##### 插入记录 向表中新增一条数据可通过以下方式进行: ```java userMapper.insert(user); // 调用 BaseMapper 的默认方法 ``` ##### 删除记录 基于主键删除某条记录的操作也非常直观: ```java userMapper.deleteById(id); // 根据 ID 删除单条记录 userMapper.deleteBatchIds(Arrays.asList(1, 2, 3)); // 批量删除多条记录 ``` ##### 更新记录 更新现有实体的状态同样简便: ```java userMapper.updateById(updatedUser); // 修改特定对象的信息 ``` ##### 查询记录 最后,检索符合条件的数据集也十分便捷: ```java List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("status", "active")); // 构造复杂条件筛选活动状态下的用户列表 ``` 以上代码片段均来自 MyBatis-Plus 官方推荐的最佳实践。 --- #### LambdaQueryWrapper 实战技巧 如果希望进一步提升编码效率,则可以尝试引入 Lambda 表达式的语法糖——即 **LambdaQueryWrapper** 工具类[^2]。相比传统写法,这种方式更加简洁明了且不易出错。 举例而言,假设我们需要查找年龄大于等于 18 岁的所有男性用户,那么可以用如下形式表达: ```java List<User> maleAdults = userMapper.selectList( new LambdaQueryWrapper<User>() .ge(User::getAge, 18) .eq(User::getGender, Gender.MALE)); ``` 此处运用了函数式编程的思想,显著降低了硬编码属性名称带来的风险。 --- #### 总结 综上所述,掌握 MyBatis 的基础知识并不困难,只需熟悉其三大模块即可:配置管理、Mapper 编程模型以及动态 SQL 技术栈。与此同时,搭配像 MyBatis-Plus 这样的增强型框架还能大幅减少重复劳动成本,从而让整个项目周期变得更加高效可控。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值