最近在知乎读书复习刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正!知乎读书可以通过火狐浏览器另存页面为“网页,全部”的方式永久保存你借阅的电子书。

作为一个正在自学Java的自动化专业本科生,在学习和实践过程中”趟了不少雷“,“走了不少弯路”。这本书首先是适合刚学完JavaSE知识后入门,不足之处是未能在整合过程中集成spring框架测试。为此我会将更新的IDEA版源码给出。


第1章  Mybatis入门

1.1  Mybatis简介

MyBatis是一款支持自定义SQL查询、存储过程和高级映射的持久层框架。消除了几乎所有JDBC代码和参数的手动设置以及结果集的检索。

MyBatis可以使用XML或注解进行配置和映射。它通过将参数映射到配置的SQL最终形成执行的SQL语句,最后将执行的SQL的结果映射成Java对象返回。

与其他的ORM(对象关系映射)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联

MyBatis 支持声明式数据缓存( declarative data caching )。当一条 SQL 语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在高速缓存中,后面再执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。


1.2  创建Maven项目

Maven是一个项目构建和管理工具。目前市面上很多(2018年以前出版)陈旧的Java参考书还停留在讲如何使用Eclipse开发工具,包括本书。不过自2018年之后IT培训毕业班的双元视频都在介绍如何使用IntelliJ IDEA开发。

因此我们要新建个Maven项目,使用IntelliJ IDEA 2018.3.6 新建Maven项目的过程如下:

+ Create New Project

注:JDK1.8 和 Maven3.6.2是需要用户解压安装并配置好系统环境变量,相关教程请参考黑马双元视频课的介绍。

我们新建完的Maven项目结构如下图所示:

默认生成的pom.xml文件其内容如下所示。

(此处省略,工具自动生成->无需记忆)

首先,设置源代码编码方式为UTF-8,配置如下(推荐新手看:尚硅谷Java开发利器:IntelliJ IDEA的安装、配置与使用 ->编码格式如何在IDEA中配置成UTF-8)

    <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>

接着,设置编译源代码的JDK版本,为了增大兼容范围使用的是JDK 1.8,配置如下。

    <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version><!-- May, 2019 -->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>

还需要在配置文件pom.xml中添加一些依赖才能使接下来的工作顺利进行。

这里要添加最重要的Mybatis3依赖、接着还需要添加会用到的 MySql驱动、JUnit、Log4j的依赖。

注:数据库依赖的version要和自己电脑安装的实际情况一致->高版本的数据库驱动比如8.0.17兼容5.6.45数据库,但是url具体的一些连接规则有变化。(比如需要serverTimezone=Asia/Shanghai)

可以通过 http://search.maven.org/  或 http://mvnrepository.com/ 来查找依赖坐标。

junit 是一个单元测试框架,那么使用 Junit 能让我们快速的完成单元测试。下载地址:  https://www.mvnjar.com/junit/junit/4.12/detail.html

mysql是一个数据库,Navicat是数据库可视化操作工具,两者需要先自行安装后再进行本实验流程。下载地址:   https://www.mysql.com/downloads/

log4j是一个一款开源的日志框架,在项目中,我们一般会结合slf4j和log4j一起使用。                     下载地址:   http://logging.apache.org/log4j/1.2/download.html

slf4j是一个简单日记门面(simple logging Facade for java)可以为各种loging APIs提供一个简单统一的接口。  下载地址:    https://www.slf4j.org/download.html

最终的pom.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>cn.bjut.mybatis</groupId>
<artifactId>example</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<!--日志相关-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version><!-- May, 2019 -->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build> </project>

example 的 pom.xml

1.3  简单配置让MyBatis跑起来

1.3.1  准备数据库

注:首先需要安装mysql软件,并且记下root管理员的密码。然后再安装Navicat这个有图形界面的MySQL客户端工具,此处命令行代码的录入建议用文本编辑器 Notepad++。

       SQL语句学习,推荐看 《MYSQL必知必会》。

