其他分享
首页 > 其他分享> > Mybatis-5

Mybatis-5

作者:互联网

一.MyBatis的参数处理

1.单参数处理

1)接口

AdminMapper {
    Admin selectAdminByName(String name);
}

2)映射文件

    SELECT FROM admin WHERE name=#{name}

3)测试内容

testSingleParam()
{
    SqlSession sqlSession=MyBatisUtil.();
    AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.);
    Admin admin=adminMapper.selectAdminByName();
    .info(admin);
    MyBatisUtil.(sqlSession);
}

4)观察控制台效果

20200702_142909_780.png

通过控制台的观察,大家发现输出的SQL语句使用了占位的方式,JDBC中SQL如果要输入参数有两种方式

4.1)可以通过拼接SQL语句方式来完成

4.2)通过?占位的方式来完成

如果在MyBatis中你使用了#{}的方式,那么它就是占位的方式

#{key}这个key的内容,如果是单参数,MyBatis限制的很宽松,只要类型一样的就行了,不管名称取成什么都是可以的

2.多参数处理

2.1 通过@Param方式来指定参数名称

如果写的多个参数,这个时候发现并没有找到

20200702_145325_736.png

20200702_145245_647.png

MyBatis的规定,如果是多个参数,这个时候,可以使用 arg0,arg1,arg2.....argN或者param1,param2,param3...paramN
如下所示就可以了
<select id="selectAdminByNameAndAge" resultType="admin">
   SELECT * FROM admin WHERE name LIKE concat('%',#{arg0},'%') AND age>#{arg1}
</select>

<select id="selectAdminByNameAndAge" resultType="admin">
   SELECT * FROM admin WHERE name LIKE concat('%',#{param1},'%') AND age>#{param2}
</select>

如上的这个规定时间上太死板了,不灵活,如果程序员自己要定义名称,需要通过@Param的注解来完成自己设置名称,如下所示


20200702_150052_866.png

2.2 通过实体对象来传值

 

AdminMapper {
    Admin selectAdminByName(String name);
    Admin selectAdminByNameAndAge(() String name, () age);
    Admin selectAdminByEntity(Admin admin);
    Admin selectAdminByMap(Map<String,Object> map);
}
    SELECT FROM admin WHERE name LIKE concat('%',#{name},'%') AND age>#{age}
testMultiParam2()
{
    SqlSession sqlSession=MyBatisUtil.();
    AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.);
    Admin entity=Admin();
    entity.setName();
    entity.setAge();
    Admin admin=adminMapper.selectAdminByEntity(entity);
    .info(admin);
    MyBatisUtil.(sqlSession);
}

 

 

 

通过实体对象来传值,实际上#{key}    key的值是和实体对象中的属性名要保持一致的

2.3 通过Map集合来传值

AdminMapper {
    Admin selectAdminByName(String name);
    Admin selectAdminByNameAndAge(() String name, () age);
    Admin selectAdminByEntity(Admin admin);
    Admin selectAdminByMap(Map<String,Object> map);
}
<select id="selectAdminByMap"  resultType="admin">
    SELECT * FROM admin WHERE name LIKE concat('%',#{},'%') AND age>#{}
</select>


@Test
public void testMultiParam3()
{
    SqlSession sqlSession=MyBatisUtil.createSession();
    AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.class);
    Map<String,Object> map=new HashMap<String,Object>();
    map.put(","s");
    map.put(,33);
    Admin admin=adminMapper.selectAdminByMap(map);
    logger.info(admin);
    MyBatisUtil.closeSession(sqlSession);
}

如果你使用的map作为参数的话,那么#{key}  key的值是和map中的键的值是相同的,这样就能绑定到一起了

如上三种方式来处理参数的传值的问题,实际上底层都使用map集合
这三种在实际开发中都有用途
一般参数不超过三个的请使用第一种,那么如果参数超过3个以上可以使用实体或者使用map都可以

上机练习:使用上一次建立商品表,现在完成如下操作,查询商品价格在200-700元之间,并且商品中有“机”的商品
要求:分别使用三种多参数处理的方式

二.关于${}和#{}取值问题
#{}这是就是JDBC中的预处理操作,PreparedStatement来完成预处理语句的执行操作,在预处理操作中使用?来占位,后续在赋值
${}这种方式JDBC中的拼接方式来完成
在使用${}完成查询的过程中,需要注意就是必须要在接口方法中参数前面带@Param(不管是一个参数还是多个参数)
在使用${}过程中会出现SQL注入,安全性低下,使用#{}不会出现SQL注入问题
两种方法都可以使用的情况下,我建议大家使用#{}的方式



1)例如排序不支持占位就不能使用#{},只能使用${}
2) 例如在分表操作中就不能使用#{},只能使用${}
3) ${}也可以完成#{}相同的功能,进行参数传递,只不过它需要外面带单引号('')
注意:${}可能会引发SQL注入,#{}不会

标签:map,name,Admin,admin,参数,Mybatis,AdminMapper
来源: https://www.cnblogs.com/qiao88/p/13785230.html