CRUD:
增删改在接口的返回值可以是int也可以是void
查询必须设置结果集:
resultType设置成java类(全限定名或别名)
resultMap自定义映射,可以一对多或多对一
btw:当结果集与接口对应不上时,接口类在IDEA中是灰色的,所以在select的对应中应该也判断了结果集类型。
PACKAGE标签引入mappers:
在<mappers>标签中可以使用package 和 mapper标签,mapper就对应一个实现文件,package可以对应该文件夹下的所有文件。
并且package还可以用于<aliases>标签下,将整个包下的类的别名自动转换成类名。
Mybatis获取参数值的两种方式
${}和#{}
${}的本质是字符串拼接
会被sql注入,需要自己添加单引号,写字面值会被运算
#{}的本质是占位符
不会被sql注入
参数为单个字面量类型时
大括号内可以使用任意名获取参数值
参数为多个字面量类型时
大括号内用{arg0,arg1...argN-1}或{param1,param2,param3...paramN}
参数为单个Map类型时
大括号内用该map的key获取对应的value
参数为单个实体类型时
大括号内用该类的变量名获取对应的value(实际上是get方法对应的名字)
接口类中有@param(“key”)注解
使用注解中的key来拿到value
使用param注解时,仍然可以使用{param1...paramN},但不能用{arg0...argN-1}
<select> resultType的设置
查询一个实体类对象
resultType设为实体类名
当查询出多个结果时,会直接报异常
查询多个实体类对象
resultType扔设为实体类名
但是接口的函数声明中要用List包住实体类
查询基本类型
mybatis在配置文件中为基本类型内置了别名
有包装类时int、integer对应Integer类型 _int、_integer对应int类型,以此类推。
string对应String,map对应Map。
也可以写全类名:java.lang.Integer
查询没有对应实体类的结果时
可以用map作为结果集
单条结果:
字段名为key,字段值为value放入map
多条结果:
在接口的函数声明中用List包住map
或者在函数声明前使用MapKey(“字段名”)注解,用注解标注使用哪个字段当key,将每个查询出来的单条map放入一个大的map集合中。该字段不能重复。
当可以使用#{}时尽量使用#,但有些特殊的sql需要使用${}
特殊的sql:
模糊查询
select * from user where username like '%#{}%'
不行,#{}会在编译时变成?,又因为问号放在了单引号内会解析为字符串,不会当做占位符,无法替换
解决方案
1.select * from user where username like '%${}%'
用${}字符串拼接,但是不防止sql注入问题
2.select * from user where username like concat('%',#{},'%')
用concat进行拼接
3.select * from user where username like "%"#{}"%"
用双引号,可以快速拼接,与2类似
批量删除
sql语句为
delete from user where id = a or id = b
或者
delete from user where id in (a,b,c,...,n)
其中,a,b,c不能用#{}代替,只能用${}代替
动态更改表名时
select * from tableName
此时的tableName不能用#{},因为#{}会在外面添加单引号导致sql解析错误
标签:map,实体类,笔记,学习,sql,Mybatis,where,对应,select From: https://www.cnblogs.com/darkpar/p/16643025.html