Mybatis的传参方式
【摘要】 Mybatis的传参方式
Mybatis-使用@Param传参(推荐)
多个参数,使用@Param命名参数,在形参定义的前面加入@Param("自定义参数名称")
接口
List<User> selecMulitParamtUser(@Param("myid") int id, @Param("myadress") String address);
在mapper文件使用
使用@Param(“参数名”) String name
<!-- 使用@Param传参 -->
<select id="selecMulitParamtUser" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id=#{myid} and address=#{myadress};
</select>
测试类
//使用@Param命名参数
@Test
public void selecMulitParamtUser(){
SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();
UserDao dao =sqlSession.getMapper(UserDao.class);
//调用dao的方法,执行数据库的操作
List<User> users =dao.selecMulitParamtUser(2,"深圳");
users.forEach(user -> System.out.println(user));
}
Mybatis-java对象传参(推荐)
使用java对象传递参数,java的属性值就是sql需要的参数值。每一个属性就是一个参数。
语法格式:#{propert,javaType=”数据类型”,jdbcType=”数据类型名称”}
JavaType: 和jdbcType:
接口
/**
* 使用java对象传递参数
* 多个参数,使用java对象作为接口中方法的参数
*/
List<User> selecUserjavaType(User u);
Mapper
<!-- 多个参数,使用java对象的属性值,作为参数的实际值
使用对象语法:#{属性名,javaTpye=类型名称,jdbcTtpe=数据类型} 完整的语法格式,很少用
javaTpye:指java中属性的数据类型。
jdbcTtpe:在数据库中的数据类型
列:#{p_id,javaType=java.lang.Interge,jdbcType=int}
简化方式:#{属性名} ,javaType和jdbcType的值由Mybatis反射获取,不用手动提供
-->
<!--完整方式-->
<select id="selecUserjavaType" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id=#{p_id,javaType=java.lang.Interge,jdbcType=int}
and p_name#{p_name,javaType=java.lang.Interge,jdbcType=varchar}
and address#{address,javaType=java.lang.Interge,jdbcType=varchar}
and birth=#{birth,javaType=java.lang.Interge,jdbcType=date}
and gender=#{gender,javaType=java.lang.Interge,jdbcType=varchar};
</select>
<!--简化方式-->
<select id="selecUserjavaType" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id=#{p_id}
and p_name#{p_name}
and address#{address}
and birth=#{birth}
and gender=#{gender};
</select>
完整方式(理解原理)
简化方式
测试对象
//使用java对象传参
@Test
public void selecUserjavaType(){
SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();
UserDao dao =sqlSession.getMapper(UserDao.class);
User uParam =new User(2,"小红","深圳","2022-09-01","女");
List<User> users =dao.selecUserjavaType(uParam);
users.forEach(user -> System.out.println(user));
}
@Test
public void selecUserjavaTypeone(){
SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();
UserDao dao =sqlSession.getMapper(UserDao.class);
User uParam =new User();
uParam.setP_id(2);
List<User> users =dao.selecUserjavaTypeone(uParam);
users.forEach(user -> System.out.println(user));
}
Mybatis-按位传值
参数位置从0开始,引用参数语法#{arg位置},第一个参数是#{arg0},第二个是#{arg1}
注意:mybatis-3.3版本和之前的版本使用#{0},#{1}方式,从mybatis3.4开始使用#{arg0}方式。
//接口
/**
* 按位传值
*/
List<User> selectByPosition(int p_id,String gender);
//mapper,sql映射文件
<!-- 按位置传值-->
<select id=" selectByPosition " resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id=#{arg0} or gender=#{arg1};
</select>
Mybatis-占位替$换列名
//接口
/**
* 使用占位替换列名
*/
List<User> selecUserOeder(@Param("myid") int id, @Param("myadress") String address);
//Mapper
<!--使用占位替换列名-->
<select id="selecUserOeder" resultType="org.example.daomain.User">
SELECT * FROM TEST1 order by #{myadress};
</select>
//测试类
@Test
public void selecUserOeder(){
SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();
UserDao dao =sqlSession.getMapper(UserDao.class);
List<User> users =dao.selecUserOeder(2,"深圳");
users.forEach(user -> System.out.println(user));
}
#和$区别
#使用?在sql语句中做站位的,使用PreparedStatement执行sql,效率高
#能够避免sql注入,更安全
$不能使用占位符,是字符串拼接的方式,使用Statement对象执行sql,执行
$有sql注入的风险,缺乏安全性。
$可以替代表名或者列名
#:占位符,告诉mybatis使用实际的参数值代替。并使用PrepareStatement对象执行sql语句,#{..}代替sql语句的”?”。这样做,安全,迅速,是首选做法,防SQL注入。
$字符串替换,告诉mybatis使用$包含的”字符串”替换所在位置。使用Statement把sql语句和${..}的内容连接起来(String+拼接方式)。主要用在替换表名,列名,不同列排序等操作。
Mybatis-Map传参(不推荐)
Map传参不推荐
Map集合可以存储多个值,使用Map想mapper文件一次传入多个参数
//接口
List<Student> selectMultiByMap(Map<String,Object> map);
//mapper,sql映射文件
<select id="selectMultiMap" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id=#{Mapp_id} or gender=#{gender};
</select>
//测试类
//使用map传值
@Test
public void selecMulitByMap(){
SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();
UserDao dao =sqlSession.getMapper(UserDao.class);
//
Map<String,Object> data = new HashMap<>();
data.put("Mapp_id",2);
data.put("gender","女");
//调用dao的方法,执行数据库的操作
List<User> users = dao.selectMultiMap(data);
users.forEach(user -> System.out.println(user));
}
Map<String,object> data =new HashMap<>();
Date.put(“name”,”张三”);
Data.put(“age”,15);
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)