Mybatis入门

1、Mybatis简介

1.1、mybatis常用地址

​ mybatis参考网址:http://www.mybatis.org/mybatis-3/zh/index.html

​ Github源码地址:https://github.com/mybatis/mybatis-3

1.2、认识mybatis

​ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.3、与ORM差异比对

ORM一般指对象关系映射。对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。以Hibernate为例 其把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法 。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。

对比项 Mybatis Hibernate
市场占有率
适合的行业 互联网 电商 项目 传统的(ERP CRM OA)
性能 高 低
Sql灵活性 高 低
学习门槛 低 高
Sql配置文件 全局配置文件、映射文件 全局配置文件、映射文件
ORM 半自动化 完全的自动化
数据库无关性

2、实现一个Mybatis

2.1、编码流程

  1. 编写全局配置文件:SqlMapConfig.xml

  2. 映射文件:xxxMapper.xml

  3. 编写dao代码:xxxDao接口、xxxDaoImpl实现类

  4. POJO类

  5. 单元测试类

2.2、搭建maven工程

pom.xml

<?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>01-mybatis</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies>
</project>

2.3、编写SqlMapConfig.xml

properties

mysql.driver = com.mysql.jdbc.Driver
mysql.localhost.url = jdbc:mysql://127.0.0.1:3306/learning?setUnicode=true&characterEncoding=utf8
mysql.localhost.username = root
mysql.localhost.password = !QAZ1qaz

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties"></properties><environments default="major"><!-- default 表示默认的数据库连接 --><environment id="major"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${mysql.driver}"/><property name="url" value="${mysql.localhost.url}"/><property name="username" value="${mysql.localhost.username}"/><property name="password" value="${mysql.localhost.password}"/></dataSource></environment></environments><mappers><mapper resource="mappers/SysUserMapper.xml"></mapper></mappers>
</configuration>

相关属性简单的说明

属性 描述 说明
configuration 配置标签大类,所有配置声明 依赖DOCTYPE定义
properties 变量配置或引入,实现动态配置 可以使用 property进行 name和value进行声明。 也可以使用自带标签 resource和url进行外部引入
environments 配置当前工作的多个数据库环境 多个环境声明,default设置默认连接环境
environment 配置单个数据库环境 定义id标识唯一性
transactionManager 基于数据库的事物管理配置 type声明事物类型,包含枚举(type="[JDBC|MANAGED]")
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
dataSource 数据源连接配置 有三种内建的数据源类型,包含枚举(type="[UNPOOLED|POOLED|JNDI]") UNPOOLED >这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。
POOLED>这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。可以通过pool相关属性设置性能。
JNDI==>这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
property 数据源连接属性 常规属性声明 name和value定义,主要包含:
driver – 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。 url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。 defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)。查看 java.sql.Connection#setNetworkTimeout() 的 API 文档以获取更多信息 poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。 poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5) poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。 poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
mappers 配置SQLMapper文件路径。
mapper mapper子标签标记不同类型的资源映射 三种方式声明资源指向:
1、 2、
3、
package 包内的映射器接口实现全部注册为映射器

2.4、编写映射文件SysUserMapper.xml

Code

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sys"><select id="getSysUserList" resultType="com.fewin.dto.SysUser">select user_name as username,log_id as logId ,password from sys_user</select>
</mapper>

属性说明

标签 描述 说明
select 映射查询语句 id 唯一标识 paramType/parameterMap入参声明 resultType/resultMap 出参声明
insert 映射插入语句 同上
update 映射修改语句 同上
delete 映射删除语句 同上
resultMap 将查询结果与POJO进行映射 Id 唯一标识 Type指向实体类 标签每个字段定义 property/javaType 类定义 column/jdbcType数据库字段定义
sql 可被其它语句引用的可重用语句块 Id 唯一标识
cache 该命名空间的缓存配置 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
cache-ref 引用其它命名空间的缓存配置。 namespace 只会使用该命名空间的缓存进行缓存或刷新

