XML映射器配置文件中,SQL
语句传入参数的类型(parameterType
)有以下三种:(1)简单类型(包括:基本数据类型、String、Date等);(2)实体类(pojo)类型;(3)Map类型。
-
若传入参数(`parameterType`)为简单类型,则#{}预编译占位符中的形参与对应映射器接口函数的形参一一对应。
-
若传入参数(`parameterType`)为实体类(pojo)类型,则#{}预编译占位符中的形参与该实体类的成员变量一一对应。
-
若传入参数(`parameterType`)为Map类型,则#{}预编译占位符中的形参与该Map中键名(key)一一对应。
1、简单类型
简单类型主要包括:基本数据类型、String
、Date
等。
示例:在SQL
语句中传入简单类型,实现删除用户的功能,只需修改如下文件:
(1)UserMapper.java
文件:
package com.atangbiji.dao;
import com.atangbiji.pojo.User;
import java.util.List;
//映射器接口
public interface UserMapper {
//根据id删除一个用户
void deleteUser(int id);
//根据name查询用户
User getUserByName(String name);
}
(2)UserMapper.xml
文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间(绑定对应的映射器接口)-->
<mapper namespace="com.atangbiji.dao.UserMapper">
<!--根据id删除一个用户-->
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id}
</delete>
<!--根据name查询用户-->
<select id="getUserByName" parameterType="String" resultType="com.atangbiji.pojo.User">
select * from mybatis.user where name = #{name}
</select>
</mapper>
(3)UserMapperTest.java
文件:
package com.atangbiji.dao;
import com.atangbiji.pojo.User;
import com.atangbiji.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
public class UserMapperTest {
@Test
public void deleteTest(){
//1、从SqlSessionFactory中获取SqlSession对象
try(SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
//2、执行SQL语句
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
//3、提交事务
sqlSession.commit();
}
}
@Test
public void selectTest3(){
//1、从SqlSessionFactory中获取SqlSession对象
try(SqlSession sqlSession = MyBatisUtils.getSqlSession()){
//2、执行SQL语句
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserByName("阿汤");
System.out.println("根据name查询用户,查询结果为:");
//3、输出查询结果
System.out.println(user);
}
}
}
注:当传入参数(parameterType
)为int
、String
等简单类型时,传入参数可以省略不写。
2、实体类类型
示例:在SQL
语句中传入实体类(pojo)类型,实现插入用户的功能,只需修改如下文件:
(1)UserMapper.java
文件:
package com.atangbiji.dao;
import com.atangbiji.pojo.User;
import java.util.List;
import java.util.Map;
//映射器接口
public interface UserMapper {
//插入一个用户
void addUser(User user);
}
(2)UserMapper.xml
文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间(绑定对应的映射器接口)-->
<mapper namespace="com.atangbiji.dao.UserMapper">
<!--插入一个用户-->
<insert id="addUser" parameterType="com.atangbiji.pojo.User">
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
</mapper>
(3)UserMapperTest.java
文件:
package com.atangbiji.dao;
import com.atangbiji.pojo.User;
import com.atangbiji.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
public class UserMapperTest {
@Test
public void insertTest(){
//1、从SqlSessionFactory中获取SqlSession对象
try(SqlSession sqlSession = MyBatisUtils.getSqlSession()){
//2、执行SQL语句
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(4,"王二","111111"));
//3、提交事务
sqlSession.commit();
}
}
}
注:在实体类(pojo)已经定义好的情况下,如果传入参数(parameterType
)为实体类类型,那么就不能自定义#{}
占位符中形参的名称。
3、万能的Map类型
示例:在SQL
语句中传入Map
类型,实现插入和删除用户的功能,只需修改如下文件:
(1)UserMapper.java
文件:
package com.atangbiji.dao;
import com.atangbiji.pojo.User;
import java.util.List;
import java.util.Map;
//映射器接口
public interface UserMapper {
//插入一个用户
void addUser2(Map<String,Object> map);
//根据id删除一个用户
void deleteUser2(Map<String,Object> map);
}
(2)UserMapper.xml
文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间(绑定对应的映射器接口)-->
<mapper namespace="com.atangbiji.dao.UserMapper">
<!--插入一个用户-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd) values (#{userId},#{userName},#{usePassword})
</insert>
<!--根据id删除一个用户-->
<delete id="deleteUser2" parameterType="map">
delete from mybatis.user where id = #{userId}
</delete>
</mapper>
(3)UserMapperTest.java
文件:
package com.atangbiji.dao;
import com.atangbiji.pojo.User;
import com.atangbiji.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
public class UserMapperTest {
@Test
public void insertTest2(){
//1、从SqlSessionFactory中获取SqlSession对象
try(SqlSession sqlSession = MyBatisUtils.getSqlSession()){
//2、执行SQL语句
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("userId",4);
hashMap.put("userName","王二");
hashMap.put("usePassword","111111");
mapper.addUser2(hashMap);
//3、提交事务
sqlSession.commit();
}
}
@Test
public void deleteTest2(){
//1、从SqlSessionFactory中获取SqlSession对象
try(SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
//2、执行SQL语句
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("userId",4);
mapper.deleteUser2(hashMap);
//3、提交事务
sqlSession.commit();
}
}
}
注:
-
在实体类(pojo)已经定义好的情况下,如果传入参数(
parameterType
)为Map
类型,那么我们可以通过自定义Map
的键名(key
)的方式自定义#{}
占位符中形参的名称。 -
当映射器接口函数有多个形参时,我们往往需要将传入参数设置为
Map
类型(或者注解)。 -
由于传入参数为实体类型时,我们需要在执行
SQL
语句的时候new
一个该实体类的对象,并对其中所有的成员变量(字段)进行初始化。实际项目中,当实体类(pojo)的成员变量(即:数据库表的字段)非常多时,我们有时候并不需要将所有的字段都初始化。此时,我们往往可以将传入参数类型设置为Map
类型。 -
虽然传入参数为简单类型(包括:基本数据类型、String、Date等)和实体类(pojo)类型的标签,完全可以用传入参数为
Map
类型的标签替换,但我们往往并不会这样做。 -
传入参数为
Map
类型虽然万能,但不建议随便滥用。
原文始发于微信公众号(阿汤笔迹):MyBatis 中 SQL 语句传入参数的 3 种类型(详解)!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/213031.html