在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架
MyBatis由iBatis演化而来
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。
是一个基于SQL映射支持Java和·NET的持久层框架。
 
MyBatis是一个优秀的持久层框架,对JDBC操作数据库进行了封装,封装后的Mybatis使应用程序开发者只需要关注SQL本身
完全不需要再次花精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码(最初的Mybatis环境搭建只需要立项之初配置即可)
  • 要求通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来
  • 并通过java对象和statement中的sql进行映射生成最终执行的sql语句
  • mybatis框架执行sql并将结果映射成java对象并返回。
项目环境搭建好之后我们需要做的就是通过XML或者注解将要执行的SQL配置起来,也就是仅仅关注SQL
 
中文版文档
github地址
截止本文,最新版本为:mybatis-3.4.6
 
本文不涉及架构解析,首先演示了一个最简单的示例,然后以这个简单示例为基础,简单介绍了从外部看过去的Mybatis的呈现样子
帮助简单了解Mybatis

第一个Mybatis程序

1.新建项目

新建一个Java 项目
我取名为mybatis,并且新建了一个包 first

2.包获取与导入

基础的两个包
mybatis 和 mysql-connector(因为要用MYSQL) ,可以从官方下载  
https://dev.mysql.com/downloads/connector/j/
https://github.com/mybatis/mybatis-3/releases

3.数据库准备

本人已经有本地数据库,MYSQL,以student表为测试
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '默认姓名' COMMENT '姓名',
`age` int(11) DEFAULT '',
`sex` varchar(255) DEFAULT NULL,
`random` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据库信息为:
    String user = "root";
    String password = "123456";
    String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";

4.配置文件设置

src下新建config,然后新建xml文件名为mybatis-config.xml
内容从官方文档中复制:  http://www.mybatis.org/mybatis-3/zh/getting-started.html 
如下图所示官方示例的配置XML

5.SQL映射文件设置

src下新建mapper文件夹,创建xml文件名为myBatis.xml
内容从官方文档复制
 

6.调整配置文件

主要任务就是将数据库链接信息设置准确,并且将SQL映射文件的位置设置准确
 
对于url的设置需要注意“&”符号,在xml的配置文件中 要用  &   代替&
这是XML的语法本身的问题与mybatis没关系
 
五个在XML文档中预定义好的实体:
&lt; < 小于号
&gt; > 大于号
&amp; & 和
&apos; ' 单引号
&quot; " 双引号
实体必须以符号"&"开头,以符号";"结尾

7.创建实体类Student

8.修改myMapper.xml文件

需要调整namespace 设置resultType类型,需要设置使用的sql

9.测试

每一次的业务开发时,其实需要的仅仅是编写myMapper.xml文件,然后对其调用
环境配置等工作环境搭建之初就已经完成了

初识Mybatis

在第一个Mybatis程序示例中的代码几乎都是官方文档中的,根据官方的提示一步一步操作即可建立
 
不管是Mybatis还是JDBC还是其他,终归是需要连接数据库的,不管以何种形式,连接以后就是需要执行SQL,所以你还得准备好你想要执行的SQL
在Mybatis中,SQL以XML文件的形式设置 ,也就是上例中的myMapper.xml文件
所以在上例中的主配置文件mybatis-config.xml中我们配置了数据库的连接信息以及SQL XML文件的位置
每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为中心的,这一部分核心的配置文件就是提供给SqlSessionFactory实例的。
 
既然是操作数据库,很重要的一部分自然是SQL语句
mapper文件的格式是什么?对于一个SQL到底是查询还是delete?返回类型是什么?如下图所示,我们的类型是first.Student,SQL的内容又是什么?
此处不深入,但是很显然,对于Mybatis mapper映射文件的编写是很重要的一部分学习内容
 
有了核心配置文件就可以构建SqlSessionFactory实例,通过SqlSessionFactory实例就可以获取到SqlSession对象
SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似 JDBC生成的Connection对象的SqlSession对象
有了这个“Connection”对象之后才能进一步与数据库进行交流
这个“Connection”对象就可以根据我们mapper xml配置文件中设置的标识符,比如上例中的selectStudent的全名,以及参数执行SQL
如上图所示,我们从头简单的理一下Mybatis的基本流程
需要两个重要信息:数据库配置以及mapper文件位置
通过这两个核心信息可以生成SqlSessionFactory,通过SqlSessionFactory就可以创建SqlSession
SqlSession就可以根据名称标识符识别需要执行哪个文件里面的哪个SQL,比如上面就是执行mapper/myMapper.xml文件中,标识符为selectStudent的那一条
而执行该SQL以及周边的信息,都在文件中指定了,比如SQL内容是什么?返回类型又是什么?
 
通过配置文件到SqlSessionFactory实例的创建,完成了宏观上Mybatis的配置,两个主要任务:
  • 要从哪个数据库进行操作?
  • 要操作的SQL在哪里?
