《Mybatis入门到精通》——1. Mybatis入门

Mybatis学习前——

关注点分离

它是最经典的架构设计原则之一。

1. 架构中需要变化的部分, 一定要能够非常清晰地被识别出来 。
2. 若架构中某部分发生变化,则该变化不会影响到其他部分。
3. 若架构中某部分需要扩展,则该扩展也不会影响到其他部分 。

架构能做到关注点分离,才能做到真正意义上的解耦;最经典的的就是“前后端分离”;

前后端分离

  • 针对前端,需要将界面展现与数据展现相分离:
  • 针对后端,不仅要清晰地理解业务逻辑,善于将数据进行合理的建模,最终还要做到将业务逻辑与数据逻辑相分离 。

业务逻辑与数据分离

数据逻辑?——最直接的就是一个个对应于数据库中每张数据表的实体对象——数据访问对象,即 Data Access Object,简称DAO ;

这一层数据直接和底层数据库打交道,我们将它们从业务逻辑中分离出来,并加以封装。

也就是说,没必要为每一个DAO对象初始化的过程去编写大量的代码(将结果集ResultSet填充到表的实体类),这些代码应该封装到一个框架中;

我们只需要编写相应的 SQL 语句,并将这些 SQL 语句从业务代码中分离出来,最终将执行 SQL 语句所得到的结果集映射到DAO对象中即可;

官方网站:<u>https://mybatis.org/mybatis-3/zh/index.html</u>

Day_01

什么是框架?

它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题;

使用框架的好处:

  • 框架封装了很多的细节(如Mybtis映射xml到Mapper对象/DAO对象,调用DAO接口的SQL执行的方法),使开发者可以使用极简的方式实现功能;
  • 大大提高开发效率;

三层架构

  • 表现层:是用于展示数据的;
  • 业务层:是处理业务需求;
  • 持久层:是和数据库交互的;

持久层技术解决方案

  • JDBC技术:Connection/PreparedStatement/ResultSet;
  • Spring的JdbcTemplate:Spring中对jdbc的简单封装;
  • Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装

以上这些都不是框架;也就是说,JDBC是规范;Spring的JdbcTemplate和Apache的DBUtils都只是工具类,并非框架;

mybatis的概述

  • mybatis是一个持久层框架,用java编写的;
  • 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程;
  • 它使用了ORM思想实现了结果集的封装;

ORM?

——Object Relational Mappging对象关系映射

简单的说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表;(parameterType/ResultType/ResultMap标签)

我们需要做到:实体类中的属性和数据库表的字段名称保持一致;eg:VARCHAR user_name - String userName

第一个Mybatis的小Demo

步骤:
(1)创建Maven项目,修改pom.xml导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="[http://maven.apache.org/POM/4.0.0](http://maven.apache.org/POM/4.0.0)"
         xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)"
         xsi:schemaLocation="[http://maven.apache.org/POM/4.0.0](http://maven.apache.org/POM/4.0.0) [http://maven.apache.org/xsd/maven-4.0.0.xsd](http://maven.apache.org/xsd/maven-4.0.0.xsd)">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ming</groupId>
    <artifactId>mybatis_01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
<dependencies>
    <!-- [https://mvnrepository.com/artifact/org.mybatis/mybatis](https://mvnrepository.com/artifact/org.mybatis/mybatis) -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!-- [https://mvnrepository.com/artifact/mysql/mysql-connector-java](https://mvnrepository.com/artifact/mysql/mysql-connector-java) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
    <!-- [https://mvnrepository.com/artifact/org.projectlombok/lombok](https://mvnrepository.com/artifact/org.projectlombok/lombok) -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

</dependencies>
</project>

(2)在Resource里面配置SqlMapConifg.xml

(3)创建DAO实体类(对应表)-DAO的接口(对应xml)-接口对应的xml文件

(4)写测试类 (略)

环境搭建的注意事项:

(1)创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致;在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper,所以:IUserDao 和 IUserMapper是一样的;
(2)在idea中创建目录(快速建包)的时候,它和包是不一样的;

  • 包 (Package) 在创建时:top.zoick.dao它是三级结构
  • 目录 (Directory) 在创建时:top.zoick.dao是一级目录

(3)mybatis的映射配置文件位置必须和dao接口的包结构相同;
(4)映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名;
(5)映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名;

当我们遵从了第3/4/5点之后,我们在开发中就无须再写dao的实现类。

测试类

public class MybatisTest_01 {
    public static void main(String[] args) throws Exception {
        //1.读取配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);
        //3.使用工厂创建SqlSession
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象的方法
        List<User> users = userDao.findAll();
        for (User user : users
        ) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        inputStream.close();
    }
}

mybatis的入门案例:
第一步: 读取配置文件
第二步: 创建SqlSessionFactory工厂
第三步: 创建SqlSession
第四步: 创建Dao接口的代理对象
第五步: 执行dao中的方法
第六步: 释放资源

注意事项:不要忘记在映射配置中告知mybatis要封装到哪个实体类中
配置的方式:指定实体类的全限定类名

mybatis基于注解的入门案例:
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。

明确:

  • 我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
  • 不管使用XML还是注解配置。
  • 实际上,xml方式用的多一些!不推荐用注解;

但是Mybatis它是支持写dao实现类的,虽然不需要这么写;

Mybatis的原理

  • 解析XML(类似Java XML解析技术)
  • 反射,由xml到接口对象
  • 动态代理,生成接口的代理类,执行SQL方法;

mybatis在使用代理dao的方式实现增删改查时做什么事呢?

只有两件事:
第一:创建代理对象
第二:在代理对象中调用执行SQL的方法

自定义mybatis开发流程图:

Project结构:

小结

  1. 读取配置文件用io包里的Resources(即SqlMapconfig.xml);
  2. 读出所需要的信息交给SqlSessionFactoryBuilder构建者;
  3. 构建者使用工具类XMLConfigBuilder构建出DefaultSqlsessionFactory工厂对象,xml读取的信息保存在Configuration里;
  4. 工厂里的openSession提供了Sqlsession方法;
  5. 再在SqlSession里实现创建代理对象和查询所有的功能;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值