mybatis__使用#,$传入多个参数 && 返回数据 && 主键回写

本文详细介绍了Mybatis中使用#和$传入多个参数的区别,推荐使用#来防止SQL注入。同时,讨论了如何处理返回数据,包括resultType和resultMap的使用,以及解决属性名与字段名不一致的问题。最后,阐述了主键回写机制,提供了两种主键回写的方法,适用于不同的数据库环境。

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

Mybatis的底层是JDBC,关于JDBC的操作,我们都知道有PreparedStatement (预处理)和Statement这两个,PreparedStatement可以防止SQL注入的危险,而在Mybatis中,传入参数的两种方式#{参数}、KaTeX parse error: Expected 'EOF', got '#' at position 6: {参数}。#̲对应的是采用PreparedS…{参数}对应的是Statement的方式。推荐使用#的方式。
相关用法:

使用#{}传入多个参数

如果Mapper接口中有多个参数,无论参数名是什么,在Mapper.xml文件中,参数都是arg0、arg1…或者param1、param2…
如果非要使用自己的参数名,可以通过@Param注解自定义
EmpMapper接口

public Integer addEmp1(String ename,String job) throws IOException;
	public Integer addEmp2(String ename,String job) throws IOException;

采用#传入多个参数,在接口中对应的方法内有多个参数,无论参数名是什么,在Mapper.xml文件中,参数都是arg0、arg1…或者param1、param2…

<insert id="addEmp1">
		insert into emp(ename,job)values(#{arg0},#{arg1})
	</insert>
	
	<insert id="addEmp2">
		insert into emp(ename,job)values(#{param1},#{param2})
	</insert>

如果非要使用自己的参数名,可以通过@Param注解自定义

public Integer addEmp4(@Param("ename")String ename,@Param("job")String job) throws IOException;
<insert id="addEmp4">
		insert into emp(ename,job)values(#{ename},#{job})
	</insert>

这边要说明一下,如何接口中对应的方法传入的参数是pojo对象,而映射文件里的是该对象的属性,则可以直接使用属性名

public Integer addEmp(Emp emp) throws IOException;
<insert id="addEmp" parameterType="emp">
		insert into emp(ename,job)values(#{ename},#{job})
	</insert>

##使用传入多个参数如果使用{}传入多个参数 如果使用使,需要在Mapper种指定参数名字,如果没有指定@Param注解就会报错

public Emp getEmpById(@Param("empno")Integer empno) throws IOException;
<select id="getEmpById" resultType="emp"> 
		select * from emp where empno=${empno}   
	</select>

这里如果使用$,只是单纯的指定@Param注解,进行新增和修改等DML操作,还是会报错

##包装类
pojo

public class UserWrapper {

	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}

映射文件

<!-- 从包装对象中获取信息 包装对象的别名. 取信息 -->
<insert id="addUser4" parameterType="UserWrapper">
	insert into t_user(name,age,favorites)values(#{user.name},#{user.age}
	,#{user.favorites})
</insert>

不建议使用Map做参数。

##返回数据

###resultType
 对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本数据类型即可。
  如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。

接口:

public Emp getEmpById(@Param("empno")Integer empno) throws IOException;

public List<Emp> selEmp() throws IOException;

映射文件:


<select id="getEmpById" resultType="emp"> 
		select * from emp where empno=${empno}   
	</select>

<select id="selEmp" resultType="emp" resultMap="baseMap"> 
		select * from emp   
	</select>

###resultMap
resultMap主要用来解决属性名和字段名不一致以及一对多、一对一查询等问题 字段名不一致时,首先可以通过取别名解决.

pojo

package com.zsl.pojo;

import java.util.List;

public class Emp {
	private Integer empno;
	private String ename;
	private String job;
	private Integer mgrA;//这里与数据库字段名称不同,数据库字段为mgr
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷学习被我发现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值