文章目录
1. 什么是Mybatis?
一个半对象关系型映射(ORM)框架,内部封装jdbc,开发者只要注重如何编写SQL就行
可以严格控制sql执行性能,灵活度高
2. #{} ${}
- #{} 将sql中的#{}替换为? 可以有效防止SQL注入,将数据通过set方法注入到?中
- ${} 将字符串直接替换到sql语句中
3. mapper.xml/DAO
Dao中的方法不能被重载,
因为其中的方法查找sql的方式是通过namespace(类路径)+id(方法名)
不同的xml文件,id是可以重复的,因为查找的时候是将namespace+id作为map的key查找
有了namespace,id就可以重复,新版本namespace是必须存在的
4. mybatis一级,二级缓存
一级缓存: 基于hashmap进行本地缓存的,作用域为Session,默认打开
二级缓存: 机制相同,作用域为mapper(namespace),默认不打开
5. mapper接口调用要求
- mapper接口中的方法名,要和xml文件中的id相同
- 输入参数类型要和,sql中的输入type参数类型相同
- 输出的参数类型要和sql中输出type类型相同
- xml文件中的namespace是mapper接口类的类路径
6. 模糊查询 xml文件中怎么实现
- 在java代码中添加 % 通配符
- 在sql语句中拼接通配符,会引起sql注入
7. 实体类中的属性和表中的字段不一致
- 通过定义字段别名的方式
- 使用resultmap映射字段名
8. 获取自动生成的主键值
如果是自增主键,自动生成的主键值,会传入你传过来的参数对象中
9. mapper传递多个参数
- 使用#{0},#{1},会按照顺序获取参数
- 使用@param(“name”)在传递方法的参数上
- 封装成map传递map即可
10. 多表连接查询
需要使用resultMap映射字段名
11. MyBatisPlus逻辑删除,自动填充
11.1 逻辑删除
逻辑删除,修改该数据为不显示,而不是真正的删除
-
配置全局逻辑删除规则(可以省略)
mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml global-config: db-config: id-type: auto logic-delete-value: 1 # 1代表删除 logic-not-delete-value: 0 # 0代表不删除
-
配置逻辑删除的组件(可以省略)
-
给bean添加逻辑删除注解@TableLogic
pojo对象的属性,设置一个属性确定这个数据是否删除1代表不删除0代表删除
@TableLogic(value = "1",delval = "0")//这里可以定义是否删除,value代表不删除,delval代表删除 private Integer showStatus;
- 在pojo类中在逻辑删除的字段加注解@TableLogic,当这个字段值为0时,说明数据未被删除,提供给用户正常使用,当这个字段值为1是,说明数据已被删除,用户无法正常查到这条数据
这里删除代表的更新操作,更新数据库字段为0
11.2 自动填充
-
说明: 都会添加一下必要的属性, 但是每次都要写, 造成重复
-
将需要自动填充的数据, 公共抽取(抽取的父类需要序列化)
- 例如入库时间, 更新时间等
- 需要使用公共数据的对象, 直接继承该类即可
@Data //getset方法 @Accessors(chain=true) //getset方法返回对象本身,连点set public class BasePojo implements Serializable{ //序列化 @TableField(fill = FieldFill.INSERT) private Data created; //入库时候赋值 @TableField(fill = FieldFill.INSERT_UPDATE) private Data updated; //入库,更新时候赋值 }
-
编辑自动填充代码
@Component //交给spring容器管理 public class MyMetaObjectHandler implements MetaObjectHandler { //入库操作时,需要更新 创建事件/更新时间 @Override public void insertFill(MetaObject metaObject) { Date date = new Date(); this.setFieldValByName("created",date,metaObject); this.setFieldValByName("updated",date,metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updated",new Date(),metaObject); } }