通过执行下面的SQL语句创建一个名为 testmybatis的数据库,然后再创建一个名为country的并插入一些简单的数据。

CREATE DATABASE testmybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- mysql语句单行注释使用 "-- " 注意,--后跟有一个空格 use testmybatis; -- 表头的字符串用` `括起来
CREATE TABLE `country`(
`id` int NOT NULL AUTO_INCREMENT ,
`countryname` varchar(255) NULL ,
`countrycode` varchar(255) NULL ,
PRIMARY KEY (`id`) ); -- 表的字符串内容用' '括起来,格式使用同MATLAB
insert country (`countryname`,`countrycode`)
values ('中国','CN'),('美国','US'),('俄罗斯','RU'),
('英国','GB'),('法国','FR');

首先点击【连接】弹出窗体 确定->创建了一个名为‘MyBatis从入门到精通’的【连接】->右键单击选择【打开连接】->右键菜单选择【命令列界面】->输入上述SQL语句并回车得到结果如下:

我们检查一下 数据库testmybatis 表country的内容如下图所示:

1.3.2  配置MyBatis

除XML方式外,在后面介绍MyBatis集成Spring会使用spring bean方式进行配置。

如果是SpringBoot开发构建微服务项目,还可以通过Java编码方式进行配置。

本节使用XML形式进行配置,首先在 src/main/resources 下面创建 mybatis-config.xml配置文件。

也可以叫做 SqlMapConfig.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> <settings>
<!--配置日志输出接口-->
<setting name="logImpl" value="LOG4J"/>
<!--其他 mybatis配置-->
<setting name=" mapUnderscoreToCamelCase" value="true"/>
</settings> <!--存储查询结果实体类包的全路径-->
<typeAliases>
<package name="cn.bjut.simple.model"/>
</typeAliases> <environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/testmybatis?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="cn/bjut/simple/mapper/CountryMapper.xml"/>
<mapper resource="cn/bjut/simple/mapper/UserMapper.xml"/>
<mapper resource="cn/bjut/simple/mapper/RoleMapper.xml"/>
<mapper resource="cn/bjut/simple/mapper/PrivilegeMapper.xml"/>
<mapper resource="cn/bjut/simple/mapper/UserRoleMapper.xml"/>
<mapper resource="cn/bjut/simple/mapper/RolePrivilegeMapper.xml"/> <!--<package name="cn.bjut.example.mapper"/>-->
</mappers> </configuration>
  • <settings>中的logImpl属性配置 指定使用LOG4J输出日志。
  • <typeAliases>在MyBatis中需要频繁用到储存查询结果的JavaBeans的全限定名称,为了方便使用,我们配置了 cn.bjut.simple.model包,这样后在使用类的时候不需要写包名的部分,只使用Country即可。
  • <environments>环境配置中主要配置了数据库连接,数据库的url为:     jdbc:mysql://localhost:3306/mybatis   使用的本机MySQL中的mybatis数据库。
      1. 如果使用本地数据库要改的格式:              jdbc:mysql://localhost:3306/mybatis
      2. com.mysql.jdbc.Driver 会报错应该改成:  com.mysql.cj.jdbc.Driver
      3. 按照上述改完之后报错显示没填写默认时区修正方法:    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai"/>
  • <mappers>中配置了一个 包含完整类路径的 CountryMapper.xml  ,这是一个MyBatis的SQL语句的映射配置文件。

1.3.3  创建实体类和Mapper.xml文件

 MyBatis是一个 结果映射框架 ,这里创建的实体类是一个数据值对象(Data Value Object)。在实际应用中,一个表一般会对应一个实体。

  • 在src/main/java 下创建一个基础的包 cn.bjut.simple ,在这个包下面再创建model包。
  • 根据数据库表 country ,在model包下创建实体类Country ,代码如下。
package cn.bjut.simple.model;

