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解析错误