MyBatis 02
1、接口代理方式实现Dao层
1.1 代理开发方式介绍
采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
实现规则 :
映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。(全类名是指全路径名 例如:com.itheima.mapper.StudentMapper)
映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接口的方法名相同。
映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao 层接口方法的参数相同。
映射配置文件中的增删改查标签的 resultType 属性必须和 Dao 层接口方法的返回值相同。
获取动态代理对象 SqlSession 功能类中的 getMapper() 方法。
总结:
接口代理方式可以让我们只编写接口即可,而实现类对象由 MyBatis 生成。
接口开发的方式: 程序员只需定义接口,就可以对数据库进行操作,那么具体的对象怎么创建?
1.程序员负责定义接口
2.操作数据库,mybatis框架根据接口,通过动态代理的方式生成代理对象,负责数据库的crud操作
1.2 接口代理方式实现Dao层-代码实现
1、删除mapper层接口的实现类
2、修改映射配置文件,让名称空间和持久层接口的全类名相同
3、修改service层接口的实现类,采用接口代理方式实现功能
1、加载核心配置文件
2、获取SqlSession工厂对象
3、通过工厂对象获取SqlSession对象
4、获取StudentMapper接口的实现类对象(通过SqlSession调用getMapper这个方法,这个方法里面是一个.class参数)
5、通过是想类对象调用方法,接受结果
6、释放资源
7、返回结果
public Student selectById(Integer id) {Student stu = null;SqlSession sqlSession = null;InputStream is = null;try{//1.加载核心配置文件is = Resources.getResourceAsStream("MyBatisConfig.xml");//2.获取SqlSession工厂对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3.通过工厂对象获取SqlSession对象sqlSession = sqlSessionFactory.openSession(true);//4.获取StudentMapper接口的实现类对象StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // StudentMapper mapper = new StudentMapperImpl();//5.通过实现类对象调用方法,接收结果stu = mapper.selectById(id);} catch (Exception e) {} finally {//6.释放资源if(sqlSession != null) {sqlSession.close();}if(is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}//7.返回结果return stu;}
1.3 源码分析
分析动态代理对象如何生成的?
通过动态代理开发模式,我们只编写一个接口,不写实现类,我们通过 getMapper() 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象,然后执行功能,而这个代理对象正是 MyBatis 使用了 JDK 的动态代理技术,帮助我们生成了代理实现类对象。从而可以进行相关持久化操作。
分析方法是如何执行的?
动态代理实现类对象在执行方法的时候最终调用了 mapperMethod.execute() 方法,这个方法中通过 switch 语句根据操作类型来判断是新增、修改、删除、查询操作,最后一步回到了 MyBatis 最原生的 SqlSession 方式来执行增删改查。
2、动态sql语句
2.1 动态sql语句概述
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
动态SQL标签:
<if>:条件判断标签
<foreach>:循环遍历标签
总结语法:
<where>:条件标签。如果有动态条件,则使用该标签代替 where 关键字。
<if>:条件判断标签。
<if test=“条件判断”>
查询条件拼接
2.2 动态SQL语句---<if>
例子: 我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
<select id="findByCondition" parameterType="student" resultType="student">select * from student<where><if test="id!=0">id=#{id}</if><if test="username!=null">and username=#{username}</if></where>
</select>
总结语法:
<foreach>:循环遍历标签。适用于多个参数或者的关系。
<foreach collection=“”open=“”close=“”item=“”separator=“”>
获取参数
</foreach>
属性:
collection:参数容器类型, (list-集合, array-数组)。
open:开始的 SQL 语句。
close:结束的 SQL 语句。
item:参数变量名。
separator:分隔符。
2.3 动态SQL语句---<foreach>
例子:循环执行sql的拼接操作,例如:SELECT * FROM student WHERE id IN (1,2,5)。
<select id="findByIds" parameterType="list" resultType="student">select * from student<where><foreach collection="array" open="id in(" close=")" item="id" separator=",">#{id}</foreach></where>
</select>
2.4 SQL片段抽取
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
总结语法:
我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。
<sql>:抽取 SQL 语句标签。
<include>:引入 SQL 片段标签。
<sql id=“片段唯一标识”>抽取的 SQL 语句</sql>
引用时的语句:
<include refid=“片段唯一标识”/>
<!--抽取sql片段简化编写-->
<sql id="selectStudent" select * from student</sql>
<select id="findById" parameterType="int" resultType="student"><include refid="selectStudent"></include> where id=#{id}
</select>
<select id="findByIds" parameterType="list" resultType="student"><include refid="selectStudent"></include><where><foreach collection="array" open="id in(" close=")" item="id" separator=",">#{id}</foreach></where>
</select>
3、分页插件--核心配置文件
3.1 分页插件介绍
分页可以将很多条结果进行分页显示。
如果当前在第一页,则没有上一页。如果当前在最后一页,则没有下一页。
需要明确当前是第几页,这一页中显示多少条结果。
MyBatis分页插件总结
在企业级开发中,分页也是一种常见的技术。而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的功能,需要我们手动编写 LIMIT 语句。但是不同的数据库实现分页的 SQL 语句也是不同的,所以手写分页成本较高。这个时候就可以借助分页插件来帮助我们实现分页功能。
PageHelper:第三方分页助手。将复杂的分页操作进行封装,从而让分页功能变得非常简单。
3.2 分页插件的使用
开发步骤:
①导入与PageHelper的jar包
②在mybatis核心配置文件中配置PageHelper插件
<!-- 注意:分页助手的插件 配置在通用mapper之前 -->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 指定方言 --><property name="dialect" value="mysql"/></plugin>
</plugins>
属性:
interceptor:指定插件的全类名
③测试分页数据获取
@Test
public void testPageHelper(){//设置分页参数PageHelper.startPage(1,2);List<User> select = userMapper2.select(null);for(User user : select){System.out.println(user);}
}
3.3 分页插件的参数获取
获得分页相关的其他参数:
代码实现:
//其他分页的数据
PageInfo<User> pageInfo = new PageInfo<User>(select);
System.out.println("总条数:"+pageInfo.getTotal());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示长度:"+pageInfo.getPageSize());
System.out.println("是否第一页:"+pageInfo.isIsFirstPage());
System.out.println("是否最后一页:"+pageInfo.isIsLastPage());
其中:User:数据的类型 select:数据的名称
3.4 分页插件知识小结
分页:可以将很多条结果进行分页显示。
分页插件 jar 包: pagehelper-5.1.10.jar jsqlparser-3.1.jar
<plugins>:集成插件标签。
分页助手相关 API
1.PageHelper:分页助手功能类。
startPage():设置分页参数
PageInfo:分页相关参数功能类。
getTotal():获取总条数
getPages():获取总页数
getPageNum():获取当前页
getPageSize():获取每页显示条数
getPrePage():获取上一页
getNextPage():获取下一页
isIsFirstPage():获取是否是第一页
isIsLastPage():获取是否是最后一页
注意:在集成分页插件环境时,有个问题详情参考 使用MyBatis分页插件PageHelper遇到的问题 - 钟欣 - 博客园 (cnblogs.com)
MyBatis 02相关推荐
- Mybatis 02 基础应用
Mybatis 02 基础应用 一.代码开发demo 1.基于mapper代码开发 1.1.开发方式 只需要开发Mapper接口和对应的Mapper映射文件,接口定义声明,文件定义sql. 1.2 ...
- mybatis plus 事务管理器_[MyBatis]-02 环境搭建及配置文件详解
示例 一般MyBatis文件都是存放在src根目录下以mybatis.xml命名 配置详情 <?xml version="1.0" encoding="UTF-8& ...
- 【MyBatis笔记、使用教程】
文章目录 01. 介绍 1.1.三层架构 1.2.MyBatis 02. jdbc问题总结 03. 快速使用MyBatis 3.1.项目结构 3.2.基本使用步骤 3.2.1 概述 3.2.2 导入j ...
- Typora主题更换和Typora的使用方法
Typora的安装十分简单,电脑管家一键安装即可.但是,众所周知,不管是什么东西,只要可以换皮肤,初始化的界面就都不太行. Typora的官网:http://theme.typora.io/ 提供了各 ...
- MyBatis-学习笔记02【02.Mybatis入门案例】
Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...
- 2021年3月8日:MyBatis框架学习笔记02:利用MyBatis实现CRUD操作
MyBatis框架学习笔记02:利用MyBatis实现CRUD操作 在第一节课中我们在UserMapper.xml里定义了两个查询语句:findById和findAll,对应的在UserMapper接 ...
- mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...
- mybatis 复习笔记02
1. 一对一查询: 1). 实体类: 2). 定义resultMap <!-- 订单查询关联用户的resultMap将整个查询的结果映射到cn.itcast.mybatis.po.Orders中 ...
- Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02
代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...
最新文章
- AI企业下一个使命:让生物特征数据使用走向阳光透明
- 自动化运维工具Puppet(管理资源)
- 西固哪家计算机学校好,兰州市西固区有什么技术学校和大学
- c#中使用mysql查询语句_遇到@符合怎么办_C# Mysql 查询 Rownum的解决方法
- 使用LXCFS实现容器资源的视图隔离
- vb6.0快速操作注册表函数大全(仅字符串KEY值部分)
- atitit.浏览器插件解决方案----ftp插件 attilax 总结
- VMware Workstation不可恢复错误: (vcpu-0)
- 纯虚函数的类为什么不能被实例化
- 3S基础知识:MapX应用教程—查询
- 2021华为软挑赛题_思路分析——实时更新,做多少更多少(一)
- C# ZIP文件压缩和解压
- 「MRC干货」如何快速构建一台高精度AGV
- 人工智能现状和发展趋势
- 智能名片小程序创建名片页的表单校验使用正则表达式整理
- 神级 IDEA 插件,能让你的代码飞起来!
- JAVA身份证阅读器数据返回图片
- 【bioinfo】sam文件可选区域字段(Optional Feild)含义
- jmeter伪造ip进行压测(伪造大量ip,测试负载均衡)
- 天玑9200和骁龙8+哪个好 天玑9200和骁龙8+gen1对比