public class Country {
//实体类的成员变量
private Long id;
private String countryname;
private String countrycode;
//Alt+Insert 生成get/set方法
public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getCountryname() {
return countryname;
} public void setCountryname(String countryname) {
this.countryname = countryname;
} public String getCountrycode() {
return countrycode;
} public void setCountrycode(String countrycode) {
this.countrycode = countrycode;
} @Override
public String toString() {
return "Country{" +
"id=" + id +
", countryname='" + countryname + '\'' +
", countrycode='" + countrycode + '\'' +
'}';
}
}

public class Country

在  src/main/resources 目录下面创建  cn/bjut/simple/mapper  目录,再在该目录下面创建 CountryMapper.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="cn.bjut.simple.mapper.CountryMapper">
<select id="selectAll" resultType="Country">
select id,countryname,countrycode from country
</select> </mapper>

SQL定义在 CountryMapper.xml文件中,里面的配置作用如下。

  • <mapper>: XML的根元素,属性namespace定义了当前XML的命名空间,同时也是该映射文件对应接口文件的全限定名称
  • <select>元素: 我们所定义的一个  SELECT查询。
  • id属性: 定义了当前SELECT查询的 唯一 一个id。它就是接口中抽象方法的方法名
  • resultType: 定义了当前查询的返回值类型,此处就是指 实体类Country。(前面配置了实体类别名扫描包,否则要写成cn.bjut.simple.model.Country)

创建好实体和Mapper.xml后,接下来要有针对性地配置 Log4j ,让MyBatis在执行数据库操作时将有关信息输出到控制台。

1.3.4   配置Log4j以便查看MyBatis操作数据库的过程

在 src/main/resources 中添加 log4j.properties配置文件,输入如下内容。

#全局配置
log4j.rootLogger=ERROR, stdout #MyBatis 日志配置
log4j.logger.cn.bjut.simple.mapper=TRACE #控制台输出配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在MyBatis的日志实现中,所谓的包名实际上是XML配置中 namespace 属性值的一部分。由于namespace属性值必须和接口全限定类名相同(只有这样框架才能自动创建接口的实现类)。

MyBatis日志的 最低级别是 TRACE ,在这个日志级别下,会输出执行SQL过程中的详细信息,这个级别特别适合 开发时使用。

1.3.5  编写测试代码 让MyBatis跑起来

首先在 src/test/java 中创建 cn.bjut.simple.mapper 包 ,然后创建  CountryMapperTest1测试类 ,代码如下。

package cn.bjut.simple.mapper;

import java.io.IOException;
import java.io.Reader;
import java.util.List; import cn.bjut.simple.model.Country;
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 org.junit.BeforeClass;
import org.junit.Test; public class CountryMapperTest1 {
//静态成员方法只能访问静态成员变量
private static SqlSessionFactory sqlSessionFactory; @BeforeClass
public static void init(){
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException ignore) {
ignore.printStackTrace();
}
} @Test
public void testSelectAll(){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
List<Country> countryList = sqlSession.selectList("selectAll");
//直接调用在this类里定义的私有成员方法
this.printCountryList(countryList);
} finally {
sqlSession.close();
}
} private void printCountryList(List<Country> countryList){
for(Country country : countryList){
System.out.printf("%-4d%4s%4s\n",country.getId(), country.getCountryname(), country.getCountrycode());
}
}
}

public class CountryMapperTest1

调用这个类里定义的私有成员方法时,可以省略this关键字。

  • 通过 Resources 工具类 将mybatis-config,xml配置文件读入 Reader。
  • 再通过 SqlSessionFactoryBuilder 建造类使用Reader创建 SqlSessionFactory工厂对象。这个过程中会读取全部的Mapper.xml进行 具体 方法的解析。
  • 使用时通过 SqlSessionFactory工厂对象获取一个 SqlSession。
  • 通过SqlSession的 selectList 方法查找到  CountryMapper.xml中id='selectAll'的方法,执行SQL查询。
  • MyBatis底层使用 JDBC执行SQL,获取查询结果集ResultSet后,根据 resultType的配置,将结果映射为Country类型的集合,返回查询结果。

