一.初识mybatis框架
1.简单介绍
MyBatis是一个优秀的数据持久层框架,是一种半自动的ORM实现
前世今生: Mybatis前身是iBatis,是Apache的一个开源项目 2010年由Apache迁移到了Google Code,改名为MyBatis 2013年又迁移到Github
Mybatis官网:http://mybatis.org Github:https://github.com/mybatis
2.搭建mybatis框架环境
(1)步骤如下:
- 创建工程并添加Jar包(jar包下载地址:https://github.com/mybatis/mybatis-3/releases)
- 添加MyBatis核心配置文件
- 创建实体类
- 创建SQL映射文件
- 代码测试,输出结果
3.Mybaits框架的特点
开源的优秀持久层框架
面向配置编程
SQL语句与代码分离,方便维护
良好支持数据映射,结果处理方便
支持动态SQL语句
4.MyBatis框架配置扩展
(1)配置元素
- configuration 根节点
- properties 可以配置在Java 属性配置文件中
- settings 修改 MyBatis 在运行时的行为方式
- typeAliases 为 Java 类型命名一个别名(简称)
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- mappers 映射器
(2)SQL映射文件
parameterType:
- 表示查询语句传入参数的类型。
- 支持基础数据类型和复杂数据类型
- 如果SQL是单条件查询,则parameterType指定为基础数据类型
- 如果是多条件查询,则parameterType指定为复杂数据类型
- 对于常用的java类型,mybatis都定义了类型别名:
MyBatis传入参数类型(parameterType)总结:
resultType:
- 来实现查询结果的自动映射
- resultType的值可以指定为两种类型: 基本数据类型(int、string、long等等)
- 复杂数据类型(Java实体类、map/hashmap)
MyBatis查询结果映射总结:
5.MyBatis动态SQL
动态SQL是MyBatis的一个强大特性,可以运用动态SQL语句标签方便我们在SQL中实现各种逻辑。
常用标签如下:
- <if>:条件选择
- <choose>:相当于Java中的switch,用于条件选择
- <where>:简化SQL中的where
- <set>:解决动态更新语句在
<set>标签中的每一个修改字段前面/后面尽量加上逗号
- <trim>:灵活的去除多余的关键字
该标签有以下属性:
prefix:前缀
suffix:后缀
prefixOverrides:前缀覆盖,可用于智能的处理”and”,”or”关键字
suffixOverrides:后缀覆盖,可用于处理update语句中中多余的”,”
作用:可以利用trim来代替<where>或者<set>的功能
- <foreach>:迭代遍历一个集合
foreach标签的属性主要有 item,index,collection,open,separator,close。
1)item表示对集合进行迭代时每一个对象的别名 index指定一个名字,用于表示在迭代过程中,每次迭代的位置
2)open是前缀,表示该语句以什么开始
3)separator表示在每次迭代元素之间以什么符号作为分隔符
4)close是后缀,表示以什么结束
5)collection指定需要遍历的集合
说明:
(1) 如果是单参数且参数类型是集合时,collection的值为list
(2) 如果是单参数且参数类型是数组时,collection的值为array
(3) 如果是多参数且参数类型是map或者实体类对象时,collection的值为对应map的键名或者对象的属性名
- if+set标签组合可以实现在update语句中的动态更新
6.Mybatis注解方式:
- @lnsert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与@Result一起使用,封装多个结果集
- @One:实现一对一结果集封装
- @Many:实现一对多结果集封装
注解式开发可以减少Sql映射文件的配置,使代码变得更加简洁。但是使用注解式开发,sql语句的维护成本也会更高。
7.分页插件
limit index,pageSize
index:当前页的起始索引,index=(pageNum-1)*pageSize
pageSize:每页显示条数
pageNum:当前页的页码
count:总记录数
totalPage:总页数
if(count%pageSize !=0){
totalPage+=1;
}
导入依赖:依赖可在官网(https://pagehelper.github.io/docs/howtouse/)复制
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>版本号</version>
</dependency>
同时还需要在核心配置文件中配置:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
查询功能开启前要开启分页功能:
Page<Object> page = PageHelper.startPage(1, 4);
分页数据:
PageInfo<Emp> pageInfo = new PageInfo<>(emps, 5);
分页相关数据:
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]
需要注意的是,查看SQL日志,可以看到分页插件的实现也是使用limit关键字,所以千万不要再StuMapper对应的select查询语句后面加分号(;),因为分号表示SQL语句结束,此时插件再在后面附加limit限制语句就会报错。
另外,在项目中经常会用到SQL语句的拼接,所以建议在项目的任何地方写SQL语句,末尾都不要加分号(;),不加分号不会报错,加了分号就存在报错的可能,不加比加好
Mapper.xml文件中定义SQL语句片段,里面的SQL语句也不能加分号,否则后面引用语句的方法都会报错