2.5、编写接口Dao

Code

package dao;import com.fewin.dto.SysUser;import java.util.List;/*** @Author : xuwl* @Date : Created on 上午11:16 2021/4/14* @Package Name : dao* @Des : 系统用户查询接口* @Version: v0.1*/
public interface SysUserDAO {public List<SysUser> getSysUserList();}

2.6、编写实现类

Code

package dao.impl;import com.fewin.dto.SysUser;
import dao.SysUserDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;/*** @Author : xuwl* @Date : Created on 上午11:17 2021/4/14* @Package Name : dao.impl* @Des :* @Version: v0.1*/
public class SysUserDAOImpl implements SysUserDAO {private SqlSessionFactory sqlSessionFactory;public SysUserDAOImpl(SqlSessionFactory sqlSessionFactory){this.sqlSessionFactory = sqlSessionFactory;}public List<SysUser> getSysUserList() {SqlSession sqlSession = sqlSessionFactory.openSession();List<SysUser> sysUsers =sqlSession.selectList("sys.getSysUserList");return sysUsers;}
}

2.7、编写POJO

Code

package com.fewin.dto;/*** @Author : xuwl* @Date : Created on 上午11:06 2021/4/14* @Package Name : com.fewin* @Des : 用户信息相关* @Version: v0.1*/
public class SysUser {private String logId;private String username;private String password;public String getLogId() {return logId;}public void setLogId(String logId) {this.logId = logId;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "SysUser{" +"logId='" + logId + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

2.8、编写测试类

Code

package com.test.base;import com.sun.javaws.security.Resource;
import dao.SysUserDAO;
import dao.impl.SysUserDAOImpl;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;/*** @Author : xuwl* @Date : Created on 上午11:21 2021/4/14* @Package Name : com.test.base* @Des : 简单的测试* @Version: v0.1*/
public class A1Test {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws IOException {SqlSessionFactoryBuilder  builder = new SqlSessionFactoryBuilder();InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");sqlSessionFactory = builder.build(is);}@Testpublic void testSqlSession(){SysUserDAO sysUserDAO = new SysUserDAOImpl(sqlSessionFactory);System.out.println( sysUserDAO.getSysUserList());}
}

2.9、Java代码说明

使用 MyBatis 的主要 Java 接口就是 SqlSession。你可以通过这个接口来执行命令,获取映射器示例和管理事务。在介绍 SqlSession 接口之前,我们先来了解如何获取一个 SqlSession 实例。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的各种方法。而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或 Java 配置代码来创建 SqlSessionFactory。

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许你从不同的资源中创建一个 SqlSessionFactory 实例。

SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

SqlSessionFactory

SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择其中一个方法时,你需要考虑以下几点:

  • 事务处理:你希望在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)?(对很多数据库和/或 JDBC 驱动来说,等同于关闭事务支持)
  • 数据库连接:你希望 MyBatis 帮你从已配置的数据源获取连接,还是使用自己提供的连接?
  • 语句执行:你希望 MyBatis 复用 PreparedStatement 和/或批量更新语句(包括插入语句和删除语句)吗?

基于以上需求,有下列已重载的多个 openSession() 方法供使用。

SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();

默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:

  • 事务作用域将会开启(也就是不自动提交)。
  • 将由当前环境配置的 DataSource 实例中获取 Connection 对象。
  • 事务隔离级别将会使用驱动或数据源的默认设置。
  • 预处理语句不会被复用,也不会批量处理更新。

SqlSession

正如之前所提到的,SqlSession 在 MyBatis 中是非常强大的一个类。它包含了所有执行语句、提交或回滚事务以及获取映射器实例的方法。 SqlSession 类的方法超过了 20 个,为了方便理解,我们将它们分成几种组别。

语句执行方法

这些方法被用来执行定义在 SQL 映射 XML 文件中的 SELECT、INSERT、UPDATE 和 DELETE 语句。你可以通过名字快速了解它们的作用,每一方法都接受语句的 ID 以及参数对象,参数可以是原始类型(支持自动装箱或包装类)、JavaBean、POJO 或 Map。

