Mybatis
一款优秀的持久层框架,用于简化JDBC开发
框架
半成品软件,是一套可重用的、通用的、软件基础代码模型,在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
三层架构
- 表现层: 页面
- 业务层: 实现功能
- 持久层: 与数据库相关
JDBC缺点
- 硬编码
- 操作繁琐
使用步骤
- 导入依赖
- 编写核心配置文件
- 准备接口
- 编写映射配置文件(该文件的文件名、路径必须和接口一样,映射文件的namespace也必须和接口的文件名、文件路径一样)
- 根据接口配置sql语句
加载映射文件
方式1(加载sql映射文件)
<mapper resource="com/xlrong/mapper/xxx.xml"/>
方式2(Mapper代理方式)
<package name="com.itheima.mapper"/>
解决驼峰与下划线查询问题
- 字段起别名
sql
片段
select
<include refid="brand_cloumn" />
from tb_brand;
resultMap
id
: 完成主键字段的映射result
: 完成其他字段的映射
<result id="brandResultMap" type="brand">
<result column="brand_name" property="brandName" />
<result column="company_name" property="companyName" />
</resultMap>
- 开启驼峰命名
传参数
#{}
: 占位符${}
: 拼接字符串,存在sql
注入问题,表名或者列名不固定的情况下可以使用parameterType
: 用于设置参数类型,可以省略- 特殊字符
- 转义字符
<![CDATA[内容]]>
:CD
提示
多条件查询
- 散装参数:
@Param("test)int test
- 封装成对象
- 封装成
Map
动态SQL查询
<if>
标签<where>
标签<choose> <when> </when> </choose>
标签,类似于switch
Mybatis事物
openSession();
: 默认不开启事物openSession(true);
: 开启事物
批量查询
<foreach>
:mybatis
会自动将传进来的数组封装为一个map
,默认array = 数组/list = 集合
,可以使用@Param
注解修改该键名称
多参数底层
- 如果没有使用
@Parem
注解,每个参数会创建两个map
一个arg0
,一个param1
,以此类推
mybatis注解开发
可以实现简单的功能,和配置文件一样,配置文件怎么写,这里就怎么写
具体注解
- 查询:
@Select
- 修改:
@Update
- 删除:
@Delete
- 添加:
@Insert
映射关系
@Results
@Result
@ResultMap
注
- logback在maven中不用写配置文件,有默认的配置
<!--开启驼峰命名法-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<!--起别名-->
<!-- <typeAliases>将该包下的所有实体类起别名,不区分大小写 -->
<typeAliases>
<package name="work.xlrong.pojo"/>
</typeAliases>
-
_parameter
: 表示mybatis
中参数整体 -
只要返回值是基本数据类型,就可以不用写返回值类型
-
添加主键返回
useGeneratedKeys="true" keyProperty="列名"
arameter`: 表示 `mybatis` 中参数整体
* 只要返回值是基本数据类型,就可以不用写返回值类型
* 添加主键返回
```java
useGeneratedKeys="true" keyProperty="列名"
Mybatis转义符
- 或者直接使用CDATA区:
<![CDATA[ >= ]]>
MybatisPlus
公共字段自动填充
MybatisPlus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值
使用它的好处就是可以统一对这些字段进行处理,避免了代码重复
实现步骤
- 在实体类的属性上加入@TableField注解,指定自动填充的策略
@TableField(fill = FieldFill.DEFAULT) // 默认不处理
@TableField(fill = FieldFill.INSERT) // 插入时填充字段
@TableField(fill = FieldFill.UPDATE) // 更新时填充字段
@TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新时填充字段
- 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现
MetaObjectHandler
接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入操作时自动填充
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
metaObject.setValue("字段1", 数据1);
metaObject.setValue("字段2", 数据2);
metaObject.setValue("字段3", 数据3);
...
}
/**
* 更新操作时自动填充
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
metaObject.setValue("字段1", 数据1);
metaObject.setValue("字段2", 数据2);
metaObject.setValue("字段3", 数据3);
...
}
}