前言

MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映`射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis的作用

MyBatis作用是在持久层也就是访问数据库的操作,以前我们访问数据库是用JDBC来访问数据库,JDBC访问数据库需要写很多重复的代码,假如数据库访问很多还需要对数据库连接进行不停的打开连接和关闭连接,很消耗系统性能

MyBatis封装了JDBC底层访问数据库的代码,让我们程序猿只需要关心如何去写好SQL就好,不在需要去写JDBC底层的代码

MyBatis的优缺点

优点

  • MyBatis封装了JBDC底层访问数据库的细节,使我们程序猿不需要与JDBC API打交道,就可以访问数据库
  • MyBatis简单易学,程序猿直接编写SQL语句,适合于对SQL语句性能要求比较高的项目
  • SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度
  • SQL代码从程序代码中彻底分离出来,可重用
  • 提供了动态SQL标签,支持编写动态SQL
  • 提供映射标签,支持对象与数据库的ORM字段关系映射

缺点

  • 过于依赖数据库SQL语句,导致数据库移植性差,更换数据库,如果SQL语句有差异,SQL语句工作量大
  • 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载

MyBatis的配置文件

properties元素

properties元素描述的都是外部化,可替代的属性

一般用来配置连接数据源,我们可以使用property子节点来配置也可以使用资源路径引用

使用property子节点来配置

    <properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>

使用资源路径引用

    <properties resource="jdbcConfig.properties"/>

jdbcConfig.properties里面的属性

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=123456

连接数据源的配置

	<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>

假如使用property子节点来配置和使用资源路径引用都用了,这个时候MyBatis会调用哪个勒?MyBatis会调用资源路径引用的属性值,因为资源路径引用的优先级高于property子节点的优先级

settings元素

settings是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为

    <settings>
<!-- 全局映射器启用缓存 -->
<setting name="cacheEnabled" value="true"/> <!-- 查询时,关闭关联对象即时加载以提高性能 -->
<setting name="lazyLoadingEnabled" value="true"/> <!-- 设置关联对象加载的形态,此处为按需加载字段 (加载字段由 SQL指 定 ),不会加载关联表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false"/> <!-- 对于未知的 SQL查询,允许返回不同的结果集以达到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true"/> <!-- 允许使用列标签代替列名 -->
<setting name="useColumnLabel" value="true"/> <!-- 允许使用自定义的主键值 (比如由程序生成的 UUID 32位编码作为键值 ),数据表的 PK生成策略将被覆盖 -->
<setting name="useGeneratedKeys" value="true"/> <!-- 给予被嵌套的 resultMap以字段 -属性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL"/> <!-- 对于批量更新操作缓存 SQL以提高性能 -->
<setting name="defaultExecutorType" value="BATCH"/> <!-- 数据库超过 25000秒仍未响应则超时 -->
<setting name="defaultStatementTimeout" value="25000"/>
</settings>

typeAliases元素

typeAliases元素的作用是给JavaBean取别名,方便我们在mappeer配置文件中使用

当我们没有给JavaBean取别名,mapper配置文件中获取JavaBean的时候,我们就需要获取JavaBean所在项目里面的全路径

    <!--省略部分代码-->
<select id="login" resultType="cn.friday.pojo.DevUser">
SELECT * FROM dev_user WHERE devCode=#{devCode} AND devPassword=#{devPassword}
</select>

接下来我们就来给JavaBean取别名

    <typeAliases>
<typeAlias type="cn.friday.pojo.DevUser" alias="devUser"/>
<typeAlias type="cn.friday.pojo.AppInfo" alias="appInfo"/>
</typeAliases>

给每个JavaBean去取一个指定的别名,这样是有缺陷的,万一项目中有很多个POJO那么工作量就大了,不过还有一种方法给指定的包里面所有的JavaBean都取一个别名,MyBatis会自动扫描所指定的包下的JavaBean并且给一个默认的别名,默认的别名为JavaBean的名称,请看下面

    <typeAliases>
<package name="cn.friday.pojo"/>
</typeAliases>

mapper里面的配置文件就可以正常使用JavaBean取的别名了,不需要再去获取JavaBean的全路径了

    <!--省略部分代码-->
<select id="login" resultType="DevUser">
SELECT * FROM dev_user WHERE devCode=#{devCode} AND devPassword=#{devPassword}
</select>

environments元素

MyBatis可以配置多种环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配置,从而将SQL映射应用到不同的数据库环境上.这些不同的运行环境我们就可以用environments元素来配置实现

environments元素元素的配置

	<!--开发环境-->
<!--default属性表示在默认的情况下我们将启用的数据源-->
<environments default="development">
<!--id属性用来标识一个数据源的,方便在MyBatis中使用 -->
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 配置数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment> <!--我们在来配置一个测试环境-->
<environment id="test">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 配置数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test1"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

假如我们想从开发环境变成测试环境只需要修改environments元素里面的default属性即可

 <environments default="test">
<!--省略部分代码-->
</environments>

mappers元素

mappers映射器,说简单点就是告诉MyBatis去哪里找到SQL语句映射文件,我们可以使用类资源路径或者是URL等

用类资源路径获取映射文件

    <mappers>
<mapper resource="cn/friday/dao/developer/DevUserMapper.xml"/>
<mapper resource="cn/friday/dao/developer/AppInfoMapper.xml"/>
</mappers>

用URL获取映射文件

    <mappers>
<mapper url="file:///D:/mappers/DevUserMapper.xml"/>
<mapper url="file:///D:/mappers/AppInfoMapper.xml"/>
</mappers>

如何实现MyBatis

先给大家看一下我的项目结构

第一步 导入依赖

我的是maven项目所以只需要在pox.xml配置文件中添加关于MyBatis的依赖即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId>
<artifactId>MyBatis</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency> </dependencies> <build>
<resources>
<resource>
<directory>src/main/java/</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>

第二步 创建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>
<properties resource="jdbc-config.properties"/> <typeAliases>
<package name="com.friday.pojo"/>
</typeAliases> <environments default="test">
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="com/friday/dao/UserMapper.xml"></mapper>
</mappers>
</configuration>

jdbc-config.properties里面的属性

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
username=root
password=123456

第三步 创建接口以及映射文件

接口,普通的java接口

package com.friday.dao;

import com.friday.pojo.User;
import org.apache.ibatis.annotations.Param; public interface UserMapper {
//@Param相对应给String userCode取了一个别名叫做userPassword,我们到写映射SQL语句的时候只有#{注解名称}即可,如#{userPassword}
public User login(@Param("userCode") String userCode,@Param("userPassword") String pwd);
}

映射文件

<?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">
<mapper namespace="com.friday.dao.UserMapper">
<select id="login" resultType="User" parameterType="string">
SELECT * FROM smbms_user WHERE userCode=#{userCode} AND userPassword=#{userPassword}
</select>
</mapper>

mapper 文件里面的属性

  • namespace属性 指定相对应的接口
  • id属性 接口里面具体的方法名
  • resultType 返回值的类型
  • resultType 传进来的参数的类型

第四步 测试

package com.friday.test;

import com.friday.dao.UserMapper;
import com.friday.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; public class MyBatisTest {
public static void main(String[] args) throws IOException {
//读取mybatis配置文件
String resource = "mybatis-config.xml";
//获取mybatis配置文件的输入流
InputStream is = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//打开sqlSession对象
SqlSession sqlSession = factory.openSession(); //获取对应的Mapper,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
User user = sqlSession.getMapper(UserMapper.class).login("zhanghua","userPassword"); //看一下是否可以查到数据
if (user != null) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
} //关闭sqlSession对象
sqlSession.close();
}
}

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

看阿里P7讲MyBatis:从MyBatis的理解以及配置和实现全帮你搞懂的更多相关文章

  1. 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码

    前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...

  2. Mybatis(一) mybatis入门

    学习了hibernate这个持久层框架之后,在来学习Mybatis简直是无压力,因为Mybatis入门门栏很低,如果学习过了hibernate的话,对于Mybatis的学习很简单了,如果没学习过hib ...

  3. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

    ----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...

  4. 转头条:阿里p7架构师:三年经验应该具备什么样的技能?

    问:工作中,有时候实现一个功能,会去看有没有现成的轮子可用.对于重复造轮子与改造轮子有什么看法? 答:一定会的,其实这也是一个提高技术能力的方法,比如今天想做个日期转换的功能,JDK8有日期的新特性就 ...

  5. springboot集成mybatis及mybatis generator工具使用

    原文链接 前言mybatis是一个半自动化的orm框架,所谓半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernat ...

  6. mybatis :实现mybatis分页

    上一篇文章里已经讲到了mybatis与spring MVC的集成,并且做了一个列表展示,显示出所有article 列表,但没有用到分页,在实际的项目中,分页是肯定需要的.而且是物理分页,不是内存分页. ...

  7. springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用

    前言 mybatis是一个半自动化的orm框架,所谓半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完 ...

  8. 分享一套主流框架源码资料,征服阿里 P7 面试必备!

    2019年已经过完一半了, 我在这里为大家准备了一份资料,征服阿里 P7 面试必备! 希望这些资料可以帮助到大家,从一个码农进阶为一个优秀的程序员,也可以帮大家提升系统实战能力. 这些资料包括: 讲解 ...

  9. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

随机推荐

  1. Linux 生产主流版本

    CentOS 8 下载 https://mirrors.aliyun.com/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso L ...

  2. Cypress系列(69)- route() 命令详解

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 管理控制整个网络请求 重要注意事项 ...

  3. 【计算几何 05】Pick定理

    什么是Pick定理(皮克定理) 来自wiki的介绍: 给定顶点座标均是整点(或正方形格子点)的简单多边形,皮克定理说明了其面积 \(A\)和内部格点数目 \(i\) .边上格点数目 \(b\) 的关系 ...

  4. Git版本管理器操作步骤

    组长建立管理器: 第一步: 管理器网址:https://gitee.com/ 第二步:注册个人信息 第三步(添加项目) 第四步(兴建文件)注意:必须双层文件夹 第五步:打开VS开发工具 第六步:去把刚 ...

  5. 函数-深入JS笔记

    代码特点:高内聚,低耦合 耦合 存在执行多个相同作用代码时,这就叫耦合 if (1 > 0) { console.log('a'); } if (2 > 0) { console.log( ...

  6. java安全编码指南之:文件IO操作

    目录 简介 创建文件的时候指定合适的权限 注意检查文件操作的返回值 删除使用过后的临时文件 释放不再被使用的资源 注意Buffer的安全性 注意 Process 的标准输入输出 InputStream ...

  7. Luogu P3602 Koishi Loves Segments

    传送门 题解 既然是选取区间,没说顺序 肯定先排遍序 都是套路 那么按什么排序呢??? 为了方便处理 我们把区间按左端点从小到大排序 把关键点也按从小到大排序 假设当扫到 \(i\) 点时,i 点之前 ...

  8. 撸个反向代理,激活JRebel~

    持续原创输出,点击上方蓝字关注我 目录 前言 本地反向代理 服务器反向代理[个人推荐] IDEA安装JRebel并激活 服务器安装JRebel并激活 总结 前言 热部署相信大家都听说过,比如Sprin ...

  9. Nodejs在VSCode下代码智能提示

    在学习Nodejs的过程中发现vscode下默认没有提示,在网上也测试了传统的一些方法,都不好用,最后找到这个npm install --save-dev @types/node

  10. 腾讯云--对象存储cos绑定自定义域名

    1.登录腾讯云控制台,找到对象存储一栏 2.选择一个你想绑定域名的存储桶 3.进入你选择的存储桶,点击域名管理 4.选择自定义源站域名.在域名处填写你要设置的自定义域名,在源站类型处选择静态网站源站, ...