Mybatis基础操作
占位符:#{变量名}
注意事项:如果Mapper接口方法只有一个普通类型参数,属性名可以随便写
==> Preparing: delete from emp where id=?
==> Parameters: 1(Integer)
预编译SQL
不会将值直接放在SQL语句中,而是用占位符?代替
之后执行这条SQL语句,如果除了?其他相同,就可以直接拼接值执行
普通SQL语句执行流程
SQL语法解析检查->优化SQL->编译SQL->执行SQL
提供缓存:如果执行的语句在缓存中,可以跳过前三步
SQL注入:通过操作输入的数据来修改事先定义好的SQL语句
预编译SQL优点:
性能高(跳过前三步)
更安全(防止SQL注入)(传入的只会被理解为值不会认为是SQL语句的一部分)
在mybatis中#{}和${}都可以表示占位符
但是效果不同
#{}:将#{}替换为?生成预编译SQL,会自动设置参数值
传参数时使用
${}:拼接SQL,将参数直接拼接在SQL中,存在SQL注入问题
对表名,列表进行动态设置时使用
#{}会自动类型转换,因此不需要加引号
主键返回:
在数据添加成功后,需要获取插入数据库数据的主键。
实现:
添加注解@Options(keyProperty=“id”,useGeneratedKeys=true)
数据封装
实体类属性名和数据库查询返回的字段名一致,Mybatis自动封装
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
解决方案一:
起别名:让别名与实体属性一致
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp where id=#{id}")
public Emp select(Integer id);
方案二:
通过@Results,@Result注解手动映射封装
@Results({@Result(column="dept_id",property = "deptId"),@Result(column="create_time",property = "createTime"),@Result(column="update_time",property = "updateTime")})@Select("select * from emp where id=#{id}")public Emp select(Integer id);
方案三:
开启mybatis驼峰命名自动映射开关
在properties中配置
@Select("select * from emp where id=#{id}")public Emp select(Integer id);
mybatis.configuration.map-underscore-to-camel-case=true
MySQL 用下划线命名是因为系统兼容性 + 数据库传统风格的双重原因,不是不能用驼峰,而是驼峰容易出错、不推荐。
所以命名并不是没用,严格按照数据库下划线,java驼峰
小点:#{}不能出现在’‘之内,因为会被?替代,在’'内会被认为是字符
可以使用${}直接拼接
XML映射文件
将SQL语句与java代码分别编写
规范:
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下
XML映射文件的namespace属性为Mapper接口全限定名一致
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
✅ 为什么把配置文件放在 resources 下?
Spring Boot 启动时默认会在 classpath 下找配置文件。
src/main/resources 会自动被打包到编译后的 target/classes/ 目录中,与 .class 文件在一起。
也就是说,它不是因为 Java 编译放进来了,而是因为资源目录本身就会被打包进 classpath。
使用注解还是XML:
注解:完成简单的增删改查
XML:实现复杂的SQL功能
mybatis动态SQL
通过标签实现
<if>:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接
<if test="name!=null">SQL语句
<if><where>:用于动态生成where(条件不为空生成),自动去除条件前面多余的and、or
<set>:自动去除语句后多余的, 用于更新语句<foreach>:
属性:
collection:遍历的集合
item:遍历的元素
separator:分隔符
open:遍历开始前拼接的SQL片段
close:遍历结束后拼接的SQL片段<sql>、<include>:提高代码复用<sql id="名字">SQL语句<sql>
<include refid="名字">