1.#{}与${}的区别
#{}是占位符,是采用预编译的方式向sql中传值,可以防止sql注入如果我们往sql中传值,可以使用这个,例如这个delete语句
${}将内容直接拼接到sql语句中,一般不用于传值,可以当作列名,加上单引号可以传值直接拼在sql语句中,例如排序,分组,需要在定义方法的时候加上注解@param
当作列名
当作列名跟在group by后面
2.mybatis关联查询
关联查询
关联查询就要使用resultmap标签,让数据库的数据与java对象中的属性一一印射,
<resultMap id="findadmin" type="admin">
<id column="adminid" property="id"></id>
<result column="adminaccount" property="account"></result>
</resultMap>
<select id="findadmin" resultMap="findadmin">
select id adminid,account adminaccount from admin
</select>
使用resultmap标签对查询结果进行自定义印射
type="admin"返回值类型
<id column="adminid" property="id"></id> id主键印射
<result column="adminaccount" property="account"></result> 普通列名印射
例如查询学生表与专业表
关联查询时一般都要写association标签在resultmap标签里面,关联查询时,id,num,name,gender等都要书写上,mybatis默认出现关联查询如果不写的话就不能将数据库的数据印射到java对象中。单表查询的话自定义印射可以不用书写。
印射的过程就是对这段代码的封装。
嵌套查询
查询出来的表结构也发生了变化,但是最终的结果不变
进行了两次查询,可以理解为进行了两次单表查询,但是将关联条件当作第二次查询的条件。
一对多数据封装,在major对象里面有学生集合,学生集合为list,类型是学生类型
查询的结果有多条时,mybatis会自动对数据进行封装的major类型的集合里面。
一对多关联查询
注解查询,简单查询或者单张表查询可以使用,因为注解查询sql语句是用字符串形式拼接的,所以有时候书写可能会比较麻烦,简单的sql查询可以使用,稍微难的不建议使用。
动态sql
动态sql,在sql查询中增加逻辑判断
if标签中的test属性条件成立就会执行if标签里面的标签体
where 标签当if标签里面条件成立时,where标签会动态删除if标签里面的and or关键字保证sql语句正确性
trim 当条件成立时可以自定义前缀关键字和后缀关键字
prefix="where" 前缀where关键字
prefixOverrides="and|or" 覆盖指定的关键字(and或者or)
Choose标签 choose标签必须与when标签一块使用,otherwise可以省略,
可以理解为if else ,可以没有else必须要有if,if判断里面为true则都会执行,trim会自动添加前缀和自动省略一些关键字
Set标签 修改数据可以使用此标签,他可以自动覆盖掉sql语句中的逗号
Student类定义时num属性为int类型,java会自动给num赋值为0,建议以后定义使用integer,直接使用null即可。
删除学生 foreach循环
item="id" 每次循环的数据赋给这个id
collection="array" 循环的数据类型,数组array,集合list
open="(" 开始的标志
separator="," 两次循环间用逗号隔开
close=")" 结束的标志
通过列名查询学生信息,传递值一般用#{},传递列名一般使用${}