MyBatis从入门到精通(1):MyBatis入门
最近在知乎读书复习刘增辉老师所著的《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 语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在高速缓存中,后面再执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。
- MyBatis官方GitHub地址为:https://github.com/mybatis
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数据库。
- 如果使用本地数据库要改的格式: jdbc:mysql://localhost:3306/mybatis
- com.mysql.jdbc.Driver 会报错应该改成: com.mysql.cj.jdbc.Driver
- 按照上述改完之后报错显示没填写默认时区修正方法: <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入门的更多相关文章
- Android Studio2.0 教程从入门到精通Windows版 - 入门篇
http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...
- 2、ASP.NET MVC入门到精通——Entity Framework入门
实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- 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:这个里面有 ...
- Android开发 Android Studio2.0 教程从入门到精通Windows版 - 入门篇
第一篇 介绍了Android Studio开发环境以及Genymotion虚拟机安装方法,本节将给大家介绍如何使用Android Studio开发应用. 开发第一应用 可以开发属于自己的应用,是否有点 ...
- ASP.NET MVC4入门到精通系列目录汇总
序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...
- 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...
- Android Studio教程从入门到精通
最新2.0系列文章参考: Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android ...
- kibana从入门到精通-Kibana安装
作者其他ELK快速入门系列文章 Elasticsearch从入门到精通 logstash快速入门实战指南 简介 Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之 ...
- Android Studio2.0 教程从入门到精通Windows版
系列教程 Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android Studio2 ...
- ASP.NET MVC4入门到精通系列目录汇总(转)
序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...
随机推荐
- QML中实现setTimeout和setInterval
Qt的QML中,js未提供setTimeout和setInterval,可以通过下面的代码实现. Timer {id: timer} function setTimeout(cb,delayTime) ...
- Win10《芒果TV》更新v3.5.2星玥版:修复电视台直播异常,优化添加下载提示
Win10版<芒果TV>在更新夏至版之后,根据收集到的热心用户反馈,全平台同步更新星玥版v3.5.2,修复电视台直播异常,优化添加下载提示,进一步提升使用体验. Win10版<芒果T ...
- 腾讯QQ 8.9.3体验版发布 在线文档多端同步实时保存
感谢N软网的投递 腾讯体验中心迎来QQ8.9.3首个维护体验版发布,详细版本号为v8.9.3.21006,上一个体验版v8.9.2.20717发布于4月20日,时隔34天又迎来了更新.本次升级主要是在 ...
- UWP-MSDN文档分类
原文:UWP-MSDN文档分类 UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学 ...
- 使用Visual Studio Code创建第一个ASP.NET Core应用程序
全文翻译自:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 这篇文章将向你展示如何在Mac上写出你的第一个A ...
- 分布式文件系统之MooseFS----介绍
前一段公司因为nfs存储的问题,做了一段时间的调研.最终虽然有nfs高可用方案(nfs+drbd+heartbeat),但是在nfs故障切换的时候会出现 2 分钟左右的延时.这样子...就开始了对分布 ...
- 用友的BS专用浏览器方案
T+的这个BS中的B是自己的专用浏览器,这样有以下好处 1.避免了公用浏览器比如IE 里的其它插件的干扰2.避免了各个操作系统不同版本和不同种类浏览器的兼容问题,且只需要维护一个版本3.避免了共用浏览 ...
- qtablewidget qss加上这个,QHeaderView::section
qtablewidget qss加上这个,QHeaderView::section { color: white; padding: 4px; height:24px; b ...
- 基于Netty的四层和七层代理性能方面的一些压力测试
本文我们主要是想测试和研究几点: 基于Netty写的最简单的转发HTTP请求的程序,四层和七层性能的差异 三种代理线程模型性能的差异,下文会详细解释三种线程模型 池和非池化ByteBuffer性能的差 ...
- C语言实现Linux网络嗅探器
C语言实现Linux网络嗅探器 0x01 实验简介 网络嗅探器是拦截通过网络接口流入和流出的数据的程序.所以,如果你正在浏览的互联网,嗅探器以数据包的形式抓到它并且显示.在本实验中,我们用 C 语言实 ...