通过SqlSession完成了具体一次执行的任务
  • 执行哪个SQL?通过层级的命名标识符定位
  • 执行SQL的细节信息有哪些?SQL内容,参数内容,返回类型等
 
比如现在的中国好声音,形式变化了
所有的参赛选手在等待大厅内坐等,所有的人的姓名和演唱曲目形成了歌单,导师点歌的形式选择选手表演。
这个过程很类似Mybatis的处理
 
所有的选手形成了一个等待集合,这就相当于是一系列的mapper.xml文件,每个选手都有一个名字,这就相当于是一个文件(一个文件名,或者说一个命名空间)
但是重名的有很多,当导师叫名字 xxx 的时候,其实是在说“本次参加中国好声音,等待大厅的xxx”,但是不说大家也都知道,说王伟的时候,肯定不会是你身边坐着那个同事
但是程序不知道,这个“本次参加中国好声音,等待大厅的xxx”就相当于上例中namespace="mapper.myMapper"
 
整个节目组,导师,时间,场地等这些环境信息因素构成了整个的节目核心,这些零散的数据就是配置项目
构成的整体就相当于一个运行的机器,这就相当于SqlSessionFactory 
他作为核心知道整个节目组所有的信息,导师的信息等等,学员以及学员表演曲目也呈现在了导师面前
 
当一个导师进行点歌时,就类似SqlSession执行一次数据库操作
导师通过姓名,也就是我们上面说的“一个隐含的命名空间”,进行点歌,选择选手进行表演
这就相当于从等候大厅定位了一个Mapper文件,而他表演的那个曲目就好像是mapper文件中的ID,因为你唱了《止战之殇》,别人也可以再唱一次。
而针对于歌曲自身的更多信息,自然要看你接下来的表演了,是不是改变了?变化了哪些内容等等,这都属于某一个id对应的mapper文件中的具体内容信息。
 
Mybatis核心为配置以及映射
  • 配置信息搭建了Mybatis应用框架
  • 映射设置了一次执行的所需信息
Mybatis细化实现为核心的协调组装
核心信息包含了将要执行的目标数据库信息以及需要执行的SQL映射,有了这两部分信息如果是在Navicat等客户端的话就足够了,使用数据库信息连接,然后执行SQL
对于Mybatis也是足够了,不过代码中毕竟不是可以手动连接数据库,手动输入SQL,肉眼查看结果这么简单
所以还有很多的周边业务需要处理,比如配置文件如何表示?都有哪些属性需要配置?另外MyBatis是一个功能强大的工具,所以还提供了更多的细节调优参数以供设置
对于mapper文件的位置如何描述?
前面示例中使用了上面的形式,另外你也可以指定一个包,比如 下面的形式,那么这个包下面所有的xml都会被扫描,相当于你全部都罗列了出来
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
对于映射如何表述?可以使用XML也还可以使用注解的形式
他们又有哪些语法?每种形式的利弊是什么?字段属性都有哪些?
参数如何设置? 返回结果又是如何设置呢?等等
尽管这一系列的实现都很复杂,但是,仍旧是围绕着核心信息来的
 
所以对于Mybatis的学习,最开始应该了解整体的处理过程,了解各块
然后就是深入学习配置文件以及映射的设置配置
最后就是了解源码的架构
如果还有精力,最好的文档就是源码了
 

附录:完整代码

数据库
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '默认姓名' COMMENT '姓名',
`age` int(11) DEFAULT '',
`sex` varchar(255) DEFAULT NULL,
`random` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

项目结构

mybatis-config.xml

<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/sampledb?useUnicode=true&amp;characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/myMapper.xml"/>
</mappers>
</configuration>

myMapper.xml

<?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="mapper.myMapper">
<select id="selectStudent" resultType="first.Student">
select * from student where id = #{id}
</select>
</mapper>

Student

package first;

public class Student {

private Long id;

private String name;

private Integer age;

private String sex;

public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
final StringBuilder sb = new StringBuilder("Student{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append(", age=").append(age);
sb.append(", sex='").append(sex).append('\'');
sb.append('}');
return sb.toString();
}
}

测试代码

package first;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test { public static void main(String[] args) throws Exception { /*
* 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
* SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
* 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
* */
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
* 从 SqlSessionFactory 中获取 SqlSession
* */
SqlSession session = sqlSessionFactory.openSession();
try {
Student student = (Student) session.selectOne("mapper.myMapper.selectStudent", 2);
System.out.println(student);
} finally {
session.close();
}
}
}

接口应用

而对于SQL的执行更好的一种方式是使用接口,而不是直接通过字符串去定位需要执行的目标资源
借助于接口不是基于字符串常量的,就会更安全,而且使用接口逻辑概念更加清晰
 
在原有结构上增加一个接口和一个映射文件
 
