mysql 中mybatis 传参与返回参数

本文介绍MyBatis中参数传递与返回值处理的方法,包括如何正确设置参数类型以避免错误,以及如何实现插入操作后获取自增长的主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传入参数必须与配置文件中标明的参数一致

<select id="findByBookId" parameterType="java.lang.Integer" resultType="com.ichrono.rysmart.chronoline.bean.model.SportsBookFile">
select * from <include refid="tableName"/> t
where t.book_id=#{bookId}
</select>
传入String、Long等会报错

<select id="findByBookId" parameterType="java.lang.Long" resultType="com.ichrono.rysmart.chronoline.bean.model.SportsBookFile">
select * from <include refid="tableName"/> t
where t.book_id=#{bookId}
</select>
传入Integer 也会报错,不能自动转型


对于映射的model 类,如果数据库中的字段类型能够转型到model类的字段类型,那么就不会报错,否则则会报错
如数据库字段为 Int类型,则model类对应的字段可以为String 可以为Long 等。
如果数据库中字段为varchar 且存取的数据可以转化成int 或long等,则也不会报错,
否则会报错。

mybatis 插入和更新只返回行数,不能返回主键
只能通过以下方式:

<insert id="insert" parameterType="cn.softsea.model.DicCity" >
<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" >
SELECT LAST_INSERT_ID()
</selectKey>
insert into Dic_City (City_Code, Provinces_Code,
State_Code, City_Name, PY_Code,
PY_Code_Short, Ext1, Ext2,
Ext3, Ext4, Ext5)
values (#{cityCode,jdbcType=VARCHAR}, #{provincesCode,jdbcType=VARCHAR},
#{stateCode,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{pyCode,jdbcType=VARCHAR},
#{pyCodeShort,jdbcType=VARCHAR}, #{ext1,jdbcType=VARCHAR}, #{ext2,jdbcType=VARCHAR},
#{ext3,jdbcType=VARCHAR}, #{ext4,jdbcType=VARCHAR}, #{ext5,jdbcType=VARCHAR})
</insert>
调用Mapper返回主键:
//生成新对象用于插入
DicCity city = new DicCity();
city.setCityCode("330100");
city.setCityName("杭州市");



//获取mapper对象
DicCityMapper cityMapper = (DicCityMapper) SpringContextUtil.getBean("dicCityMapper");

int row = cityMapper.insert(city); //insrt不再返回主键,只返回响应行数,这点和ibatis不同了

System.out.println("响应的行数:"+row);
//取得自增的标识列 ID的值
System.out.println("新插入的数据的ID:"+city.getId());

另:再解释一下selectKey 的 order="BEFORE"时,表示 selectKey 中的语句先执行,接着再执行insert语句,这用于oracle的sequence方式获取主键。

mysql 中用after id自动生成后 获得id ,返回回去。

数据库中字段 映射到map字段,取出时类型必须一致,否则报错
mysql数据库 日期可以传String

mysql 中表字段 限定了小数位数 ,即使存储的是整数,则查询的model里相应字段 仍然带有小数
比如 数据库字段 Decimal 长度 5 小数点 2
存储 70 则model里映射的是70.00
### 如何使用 MyBatis Mapper 执行 MySQL 存储过程 MyBatis 提供了强大的 SQL 映射功能,可以方便地执行存储过程。下面是一个完整的例子来展示如何通过 MyBatis 的 `Mapper` 接口调用 MySQL 中定义好的存储过程。 #### 定义 MySQL 存储过程 假设有一个名为 `get_user_by_id` 的简单存储过程用于获取指定 ID 用户的信息: ```sql DELIMITER $$ CREATE PROCEDURE get_user_by_id(IN user_id INT, OUT first_name VARCHAR(255), OUT last_name VARCHAR(255)) BEGIN SELECT fname, lname INTO first_name, last_name FROM users WHERE id = user_id; END$$ DELIMITER ; ``` 此存储过程中有两个输入参数:一个是 IN 类型的 `user_id`, 另外两个是 OUT 参数用来返回查询的结果[^1]. #### 创建对应的 Java Bean 和 Mapper Interface 为了映射数据库表结构,在应用程序中创建相应的实体类 `User.java`. ```java public class User { private Integer userId; private String firstName; private String lastName; // Getters and Setters... } ``` 接着编写一个接口形式的 Mapper 文件 `UserMapper.java`: ```java import org.apache.ibatis.annotations.Param; public interface UserMapper { void callGetUserById(@Param("userId") int userId, @Param("firstName") String firstName, @Param("lastName") String lastName); } ``` 注意这里使用了 `@Param` 注解给方法形参命名以便于在 XML 配置文件里引用这些名称作为占位符. #### 编写 MyBatis XML Mapping File 最后一步是在 `UserMapper.xml` 中声明具体的 SQL 语句以及如何处理存储过程的入参与输出结果集: ```xml <mapper namespace="com.example.mapper.UserMapper"> <!-- 调用存储过程 --> <select id="callGetUserById" parameterType="map" statementType="CALLABLE"> { CALL get_user_by_id( #{userId,jdbcType=INTEGER,mode=IN}, #{firstName,jdbcType=VARCHAR,mode=OUT}, #{lastName,jdbcType=VARCHAR,mode=OUT}) } </select> </mapper> ``` 上述代码片段展示了如何利用 `{}` 来包裹整个 CallableStatement 表达式,并指定了各个参数的方向 (`IN`, `OUT`) 和 JDBC 类型. 当一切设置完毕之后就可以像平常那样注入并使用该 Mapper 对象来进行业务逻辑操作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值