这样就得到了最后的查询结果 countryList ,简单将结果输出到控制台。最后一定不要忘记关闭 SqlSession 。否则导致数据库连接数过多,造成系统崩溃。

1. Junit 入门使用教程    https://www.cnblogs.com/ysocean/p/6889906.html#_label2

2. log4j 日志框架使用    https://blog.csdn.net/king_kgh/article/details/80430002

3. slf4j学习小结        https://imshare.iteye.com/blog/772770

4. MyBatis从入门到精通     https://mybatis3.github.io/downloads.html

=========================

end

MyBatis从入门到精通(1):MyBatis入门的更多相关文章

  1. Android Studio2.0 教程从入门到精通Windows版 - 入门篇

    http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...

  2. 2、ASP.NET MVC入门到精通——Entity Framework入门

    实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...

  3. 17、ASP.NET MVC入门到精通——Spring.net入门

    Spring.NET环境准备 pring.NET 1.3.2下载地址:http://down.51cto.com/data/861700 下载后解压 Spring.NET-1.3.2.7z:这个里面有 ...

  4. Android开发 Android Studio2.0 教程从入门到精通Windows版 - 入门篇

    第一篇 介绍了Android Studio开发环境以及Genymotion虚拟机安装方法,本节将给大家介绍如何使用Android Studio开发应用. 开发第一应用 可以开发属于自己的应用,是否有点 ...

  5. ASP.NET MVC4入门到精通系列目录汇总

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

  6. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  7. Android Studio教程从入门到精通

    最新2.0系列文章参考: Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android ...

  8. kibana从入门到精通-Kibana安装

    作者其他ELK快速入门系列文章 Elasticsearch从入门到精通 logstash快速入门实战指南 简介 Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之 ...

  9. Android Studio2.0 教程从入门到精通Windows版

    系列教程 Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android Studio2 ...

  10. ASP.NET MVC4入门到精通系列目录汇总(转)

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

随机推荐

  1. Asp +Js 无刷新分页

    Default.aspx代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...

  2. Windows RabbitMQ 安装

    操作系统 Win10  企业版 目标: 在win10上安装RabbitMQ 安装步骤 1.安装RabbitMQ需要先安装Erlang语言开发包,下载地址:http://www.erlang.org/d ...

  3. Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用

    一.Android平台编程方式:      1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现)      2.自从ndk r5发布以后, ...

  4. linux下视频传输测试

    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 在上一篇<ubuntu下基于qt+OpenCV控制摄像头>的基础上测试了视频传输. 环境:主 ...

  5. Oracle高级查询、事物、过程及函数

    一.SQL函数 1.分类:单行函数(日期.数值.转换.字符等),多行函数,也称为分组函数(max.min.avg.sum.row_number.rank等). 2.数值函数 abs(n):求数字n的绝 ...

  6. Mac上刚安装的WebStorm或PHPStorm遇到SVN版本太旧的问题

    Mac上刚安装的WebStorm或PHPStorm遇到SVN版本太旧的问题: URL: svn: E155021: This client is too old to work with the wo ...

  7. 关于web系统整体优化提速总结

    关于web系统整体优化提速总结 一.背景 随着公司业务的拓展,随之而来就是各种系统横向和纵向的增加,PV.UV也都随之增加,原有的系统架构和模式慢慢遇上了瓶颈,需要逐步的对系统从整体上进行改造升级,通 ...

  8. __file__、__name__、__dict__方法整理

    本文主要介绍__file__.__name__.__dict__三个方法的作用. #01 __file__:打印当前文件的位置. # import os # print(__file__) # 在py ...

  9. Protoc Buffer 优化传输大小的一个细节

    Protoc Buffer 是我们比较常用的序列化框架,Protocol Buffer 序列化后的占空间小,传输高效,可以在不同编程语言以及平台之间传输.今天这篇文章主要介绍 Protocol Buf ...

  10. Hadoop 学习之路(八)—— 基于ZooKeeper搭建Hadoop高可用集群

    一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求 ...