MyBatis从前世到今生一网打尽(全网最全,建议收藏)

一、框架概述

1.1 软件开发常用结构

1.1.1、三层架构

三层架构

三层架构包含的三层:

  1. 界面层(User Interface layer)
  2. 业务逻辑层(Business Logic Layer)
  3. 数据访问层(Data access layer)

三层架构分别的职责是:

  1. 界面层(表示层,视图层):主要功能是接受用户的数据,显示请求的处理结果。使用 web 页面和 用户交互,手机 app 也就是表示层的,用户在 app 中操作,业务逻辑在服务器端处理。

  2. 业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。

  3. 数据访问层:与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交 给业务层,同时将业务层处理的数据保存到数据库。

    他们处理请求的交互过程是:用户——> 界面层——>业务逻辑层——>数据访问层——>DB 数据库

1.1.2、为什么要使用三层架构

  1. 结构清晰,耦合度低,各层分工明确。
  2. 可维护性高,可拓展性高。
  3. 有利于标准化。
  4. 开发人员可以只关注整个结构中的其中某一层的功能实现。
  5. 有利于各层逻辑的复用。

1.2、框架初探究

1.2.1、什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。 ​ 简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。 ​ 框架安全的,可复用的,不断升级的软件。

1.2.1、框架解决的问题

框架要解决的最重要的一个问题是技术整合,在 J2EE 的 框架中,有着各种各样的技术,不同的应用,系统使用不同的技术解决问题。需要从 J2EE 中选择不同的技术,而技术自身的复杂性,有导致更大的风险。

企业在开发软件项目时,主要目的是解决业务问题。 即要求企业负责技术本身,又要求解决业务问题。这是大多数企业不能完成的。框架把相关的技术融合在一起,企业开发可以集中在业务领域方面。

1.3、常用框架

1.3.1、Mybatis

 MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。
	MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java对象并返回。 

1.3.2、Spring

 Spring 框架为了解决软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前非常复杂的企业级开发。Spring 解决了业务对象,功能模块之间的耦合,不仅在 javase,web 中使用,大部分 Java 应用都可以从 Spring 中受益。
	Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器。 

1.3.3、SpringMVC

 Spring MVC 属于 SpringFrameWork 3.0 版本加入的一个模块,为 Spring 框架提供了构建 Web应用程序的能力。现在可以 Spring 框架提供的 SpringMVC 模块实现 web 应用开发,在 web 项目中可以无缝使用 Spring 和 Spring MVC 框架 

二、Mybatis简介

2.1、传统的JDBC

2.1.1、代码

public void findStudent() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
try {
    //注册 mysql 驱动
    Class.forName("com.mysql.jdbc.Driver");
    //连接数据的基本信息 url ,username,password
    String url = "jdbc:mysql://localhost:3306/springdb";
    String username = "root";
    String password = "123456";
    //创建连接对象
    conn = DriverManager.getConnection(url, username, password);
    //保存查询结果
    List<Student> stuList = new ArrayList<>();
    //创建 Statement, 用来执行 sql 语句
    stmt = conn.createStatement();
    //执行查询,创建记录集,
    rs = stmt.executeQuery("select * from student");
    while (rs.next()) {
        Student stu = new Student();
        stu.setId(rs.getInt("id"));
        stu.setName(rs.getString("name"));
        stu.setAge(rs.getInt("age"));
   		//从数据库取出数据转为 Student 对象,封装到 List 集合
    	stuList.add(stu);
}
    } catch (Exception e) {
		e.printStackTrace();
} finally {
	try {
		//关闭资源
		if (rs != null) ;
		{
			rs.close();
		}
		if (stmt != null) {
			stmt.close();
		}
		if (conn != null) {
			conn.close();
		}
	} catch (Exception e) {
			e.printStackTrace();
		}
	}
} 

2.1.2、存在的问题

我们在使用JDBC进行实际开发过程中存在的问题也是很明显的:

  1. 代码比较多,开发效率低。
  2. 需要关注 Connection ,Statement, ResultSet 对象创建和销毁。
  3. 对 ResultSet 查询的结果,需要自己封装为 List。
  4. 重复的代码比较多。
  5. 业务代码和数据库的操作混在一起,不利于现代的开发习惯。

2.2、MyBatis 历史

MyBatis 是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code,随着开发团队转投 Google Code 旗下, iBatis3.x 正式更名为 MyBatis ,代码于 2013 年 11 月迁移到 Github。

iBatis 一词来源于“internet”和“abatis”的组合,是一个基于 Java 的持久层框架。 iBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO)。

2.3、MyBatis 简介

  1. MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
  2. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  3. MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和JavaOld Java Objects,普通的 Java 。对象)映射成数据库中的记录。

2.4、现有持久化技术的对比

