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结构:
小结:
- 读取配置文件用io包里的Resources(即SqlMapconfig.xml);
- 读出所需要的信息交给SqlSessionFactoryBuilder构建者;
- 构建者使用工具类XMLConfigBuilder构建出DefaultSqlsessionFactory工厂对象,xml读取的信息保存在Configuration里;
- 工厂里的openSession提供了Sqlsession方法;
- 再在SqlSession里实现创建代理对象和查询所有的功能;