持久层
操作数据存储的层
与什么数据库无关
与什么技术无关
ORM
O(Object)R(Relationship)M(Mapping)对象关系映射
MyBatis框架是一款持久层的ORM框架
MyBatis与JDBC的关系
Mybatis的底层是JDBC,基于反射技术在运行时调用JDBC,实现数据库编程
苞米豆(baomidou)
MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/
Mybits-Plus与SpringBoot的关系
Mybatis-Plus框架能够与Spring框架无缝整合
学习一门框架
1、搭建环境
(1)安装哪些依赖(三方库)
1、创建项目时选择这三个依赖
2、添加JSP依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<scope>provided</scope>
</dependency>
(2)需要哪些配置
3、配置maven打包web目录(写在pom.xml的build标签中,把plugins折叠起来,写在plugins后面)
<resources>
<resource>
<directory>src/main/web</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
4、配置jsp文件的前缀和后缀(写在resources/application.properties配置文件中)
spring.mvc.view.prefix=/jsp/
spring.mvc.view.suffix=.jsp
5、对application.properties文件进行修改(Mybatis-Plus基础配置参数)
(3)框架提供了哪些API,怎么用
2、如何应用
3、研究它的底层
Mybatis-Plus替代了原生的JDBC
代码写在工程的哪个包里面
dao包:用原生的jdbc写,包名就叫dao
mapper包:用mybatis-plus框架写,包名建议叫mapper(模块子包,小于等于启动类)
在mapper子包中定义接口
在xml文件中编写SQL语句
xml文件写在resources目录中
设置xml文件头
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
xml文件格式
SQL语句写在mapper标签里面
下载MybatisX,设置mapper和xml建立关系
在Idea的插件市场搜索并安装MybatisX插件
实现接口与xml绑定后快速访问
检查接口中的抽象方法在绑定xml文件中是否有对应标签绑定
File->Settings->Plugins->MarketPlace
在启动类中实现@MapperScan("mapper包的全路径")注解
如何拿到框架创建的Mapper接口的实现类?
拿不到(因为没有物理文件,它存在于JVM内存中)
如何拿到框架创建的Mapper接口的实现类的对象?
框架说:实现类你拿不到的,对象我帮你创建好放在内存中,你直接拿对象
public class UserMapperImpl implements UserMapper{
@Override
public int insert(User user) throws Exception{
根据接口的绑定关系寻址xml文件
根据方法的绑定关系寻址绑定的SQL语句
获取连接
预编译SQL
填充参数
执行SQL
}
}
UserMapper userMapper=new UserMapperImpl();
不需要在启动类中写代码,在test里写
需要打印SQL语句,可以在application.properties配置文件中添加
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
修改数据库的SQL语句
Mybatis写SQL语句的几种方式
1、在绑定xml文件中写
<insert></insert>
<update></update>
<delete></delte>
<selectt></select>
2、不需要xml文件,使用注解写
@Insert
@Delete
@Update
@Select
动态SQL语句还是在xml文件中写比较方便
3、不绑定xml文件,继承官方的BaseMapper接口
实体类中需要写的:
@TableName("映射表名") -->写在实体类的类名上一行
@TableField("映射字段名") -->写在实体类和父类的每一个字段名的上一行
@TableId(value="映射主键名",type=IdType.AUTO) -->写在父类的主键名的上一行
BaseMapper的17种SQL语句
public interface BaseMapper<T> extends Mapper<T> {
//1、未写的字段在SQL语句中默认为空
int insert(T entity);
//2、serializable是接口,根据id删除
int deleteById(Serializable id);
//3、根据任意条件删除,传一个hashmap给deleteByMap,将参数作为hashmap的key
//HashMap<String,Object> map=new HashMap();
//map.put("mobile","12525536433");
//--底层是where mobile='12525536433'
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
//4、略过
int delete(@Param("ew") Wrapper<T> queryWrapper);
//5、根据id删除
//传一个Arraylist给deleteBatchIds方法
//List<Integer> idList=new ArrayList();
//idList.add(10);
//idList.add(11);
//底层是where id in(10,11)
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
//只有语句为null的才不会出现在SQL语句中
int updateById(@Param("et") T entity);
//略过
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
//根据id查询一条完整的数据
T selectById(Serializable id);
//根据一个ArrayList的id批量查询数据
//传一个Arraylist给deleteBatchIds方法
//List<Integer> idList=new ArrayList();
//idList.add(10);
//idList.add(11);
//底层是where id in(10,11)
//返回一个list
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
//根据hashmap来查,我们传一个hashmap给selectByMap,它根据我们给的hashmap作为条件查
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
//
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
//
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
//
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
//
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
//
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
//
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
//
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
Wrapper SQL子句构造器父类
1、QueryWrapper<T> 作为where条件的构造器
2、UpdateWrapper<T> 作为set子句的构造器
IPage分页器
1、Page类
不同数据库的分页语句不一样,你需要告诉框架你用的是什么数据库
MySQL:limit ?,?
Oracle:基于rownum做子查询
在启动类中添加下面的方法,即可告诉mybatis,我们使用的是MySQL数据库
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
安装lombok依赖(安装依赖后,我们不需要在实体类中手写getter、setter、toString方法),它自己会帮我们写
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>