2.4.1、JDBC

  • SQL 夹在 Java 代码块里,耦合度高导致硬编码内伤。
  • 维护不易且实际开发需求中 sql 是有变化,频繁修改的情况多见。

2.4.2、Hibernate 和 JPA。

  • 长难复杂 SQL,对于 Hibernate 而言处理也不容易。
  • 内部自动生产的 SQL,不容易做特殊优化。
  • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。导致数据库性能下降。

2.4.3、MyBatis

  • 对开发人员而言,核心 sql 还是需要自己优化。
  • sql 和 java 编码分开,功能边界清晰,一个专注业务、一个专注数据。

2.5、MyBatis解决的问题

  1. 减轻使用 JDBC 的复杂性,不用编写重复的创建 Connetion , Statement 。

  2. 不用编写关闭资源代码。

  3. 直接使用 java 对象,表示结果数据。让开发者专注 SQL 的处理。 其他分心的工作由 MyBatis 代劳。

2.6、下载 MyBatis

下载网址:github.com/mybatis/myb…

image-20201003131136245

image-20201003131210894

image-20201003131309299

三、入门MyBatis

3.1、开发环境的准备

3.1.1、导入 jar包

一般的我们要导入三个jar包。

myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar 

3.1.2、导入 log4j 的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
    <logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration> 

3.1.3、创建测试表

-- 创建库
CREATE DATABASE test_mybatis;
-- 使用库
USE test_mybatis;
-- 创建表
CREATE TABLE user(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
pwd VARCHAR(50),
); 

3.1.4、创建 javaBean

package com.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author Xiao_Lin
 * @date 2021/1/5 11:33
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
  private Integer id;
  private String username;
  private String pwd;
} 

3.1.5、创建 MyBatis 的全局配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!--配置 mybatis 环境-->
	<environments default="mysql">
		<!--id:数据源的名称-->
		<environment id="mysql">
		<!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
			<transactionManager type="JDBC"/>
			<!--数据源 dataSource:创建数据库 Connection 对象
			type: POOLED 使用数据库的连接池
			-->
                <dataSource type="POOLED">
                    <!--连接数据库的四个要素-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql:///javaweb?characterEncoding=utf-8&amp;useSSL=false"/>
                    <property name="username" value="root"/>
                    <property name="password" value="1101121833"/>
                </dataSource>
		</environment>
	</environments>
	<mappers>
		<!--告诉 mybatis 要执行的 sql 语句的位置,写的路径是字节码输出路径-->
		<mapper resource="com/dao/StudentDao.xml"/>
	</mappers>
</configuration> 

3.1.6、编写UserDao接口

public interface UserDao {
	/*查询所有数据*/
	List<User> selectUser();
} 

3.1.7、创建 Mybatis 的 sql 映射文件

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <!--
      用来存储SQL语句的
      namespace属性里面必须写 用来书写当前的mapper是对哪个DAO接口的实现
      他的意思是表示该配置文件的唯一标识,意味着不同的XxxMapper.xml文件的namespace的值时不同的
      -->

    <!--
      select标签表示查询操作,
     	  id属性表示在mapper配置文件中是唯一标识,一般使用方法名作为其值。
     	  paraType属性表示传入参数的类型,可省略不写,底层使用了反射,根据传入参数得到对象的类型		   标签体中编写sql语句,#{变量},#表示占位符,和jdbc的?一样。
          如果传入的参数是简单类型(包括String),那么该类型可以任意写
          如果传入的参数是对象类型,那么变量的名称必须使用对象对应的类中的属性
		  resultType: 查询语句的返回结果数据类型,使用全限定类名
      -->

<mapper namespace="com.mapper.UserDao">
  <select id="selectAll" resultType="com.domain.User">
    select * from user
  </select>
</mapper> 

3.1.8、配日志

mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数。

<settings>
	<setting name="logImpl" value="STDOUT_LOGGING" />
</settings> 

3.1.9、测试

public class test {
        /*
		* mybatis 入门
		*/
	@Test
	public void testStart() throws IOException {
		//1.mybatis 主配置文件
		String config = "mybatis-config.xml";
		//2.读取配置文件
		InputStream in = Resources.getResourceAsStream(config);
		//3.创建 SqlSessionFactory 对象,目的是获取 SqlSession
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
		//4.获取 SqlSession,SqlSession 能执行 sql 语句
		SqlSession session = factory.openSession();
		//5.执行 SqlSession 的 selectList()
		List<User> users = session.selectList("com.dao.UserDao.selectAll");
		//6.循环输出查询结果
		studentList.forEach( u -> System.out.println(u));
		//7.关闭 SqlSession,释放资源
		session.close();
    }
} 

3.2、CRUD操作

3.2.1、insert

接口中新增方法

int insertUser(User user); 

xml中新增sql语句

<insert id="insertUser">
insert into user(id,username,pwd) values(#{id},#{username},#{pwd})
</insert> 

新增测试方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值