mybatis中的resultMap与resultType,傳參數#,$區別

来源:互联网 发布:中央四台网络电视 编辑:程序博客网 时间:2024/05/31 13:17

Map:映射;Type:Java类型

resultMap 与 resultType、parameterMap 与  parameterType的区别在面试的时候被问到的几率非常高,项目中出现了一个小bug,所以来共同回顾下几个东西:

resultMap表示将查询结果集中的列一一映射到bean对象的各个属性。映射的查询结果集中的列标签可以根据需要灵活变化,并且,在映射关系中,还可以通过typeHandler设置实现查询结果值的类型转换,比如布尔型与0/1的类型转换。

 

 resultType 表示的是bean中的对象类,此时可以省略掉resultMap标签的映射,但是必须保证查询结果集中的属性 和 bean对象类中的属性是一一对应的,此时大小写不敏感,但是有限制。

推荐使用resultMap而非resultType。

 ParameterMap和resultMap类似,表示将查询结果集中列值的类型一一映射到java对象属性的类型上,在开发过程中不推荐这种方式。

       一般使用parameterType直接将查询结果列值类型自动对应到java对象属性类型上,不再配置映射关系一一对应,例如上述代码中下划线部分表示将查询结果类型自动对应到hdu.terence.bean.Message的Bean对象属性类型。

推荐使用parameterType而非parameterMap。


1、关于mybatis的文件一般都是其mapper文件出错:

首先关于输入参数parameterType出错:

(1)基本数据类型:如果输入参数只有一个,其数据类型可以是基本数据类型,也可以是自己定的类型:包括int,String,Date,Integer这些。

但是要注意,在接口中的 int类型对应parameterType为int,若前面声明的是  Integer类型,则后面mapper文件中也要写Integer类型,否则报错。     

 

//注意这里传递的类型:从controller传递过来的是Integer则,这个mapper中的parameterType必须是Integer
//若从Controller传递过来的是int,则mapper中parameterType必须是int。两者不能互用。

这个必须与controller层传递过来的类型一致。

另外在oo编程中,声明变量,能用包装类就用包装类,比如用Integer,而不用int。

int默认为0,Integer默认null。

持久层对象或者Controller、Service、Dao中用Integer。Mapper文件中用Integer

循环体,方法中用int。

 

                                             

这里回顾下java的基本数据类型:

基本数据类型和包装类的区别还是很大,这点估计你也是清楚的。
比如int a = 3;Integer b = new Integer(3);
a和b的值都是3,但a是值对象,b是引用对象,因此二者是不等同的。相较而言值对象使用起来更方便一些(不用手动创建对象已经实例化)

char是字符型,比如 char c = 'd',这里用的是单引号,字符串用的是双引号(String s = "s"),
它并不是整数类型,只不过jdk会对照ascII表把它转成对应的数字值,我们才可以利用这个特性。
在一般的开发中我们用String比较多而char比较少,因为char的场景多半都可以用string来处理,但这并不是说char就没有作用。只不过取决于与你编写代码的严谨程度。
另外在处理buffer流时用的都是char。
再次强调char不是整数类型,char(字符类型)在内存中占2个字节,而int(整数类型)占4个字节

关于String与char的关系:

 (2)复杂数据类型:包含java实体类或者多个参数,或者Map

关于多个参数传入有两种方法:仔细看下面的区别:

Map参数示例:

a:一种是将两个字段封装成map来进行传递给mapper文件。

xml文件

<select id="selectTeacher" parameterType="Map" resultType="com.myapp.domain.Teacher">      select * from Teacher where c_id=#{id} and sex=#{sex}  </select>  

 java代码  

复制代码
Map<String,String> map=new HasMap<String,String>();  map.put("id","2");  map.put("sex","男");  List<Teacher> tList = teacherMapper.selectTeacher(map);    for (Teacher entityTemp : tList) {        System.out.println(entityTemp.toString()); }  
复制代码

 

b:第二种传入多个参数的方式:使用注解的方式来传入:

另外MyBatis还提供了一个使用注解来参入多个参数的方式。

这种方式需要在接口的参数上添加@Param注解

示例:

接口方法

public List<Teacher> selectTeacher(@Param(value="id") String id,@Param(value="sex") String sex); 

XML文件

复制代码
<select id="selectTeacher" parameterType="map",这里可以写也可以不写resultType="com.myapp.domain.Teacher">

select * from Teacher where c_id=#{id} and sex=#{sex}
</select>
这个xml文件中,
 
复制代码




关于面试中还有一个经常问的就是${}与#{}的区别:

使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是

select * from table where name = ‘小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的,

目前来看,能用#就不要用$,

mybatis中的#和$的区别

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

3. #方式能够很大程度防止sql注入。 

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名. 

6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 忆苦思甜什么意思 总裁思甜妻 忆苦思甜怎么接下一句 丁思甜 陆令山秦思甜免费 忆苦思甜饭 忆苦思甜是什么意思 思甜甜品怎么样 忆苦思甜下一句是什么 思甜 妻令如山总裁思甜妻 妻令如山陆令山秦思甜 虐渣指导手册ii思甜工作室 海思科 海思科股票 思科路由器 思科股票 思科模拟器 锐思科 海思科股吧 思科交换机 瑞思科 思科培训 思科证书 思科裁员 思科服务器 思科市值 思科网址 海思科医药集团股份有限公司 思科网络技术培训 思科认证要多少钱 思科模拟器下载 思科三层交换机 兴城海思科招聘信息 考思科认证多少钱 思科交换机重启命令 思科网络安全认证 美国思科公司 思科无线路由器 sike 中国的s view