在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

中文版文档
http://www.mybatis.org/mybatis-3/zh/index.html
github地址
https://github.com/mybatis/mybatis-3
截止本文,最新版本为: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 '1',`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 '1',
`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简介(一)

转载于:https://www.cnblogs.com/noteless/p/10332784.html

第一个Mybatis程序示例 Mybatis简介(一)相关推荐

  1. 第一个Java程序示例——Hello World

    跟随世界潮流,第一个Java程序输出"Hell World!". 通过Eclipse运行程序 启动Eclipse,在菜单中选择"文件 –> 新建 –> Jav ...

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

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

  3. MyBits学习总结(1)--- MyBits简介、编写一个MyBatis程序

    MyBits学习总结(1)- MyBits简介.编写一个MyBatis程序 1. MyBits简介 什么是mybits? 在哪里找? mybatis原来不叫mybatis ,而叫 ibatis1.2: ...

  4. 【Mybatis 之应用篇】1_Mybatis简介、第一个Mybatis程序和增删改查在Mybatis中的使用方式

    文章目录 Mybatis 一.简介 1.持久化 2.持久层 3.为什么需要Mybatis? 二.第一个Mybatis程序 1.创建一个数据库 2.配置pom.xml文件 3.创建实体类 4.创建一个M ...

  5. 快速搭建第一个Mybatis程序

    一.简介 1.初识Mybatis 2.持久化 3.持久层 4.为什么需要Mybatis 二.第一个Mybatis程序 1.搭建环境 2.创建一个新模块 3.编写代码 4.Junit测试 三.可能遇到的 ...

  6. 第一个 Mybatis 程序(CURD操作)

    步骤 (1)搭建环境 1.搭建数据库 -- 创建数据库mybatis CREATE DATABASE `mybatis`; USE mybatis;-- 新建表 user CREATE TABLE ` ...

  7. mybatis学习笔记-02-第一个mybatis程序

    该视频为狂神说java视频配套笔记(博主自己手打223,日后做个参考223),b站连接:Mybatis最新完整教程IDEA版[通俗易懂]-02-第一个mybatis程序) 文章目录 2.第一个myba ...

  8. MyBatis学习笔记2 ——第一个MyBatis程序

    MyBatis学习笔记2 --第一个MyBatis程序 参考教程B站狂神https://www.bilibili.com/video/BV1NE411Q7Nx 环境搭建 建立一个mybatis数据库用 ...

  9. 【Mybatis】一个Mybatis程序

    思路:搭建环境-->导入mybatis-->编写代码-->测试 写在前面: 对象生命周期和依赖注入框架 依赖注入框架可以创建线程安全的.基于事务的 SqlSession 和映射器,并 ...

最新文章

  1. redis入门(03)redis的配置
  2. poj - 2243 Knight Moves
  3. 【转载】快速升职加薪的10个方法
  4. python and or 优先级
  5. idea 自动导入包和自动将没用的包去除
  6. clientHeight,offsetHeight,scrollHeight迷一样的三个值
  7. python学习-日志(logging的定义、参数、format、示例代码、创建logging对象、设置Handler)
  8. mysql noinstall 安装_mysql-noinstall安装指南
  9. EevExpress中XtraGrid常用方法
  10. UGUI滚动列表ScrollView使用注意点
  11. 开发里程碑计划_里程碑——让你轻松控制项目进度
  12. Linux 主机信息 总览
  13. AC_Dream 1216 G - Beautiful People
  14. 【LeetCode】剑指 Offer 63. 股票的最大利润
  15. el-tooltip位置不灵活_要提高步伐移动的灵活性,注意这5点,加以改正,步伐不再沉重...
  16. Homebrew命令具体解释
  17. visual studio 最新稳定版本_速来围观!Android Studio 4.0 稳定版发布了
  18. 二维随机变量期望公式_多维随机变量函数的分布
  19. 小米总参php面试题_小米2019年PHP工程师面试题和答案解析
  20. Java内部类(摘自Java就业培训教程)

热门文章

  1. 联手IBM布局云计算,王健林如何再造一个新万达?
  2. Java 7 Concurrency Cookbook – Javier Fernández González -前言
  3. 提取某个符合条件的字符串中的中文字符 例子
  4. 架构体系需要进一步研究探索的V2路线图
  5. 【指导]如何编译完整建立开发环境和编译Android 4.0.1 on Ubuntu 11.04 (64 bit)
  6. APC UPS网络管理卡 (AP9606/9617/9618/9619)的快速安装及配置指南
  7. IE9 CTP发布了?改名 IE Platform Preview?
  8. 《应试捷径-典型考题解析与考点贯通_系统分析师考试》复习重点提示
  9. BZOJ2055 80人环游世界
  10. RSocket:又一个REST的挑战者