(第5天)mybatis接口方法入参类型 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 方式能够很大程度防止sql注入。

继续学习mybatis的多参数传递

package com.chen.dao;

import java.util.List;

import com.chen.GoodsInfo;

public interface GoodsDao2 {
	/**
	 * 
	 * 1.单个的参数Mybatis不会做特殊处理
	 *     #{这里随便写什么都可以}    它都能把这里面的值取到
	 * 2.传入对象POJO(普通的java类)..
	 * 		#{对象的属性名称}
	 * 3.多个参数。
	 */
	//查询所有   (查询所有不需要参数)
	public List<GoodsInfo>  selAll();
	//查询单一  (返回的一定是个对象,而不是集合;需要参数)
	public GoodsInfo  selOne(String id);
	
	//新增
	public void insertGoods(GoodsInfo a);
	
	//修改
	public void updateGoods(GoodsInfo a);
	
	//删除
	public void deleteGoods(String id);
        
        //多条件查询(今天学习内容)
	public List<GoodsInfo> querylist(String name ,int id);
}

而今天重点关注 第3个---多个参数

GoodsInfoMapper.xml

 <!-- 多条件查询,传入多个参数。String name,char id -->
  <!-- 切记,标签id要与接口方法名相同,不然报错 -->
  <!-- 凡是查询语句,千万别忘记写resultType(返回结果类型) -->
  <select >
  		select * from goods  where name like '#{param1}%' and id=#{id}
    </select>

select * from goods where name like '牛%' and id =10
*查询数据库以"牛"开头的 ” 且id=10 *
(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

/Mybatis02/src/test/Start2.java

package test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.chen.GoodsInfo;
import com.chen.dao.GoodsDao;
import com.chen.dao.GoodsDao2;

public class Start2 {

	public static void main(String[] args) throws IOException {
		
		String resource = "mybatis-conf.xml";
		InputStream  inputStream = Resources.getResourceAsStream(resource);
		//创建SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		//true表示自动提交。否则需要使用commit方法才会提交。默认是false
		SqlSession session = sqlSessionFactory.openSession();
		
		//拿到接口的代理对象
		GoodsDao2 dao=session.getMapper(GoodsDao2.class);
		//拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)
		//因为接口方法里需要传入一个对象,所以
		GoodsInfo goods =new GoodsInfo();
		//然后给对象插属性
		goods.setId(123);
		goods.setName("超人");
		
		//dao.insertGoods(goods);
		//dao.updateGoods(goods);
		//dao.deleteGoods("123");
		List<GoodsInfo> list =dao.querylist("牛", 10);
		System.out.println(list.size());
		
		//如果上面不设置自动提交表单,那么就需要commit方法
		session.commit();
	}

}

完成这个后,运行

关键来了! ,系统会报错

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。
什么原因呢? 从提示信息来翻译,这个参数名并没被找到,可以使用的参数是[0,1,param1,param2],意思是说命名要在这4个中选择,}

原来,多参数传递,mybatis会做特殊处理

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

0是表示传入的第一个参数,1是表示传入的第2个参数; 或者,param1表示传入的第一个参数,param2表示传入的第2个参数

那么现在修改一下

 <!-- 多条件查询,传入多个参数。String name,char id -->
  <!-- 切记,标签id要与接口方法名相同,不然报错 -->
  <!-- 凡是查询语句,千万别忘记写resultType(返回结果类型) -->
  <select >
  		select * from goods  where name like '#{param1}%' and id=#{param2}
    </select>

然后换到主入口类 运行一下

但问题又出现了,又新出现报错

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

那么经过琢磨我来告诉你为什么

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。
把# 换成$ 试试

运行一下主类

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

结果出来了,1代表查到了一行数据 。 记住 1 个对象 代表1行数据 。而 现在这个对象 LIst 泛型数组里 保存着。 所以,,list.size() 就是里面有多少个对象的意思。

现在说下,为什么会这样?

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

那么,#{} 和${} 有什么区别?

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

比如说用#{},和 ${}传参的区别,
使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是
select * from table where name = ‘小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的,
另外一种场景是,如果你要做动态的排序,比如 order by column,这个时候务必要用${},因为如果你使用了#{},那么打印出来的将会是
select * from table order by 'name' ,这样是没用,
目前来看,能用#就不要用$,
mybatis中的#和$的区别

  1. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
  2. 方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名. 
6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
Mybatis中$和#的区别简单小结
前不久,有人来我们公司面试,我们的经理问道了这个问题,我也是一知半解,所以就去百度了一番。
其实区别很简单的,举个例子大家就会明白的。写一句SQL-例如:select * from user_role where user_code = "100";
这句话而言,需要写成 select * from ${tableName} where user_code = #{userCode}
所以,$符是直接拼成sql的 ,#符则会以字符串的形式 与sql进行拼接。

高级补充知识点

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

<select >
     <!-- 
          #{}默认采用预处理的方式去处理SQL语句。。。
          ${}是采用非预处理模式来处理数据。。 
     -->
  		select * from goods  where name like '${sb}%' and id=#{nb}
    </select>

这样Map的key值名字,你都能随便设置

继续补充额外知识点,直接传入Map类型

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

(第5天)mybatis接口方法入参类型
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
方式能够很大程度防止sql注入。

结束