Mvaen框架
#{}与${}的区别【面试】
#{} 可以防止sql注入
会对sql语句进行预编译|解析,传递什么参数进来,仅仅是顶替占位#{}而已一般使用的都是这个#{}
#{}
背后会自动的拼接上 ' '
${}不能防止sql注入
不会对sql语句进行预先编译,传递什么参数进来,不会仅仅认为这数据,会和sql语句做拼接之后再解析SQL语句 ' or '1=1'
一般比较少用这个,能使用#{}就先使用这个#{}
${} 不会拼接上 ' ' 所以有时候,我们需要做一些order by 这样的列名指定,需要的是准确的列名,而不是 '列名'
如果只有一个简单参数的话,那么名字只能用${} 里面只能写value, 不能使用其他的名字一般来说,只要 #{} 能用的,基本都用它,只要它不能用的时候,再想想这个 ${}
#和$区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 数据库 类型转换
#{}可以有效防止 sql 注入
#{}可以接收简单类型值或 pojo 属性值
如果 parameterType 传输单个简单类型值(String,基本类型), #{} 括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换.
${}不能防止 sql 注入
${}可以接收简单类型值或 pojo 属性值
如果 parameterType 传输单个简单类型值.${}括号中只能是 value
parameterType:
路径
传递简单类型(基本数据类型)
传递 pojo 对象: Mybatis 使用 ognl 表达式解析对象字段的值, #{}或者${}括号中的值为 pojo 属性名称。
传递 pojo 包装对象类型 :
对象里面的属性是一个对象,嵌套或者是套娃的模式
1. 去参数的时候,使用#{对象属性名.子属性即可} : #{user.username}
2. 如果内部的子属性还是一个对象,那么接着继续往下 . 即可
传递多个参数
在方法的参数上打上注解@param
如果方法有传递多个参数的必要,那么通常有四种写法来实现:
使用#{0} , #{1} , #{2} ... 来获取指定位置的参数。 0 表示第一个参数,1表示第二个参数。阅读性差。
使用注解@param来给参数起名字。然后在xml里面使用#{参数的别名}取值
可以使用一个Map集合来封装这些数据,然后传递map集合进去。直接写 #{KEY}
可以使用一个javaBean来包装这些数据,然后传递javabean的对象进去。 直接写 #{属性名}
传递多个参数
1. 当传递多个参数的时候,需要给参数加上注解 @param("别名") 起别名。
2. 在映射文件中使用 #{别名} 来取参数的值。
resultType:
路径
输出简单类型:
如果返回简单的类型,那么resultType只要写这个类型即可 : 简写的别名即可
输出pojo对象 : 直接写当前pojo类的全路径名或别名
输出pojo列表 : 如果返回的是一个集合的类型,那么resultType写的是集合里面的元素类型可以写全路径名,也可以写别名!
resultMap结果类型 :
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询列名和javaBean的属性名不一致,那么数据就不能封装到对象的属性身上,要解决这个问题,有两种办法:
a. 把查询出来的列名,给它起别名,让这个别名和我们的JavaBean的属性名一样即可!
b. 使用resultMap来做列和属性的映射设置!
核心配置文件:
properties 引入properties文件的
创建properties文件
使用 <properties resource="文件的路径"/>
使用 ${key}来取值
typeAliases(类型别名) (注:写在properties 标签后面,他们是同级标签)
在Dao映射文件里面 直接写类(pojo)的名字, 不需要写类全限定名了
typeAlizses标签下 注:只作用在映射文件中的结果和参数里面
Package标签-----起别名,包下面的所以类
typeAlias标签---起别名(单个取别名)
Mapper标签:
引入Dao映射文件的
mapper resource/class给单个映射文件登记
package给多个即dao包下的xml映射文件登记