1、接口代理方式实现Dao层

1.1 代理开发方式介绍

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。

Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

实现规则 :

  1. 映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。(全类名是指全路径名  例如:com.itheima.mapper.StudentMapper)

  2. 映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接口的方法名相同。

  3. 映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao 层接口方法的参数相同。

  4. 映射配置文件中的增删改查标签的 resultType 属性必须和 Dao 层接口方法的返回值相同。 

  5. 获取动态代理对象 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分页插件总结

  1. 在企业级开发中,分页也是一种常见的技术。而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的功能,需要我们手动编写 LIMIT 语句。但是不同的数据库实现分页的 SQL 语句也是不同的,所以手写分页成本较高。这个时候就可以借助分页插件来帮助我们实现分页功能。

  2. 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:分页助手功能类。

    1. startPage():设置分页参数

    2. PageInfo:分页相关参数功能类。

    3. getTotal():获取总条数

    4. getPages():获取总页数

    5. getPageNum():获取当前页

    6. getPageSize():获取每页显示条数

    7. getPrePage():获取上一页

    8. getNextPage():获取下一页

    9. isIsFirstPage():获取是否是第一页

    10. isIsLastPage():获取是否是最后一页

注意:在集成分页插件环境时,有个问题详情参考 使用MyBatis分页插件PageHelper遇到的问题 - 钟欣 - 博客园 (cnblogs.com)

MyBatis 02相关推荐

  1. Mybatis 02 基础应用

    Mybatis 02 基础应用 一.代码开发demo 1.基于mapper代码开发 1.1.开发方式 ​ 只需要开发Mapper接口和对应的Mapper映射文件,接口定义声明,文件定义sql. 1.2 ...

  2. mybatis plus 事务管理器_[MyBatis]-02 环境搭建及配置文件详解

    示例 一般MyBatis文件都是存放在src根目录下以mybatis.xml命名 配置详情 <?xml version="1.0" encoding="UTF-8& ...

  3. 【MyBatis笔记、使用教程】

    文章目录 01. 介绍 1.1.三层架构 1.2.MyBatis 02. jdbc问题总结 03. 快速使用MyBatis 3.1.项目结构 3.2.基本使用步骤 3.2.1 概述 3.2.2 导入j ...

  4. Typora主题更换和Typora的使用方法

    Typora的安装十分简单,电脑管家一键安装即可.但是,众所周知,不管是什么东西,只要可以换皮肤,初始化的界面就都不太行. Typora的官网:http://theme.typora.io/ 提供了各 ...

  5. MyBatis-学习笔记02【02.Mybatis入门案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  6. 2021年3月8日:MyBatis框架学习笔记02:利用MyBatis实现CRUD操作

    MyBatis框架学习笔记02:利用MyBatis实现CRUD操作 在第一节课中我们在UserMapper.xml里定义了两个查询语句:findById和findAll,对应的在UserMapper接 ...

  7. mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数

    mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...

  8. mybatis 复习笔记02

    1. 一对一查询: 1). 实体类: 2). 定义resultMap <!-- 订单查询关联用户的resultMap将整个查询的结果映射到cn.itcast.mybatis.po.Orders中 ...

  9. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02

    代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...

最新文章

  1. AI企业下一个使命:让生物特征数据使用走向阳光透明
  2. 自动化运维工具Puppet(管理资源)
  3. 西固哪家计算机学校好,兰州市西固区有什么技术学校和大学
  4. c#中使用mysql查询语句_遇到@符合怎么办_C# Mysql 查询 Rownum的解决方法
  5. 使用LXCFS实现容器资源的视图隔离
  6. vb6.0快速操作注册表函数大全(仅字符串KEY值部分)
  7. atitit.浏览器插件解决方案----ftp插件 attilax 总结
  8. VMware Workstation不可恢复错误: (vcpu-0)
  9. 纯虚函数的类为什么不能被实例化
  10. 3S基础知识:MapX应用教程—查询
  11. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(一)
  12. C# ZIP文件压缩和解压
  13. 「MRC干货」如何快速构建一台高精度AGV
  14. 人工智能现状和发展趋势
  15. 智能名片小程序创建名片页的表单校验使用正则表达式整理
  16. 神级 IDEA 插件,能让你的代码飞起来!
  17. JAVA身份证阅读器数据返回图片
  18. 【bioinfo】sam文件可选区域字段(Optional Feild)含义
  19. jmeter伪造ip进行压测(伪造大量ip,测试负载均衡)
  20. 天玑9200和骁龙8+哪个好 天玑9200和骁龙8+gen1对比

热门文章

  1. 【题解】P3387 【模板】缩点
  2. Chrome浏览器显示“Adobe flash player已过期”问题之解决
  3. 阿里的敏捷组织和中台策略有何不同?
  4. python爬取html中文乱码
  5. 微信群发频繁发送消息,请稍后再试?
  6. 快速找出两个Word文档之间的差别
  7. 一片文章带你了解汇编语言
  8. windows核心编程--2、windows的画笔画刷以及一些简单的应用
  9. {转发}尚硅谷资料集锦
  10. 贵州省正安县格林镇:“爱心妈妈”来了!