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解析错误
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?