         session.insert(...);session.update(...);session.delete(...);session.clearCache();session.close();session.commit();

Mybatis 01 入门相关推荐

  1. MyBatis 01 快速入门

    MyBatis 01 快速入门 文章目录 MyBatis 01 快速入门 一.学习目标 二.为什么需要框架技术 三.框架技术介绍 四.主流框架介绍 五.持久化与ORM 六.MyBatis简介 七.搭建 ...

  2. c++框架有哪些_Java Mybatis框架入门教程_v20200726

    MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...

  3. MyBatis学习总结(1)——MyBatis快速入门

    2019独角兽企业重金招聘Python工程师标准>>> 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所 ...

  4. MyBatis基础入门《九》ResultMap自动匹配

    MyBatis基础入门<九>ResultMap自动匹配 描述: Mybatis执行select查询后,使用ResultMap接收查询的数据结果. 实体类:TblClient.java 接口 ...

  5. mybatis的入门

    mybatis的环境搭建 第一步:创建maven工程并导入坐标         第二步:创建实体类和dao的接口         第三步:创建Mybatis的主配置文件                 ...

  6. Mybatis最入门---代码自动生成(generatorConfig.xml配置)

    [一步是咫尺,一步即天涯] 经过前文的叙述,各位看官是不是已经被Mybatis的强大功能给折服了呢?本文我们将介绍一个能够极大提升我们开发效率的插件:即代码自动生成.这里的代码自动生成包括,与数据库一 ...

  7. mybatis select count(*) 一直返回0 mysql_Mybatis教程1:MyBatis快速入门

    点击上方"Java技术前线",选择"置顶或者星标" 与你一起成长 一.Mybatis介绍 MyBatis是一个支持普通*SQL*查询,存储过程和高级映射的优秀持 ...

  8. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  9. Mybatis从入门到精通下篇

    Mybatis从入门到精通下篇: 输入类型: 输出类型: ResultMap: 动态sql: if标签: where标签: sql片段: foreach标签: 关联查询: 以订单作为主体: 一对一查询 ...

最新文章

  1. 关于Block的copy和循环引用的问题
  2. Android使用NDK---函数参数传递-基本类型和数组
  3. 面向对象重写(override)与重载(overload)区别
  4. 来电科技:基于Flink+Hologres的实时数仓演进之路
  5. 人工智能领域中声源定位的研究与发展------第一章 绪论
  6. 需求获取安排计划书_若想成功融资,商业计划书必须秀色可餐:餐饮业商业计划书模板...
  7. centos搭建git服务
  8. php实现开关效果代码,JavaScript实现开关效果的代码分享
  9. Java后端学习路线(校招前准备)
  10. oracle 同义词_详解Oracle视图V$、GV$、X$、V_$、GV_$之间的关系
  11. 101 基于TCP协议的socket套接字编程
  12. MS08067 第一期 “恶意代码分析”实战班 12.17号开班~
  13. 【iOS越狱开发】iOS越狱步骤2之SSH连接
  14. IE8中text-align:center偏左的解决办法
  15. 谷歌邮箱SMTP Password:SMTP授权码如何获得
  16. python opencv手势识别_OpenCV+Python3.5 简易手势识别的实现
  17. css权重是什么?css权重的介绍
  18. 信息安全初学者容易犯的三个毛病
  19. js class super 的用法
  20. threejs官方demo:clipping.html源码学习

热门文章

  1. socket多线程编程
  2. C语言小项目之“究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的”通讯录之*派小猩*作品
  3. uni-app实战之社区交友APP(6)动态页开发
  4. linux下curses库介绍
  5. Canvas 的clearRect()方法与beginPath()方法
  6. 2022小结和2023目标
  7. 中文网的搭建Futter开发环境
  8. markdown转义_Markdown语法示例
  9. javap命令分析java汇编指令
  10. 线性系统理论——状态观测器状态反馈