MyMapper.java
package first;
public interface MyMapper {
Student selectStudent(Integer id);
}
myMapper2.xml
<?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="first.MyMapper">
<select id="selectStudent" resultType="first.Student">
select * from student where id = #{id}
</select>
</mapper>
从下图可以看得出来接口与XML映射的数据对照关系,XML映射文件的namespace需要与接口的全限定名对应
接口的方法名对应XML映射的id
接口方法返回类型为XML映射的ResultMap(resultType)
接口方法的参数对应XML映射的入参
新增加了一个XML映射文件,需要将路径添加到配置中
增加一个测试类
package first;

import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test2 { public static void main(String[] args) throws Exception {
/*
* 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
* SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
* 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
* */
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development"); /*
* 从 SqlSessionFactory 中获取 SqlSession
* */
SqlSession session = sqlSessionFactory.openSession();
try {
MyMapper mapper = session.getMapper(MyMapper.class);
Student student = mapper.selectStudent(2);
System.out.println(student);
} finally {
session.close();
}
} }
关键代码为
      MyMapper mapper = session.getMapper(MyMapper.class);
Student student = mapper.selectStudent(2);
结果与前面一致

第一个Mybatis程序示例 Mybatis简介(一)的更多相关文章

  1. 第一个Java程序示例——Hello World!【转】

    本文转载自: 跟随世界潮流,第一个Java程序输出“Hell World!”. 通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 --> 新建 --> Java项目”,弹 ...

  2. iOS 5 :一个UIPageViewController程序示例

    原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xco ...

  3. 我的第一个Java程序和Java简介

    public calss HelloWorld{ public static void main(String[] args){ System.out.println("Hello Worl ...

  4. 我的第一个Mybatis程序

    第一个Mybatis程序 在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于“i ...

  5. MyBatis(一):第一个MyBatis程序

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

  6. Mybatis入门及第一个Mybatis程序

    Mybatis笔记整理 所需要的基础知识 JDBC Mysql Java基础 Maven Junit 框架:是有配置文件的.最好的方式:看官网文档 1.简介 1.1.什么是MyBatis 简介 什么是 ...

  7. 创建一个简单MyBatis程序

    文章目录 MyBatis基础 MyBatis 简介 创建一个MyBatis程序 1. 创建Java项目 2. 加载MyBatis包 3. 编写POJO类和映射文件 4.创建mybatis-config ...

  8. 第一个MyBatis程序(博客初写者)

    第一个Mybatis程序 一.环境: 1.JDK1.8 2.MYSQL5.7 3.IDEA 4.MAVEN 3.63 二.Mybatis认识: 1.查看官方文档 https://mybatis.org ...

  9. MyBatis-02-第一个Mybatis程序

    2.第一个Mybatis程序 思路:搭建环境-->导入Mybatis-->编写代码-->测试! 2.1.搭建环境 搭建数据库 CREATE DATABASE `mybatis`; u ...

随机推荐

  1. History of program

    第一阶段:1950与1960年代 1.三个现代编程语言: (1)Fortran (1955),名称取自"FORmula TRANslator"(公式翻译器),由约翰·巴科斯等人所发 ...

  2. EventBus学习笔记(一)

    EventBus是Android和Java的发布/订阅事件总线 EventBus分三个步骤 1.定义事件 public static class MessageEvent { /* Additiona ...

  3. JavaScript / 本地存储

    cookie 首先让我们先了解一下,什么是cookie,cookie是浏览器提供的一种机制,他将document.cookie的接口提供给JavaScript使其可以对cookie进行控制,但cook ...

  4. 下载 mysql 数据库 的步骤 完整版

    1. 官网(点这里)上下载 2. 3. 4. 5. 6. 7.

  5. HBuilder git使用-分工合作

    1.初始项目的创建 创建好项目,在项目名上右键,Team->共享 完成后,就实现了本地仓库的建立,另外你要注意现在创建的项目所有文件变成了红色,Git Repositories视图列出了相应的本 ...

  6. QEMU KVM Libvirt手册(10): KVM的各种限制

    Overcommits KVM allows for both memory and disk space overcommit. However, hard errors resulting fro ...

  7. jenkins自动化工具使用教程

    自动化构建.测试.部署.代码检测越来越重要.主要有一下几点原因 1.  企业做大,项目变多,多端支持(web,h5,小程序等) 2.  微服务提倡高内聚低耦合,项目因拆分变多 3.  DevOps自动 ...

  8. Python学习宝典,Python400集让你成为从零基础到手写神经网络的Python大神

    当您学完Python,你学到了什么? 开发网站! 或者, 基础语法要点.函数.面向对象编程.调试.IO编程.进程与线程.正则表达式... 当你学完Python,你可以干什么? 当程序员! 或者, 手写 ...

  9. Vue(day2)

    一.过滤器 Vue中可以自定义过滤文本插值的过滤器.目前有两个地方可以使用: 插值文本{{ var }}中使用. 在v-bind中使用.( 2.1.0+ ) 用法:使用管道连接符 | 将需要过滤的文本 ...

  10. [Swift]LeetCode803. 打砖块 | Bricks Falling When Hit

    We have a grid of 1s and 0s; the 1s in a cell represent bricks.  A brick will not drop if and only i ...